在混合整数线性规划中结合简单的if语句

时间:2018-10-30 22:44:34

标签: python optimization linear-programming pulp

我正在努力解决一个包含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语句约束?

1 个答案:

答案 0 :(得分:1)

我相信这是正确的方法:

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

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

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