【问题标题】:Incorporating simple if statement in mixed integer linear programming在混合整数线性规划中结合简单的 if 语句
【发布时间】:2018-10-31 22:23:35
【问题描述】:

我正在努力解决一个包含 if 语句的混合整数编程问题。在使用 PuLP 时,我一直得到“不可行”作为解决状态,

我的决策变量只是一个二进制指标列表(0 或 1),对应于一系列容器以及它们是否被使用(0 = 未使用,1 = 使用)。

# Instantiate problem to be solved
prob = LpProblem('Test Problem', LpMaximize)

b = []
for id in container_names:
    max_count = 1
    b.append(LpVariable('b_{}'.format(id),
                    lowBound=0,
                    upBound=1,
                    cat='Integer'))

目标函数只是容器是否被选中(取值为 1)乘以预先分配给每个容器的点

prob += lpSum([i * j for i, j in zip(points, b)]), 'Total Points'

第一个约束如下。每个容器中都有一个项目组合。我们不能超过任何这些物品的库存。 'container_item_dict' 是一个字典,其中键是容器 ID,值是字典,其中键是库存 ID,值是容器中的计数。当我只用这个约束运行时,算法就可以工作并且我得到了很好的结果。

for j in inventory_names:
    prob += lpSum([b[i]*container_item_dict[container_names[i]][j] for i in container_index]) <= inventory_in_stock_dict[j]

我正在尝试添加一个额外的约束,但无法弄清楚。我有另一个名为“must_haves”的二进制指标列表。 “must_haves”与“container_names”长度相同,每个值对应一个容器。如果“must_haves”的元素为 1,则必须在解决方案中选择该容器。如果“must_haves”的元素为0,则对应的容器可以选择也可以不选择。

如何编写这个 if 语句约束?

【问题讨论】:

    标签: python optimization linear-programming pulp


    【解决方案1】:

    我相信这是正确的做法:

    for i in container_index:
        prob += b[i] >= must_haves[i]
    

    这样,如果 must_haves 等于 1,则必须选择容器。如果 must_haves 等于 0,则容器可以选择也可以不选择。

    我最初是这样做的,但遇到了错误。我现在认为这段代码是正确的,它返回“不可行”,因为考虑到我拥有的容器物品的数量,它根本不可行。

    【讨论】:

    • 假设 must_haves 是数据(不是决策变量),您可能希望跳过 must_haves[i]==0 的情况
    • 是的,您在那里所做的似乎是正确的。如果它回答了您的问题,请不要忘记用打勾标记您的回答!另外仅供参考,您可以指定二进制变量类型 - cat='Binary' 而不是具有 [0,1] 边界的整数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多