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

Incorporating simple if statement in mixed integer linear programming

我正在努力解决包含 if 语句的混合整数规划问题。使用 PuLP 时,我一直得到 "infeasible" 作为解决状态,

我的决策变量只是一个二进制指标列表(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'))

objective函数就是容器是否被选中(取值为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 语句约束?

我认为这是正确的方法:

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

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

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