我一直在使用 Gurobi 及其 Python API (gurobipy) 来解决混合整数规划的线性优化问题。由于各种原因,该组织决定停止 Gurobi 许可,因此我使用 PuLP 重建了我的模型,并使用开源求解器测试了可行性。
但是,对于与 2 个决策变量
y
(布尔值)和 z
(布尔值)相关的约束之一,我真的找不到可以执行与“max_() 相同操作的替代方法” ”来自 gurobipy。基本上,如果当前迭代中有任何 y
等于 1,我想将变量 z
限制为 1,gurobipy.max_() 可以完成确切的工作。
从更大的角度来看,
y
是布尔变量之一,可以打开或关闭整数变量x
,因此x的公式化总和可以进入最小化的最终目标。如上所述,y
受z
调节。请参阅下面的代码片段:
import gurobipy as gp
for d in days_list:
model.addConstrs(
(y[c, d] == gp.max_([z[s, d] for s in df1.loc[c]]))
for c in df2
)
model.addConstrs(
gp.quicksum(x[s, d] for s in df1.loc[c])
<= 32 * y[c, d]
for c in df2
)
希望有更多LP经验的人可以帮助找到合适的替代方案,以便我可以用其他东西代替
gp.max_()
!
我已经尝试了以下方法,但显然,它给出了错误,因为无法对 LpVariables 进行操作,因此 Python max() 或 sum() 也不起作用。
for day in days_list:
for c in df2:
for s in df1.loc[c]:
if plp.lpSum(z[s, day].value for s in df1.loc[c]) > 0:
problem.addConstraint(y[c, day]==1)
else:
problem.addConstraint(y[c, day]==0)
所以根本的挑战是你想要强制执行:
any(z[s]) ==> y=1
大概:
no(z[s]) ==> y=0
其中
y
和 z
都是布尔变量
我认为你可以通过两个限制来做到这一点:
y >= sum(z[s]) / |s|
y <= sum(z[s]) * |s|