我正在努力解决一个包含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语句约束?
答案 0 :(得分:1)
我相信这是正确的方法:
for i in container_index:
prob += b[i] >= must_haves[i]
这样,如果must_haves等于1,则必须选择容器。如果must_haves等于0,则可以选择容器。
我最初是这样做的,但遇到了错误。我现在认为这段代码是正确的,它返回“不可行”,因为考虑到我拥有的集装箱数量,这根本是不可行的。