【问题标题】:Conditional constraints in PuLP纸浆中的条件约束
【发布时间】:2021-08-05 23:06:29
【问题描述】:

我有以下使用 PuLP 的优化模型。

neighborhood_lst = [
    'btm_bin',
    'hsr_bin',
    'jayanagar_bin',
    'koramangala_5th_block_bin',
    'jp_nagar_bin',
    'marathahalli_bin',
    'whitefield_bin',
    'indiranagar_bin',
    'bannerghatta_road_bin',
    'bellandur_bin'
]

cuisines_lst = [
    'north_indian_bin',
    'chinese_bin',
    'south_indian_bin',
    'biryani_bin',
    'fast_food_bin',
    'street_food_bin',
    'seafood_bin',
    'continental_bin',
    'andhra_bin',
    'beverages_bin',
    'italian_bin',
    'other_bin'
]

# set up model
model = LpProblem(name='restaurant_cuisine_neigborhood', sense=LpMaximize)

# set variables
x = {i: LpVariable(name=f"x{i}", lowBound=0, cat='Binary') for i in cuisines_lst}
y = {i: LpVariable(name=f"y{i}", lowBound=0, cat='Binary') for i in neighborhood_lst}

# Set objective
model += 0.0267 * x['north_indian_bin'] + 0.0243 * x['chinese_bin'] + 0.0088 * x['south_indian_bin'] + \
         0.0108 * x['biryani_bin'] + 0.0084 * x['fast_food_bin'] + 0.0022 * x['street_food_bin'] + \
         0.0030 * x['seafood_bin'] + 0.0038 * x['continental_bin'] + 0.0036 * x['andhra_bin'] + \
         0.0030 * x['beverages_bin'] + 0.0176 * x['other_bin'] + \
         0.0011 * y['btm_bin'] + 0.0018 * y['hsr_bin'] + 0.0041 * y['jayanagar_bin'] + \
         0.0039 * y['koramangala_5th_block_bin'] + 0.0005 * y['jp_nagar_bin'] + 0.0094 * y['marathahalli_bin'] + \
         0.0012 * y['whitefield_bin'] + 0.0004 * y['indiranagar_bin'] + 0.0108 * y['bannerghatta_road_bin'] + \
         0.0085 * y['bellandur_bin']

我的以下约束有问题。

# Add constraints
model += (lpSum(y.values()) == 1, 'neighborhood_selection')
model += (lpSum(x.values()) <= 4, 'cuisine_selection')

# If Indiranagar then must NOT be andhra food
model += (y['indiranagar_bin'] + x['andhra_bin'] <= 1, 'andhra_not_in_indirangar')

# If Koramangala 5th Block, then one must be Italian
model += (y['koramangala_5th_block_bin'] <= x['italian_bin'], '5th_block_italian')
# If Whitefield, then one must be Other
model += (y['whitefield_bin'] <= x['other_bin'], 'whitefield_other')

如果我只使用andhra_not_in_indirangar 约束,模型将运行并确定最佳解决方案。当我尝试添加5th_block_italianwhitefield_other 约束时,模型将无法运行。

status = model.solve()

这会返回一个PulpSolverError: PuLP: Error while executing glpsol.exe

我对最后两个约束的逻辑是y 变量将小于或等于x 变量。所以如果y 是1,那么x 也是,但是x 可以是1,而y 不必是1。

我已经阅读过 Big M 方法,但不确定它是否适用于我的模型。

【问题讨论】:

  • 看起来像一个错误。可以尝试 CBC 作为求解器(这是现在的默认值)。

标签: python linear-programming pulp


【解决方案1】:

似乎求解器(或者可能是 PuLP 的接口)不喜欢以数字开头的约束名称。将有问题的约束替换为:

model += (y['koramangala_5th_block_bin'] &lt;= x['italian_bin'], 'fifth_block_italian')

或任何其他避免前导数字的变体都可以解决问题。

我不知道这个错误的实际来源 - 但在过去使用重复的变量名时也看到过类似的错误。我就该问题提出了GitHub issue,现在似乎已提交修复它,因此可能值得您在 github 页面上提交有关此约束命名问题的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多