在 PuLP 中,我需要一种方法来将决策变量设置为等于决策变量列表中的最大值

问题描述 投票:0回答:1

我一直在使用 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)
max pulp linear-optimization
1个回答
0
投票

所以根本的挑战是你想要强制执行:

any(z[s]) ==> y=1

大概:

no(z[s]) ==> y=0

其中

y
z
都是布尔变量

我认为你可以通过两个限制来做到这一点:

y >= sum(z[s]) / |s|

y <= sum(z[s]) * |s|
© www.soinside.com 2019 - 2024. All rights reserved.