这篇文章的灵感来自于栈交流如果else语句在线性规划如何写?
条件语句,如如果\ (x > y \)然后\ (z = w_1 \)其他的\ \ (z = w_2 \), (x, y, z, w_1 w_2 \)都是优化变量,可以实现在Gurobi通过引进一个辅助二进制变量\ (b \)和使用指标约束。
因为Gurobi指标约束需要一个二进制变量的指标变量,我们的模型如果由执行\ \ (x > y \) (x > y \ rightarrow b = 1 \)和\ b (x \ \ rightarrow leq y = 0 \)。二进制变量\ (b \)因此表明如果\ (x > y \)是真的\ ((b = 1) \)或假\ ((b = 0) \)。这个逻辑模型,可以使用以下一大- \ (M \)方法:
\[开始\{对齐}
x & \组y + \ε- M \ cdot \ \ (1 b)
x & \ leq y + M \ \ \ cdot b
b \ \ {0,1 \},
结束\{对齐}\]
\(\ \ε> 0)代表一个小正容差模拟\(> \)约束。请注意Gurobi和其他连接器不支持严格不等式约束(\(< \)或\手机万博登录 (> \))。在许多应用程序中,\ \ε\)宽容可以删除,但是你应该为您的特定用例评估是否设置\ \ε= 0 \是可行的。大- \ (M \)值应该选择尽可能严格避免数值问题。设置\ (M \)等于最大的上界\ (x \)和\ (y \)(如果存在)经常工作得很好。
使用上面的公式,我们可以使用变量\ (b \)来制定指标约束
\[开始\{对齐}
b = 1 & \ rightarrow z = w_1 \ \
b = 0 & \ rightarrow z = w_2。
结束\{对齐}\]
Python代码建模Gurobi的条件语句可能类似于以下几点:
进口gurobipy全科医生
从gurobipy进口伽马线暴
#创建一个新的模型
m = gp.Model(“测试”)
#创建变量
x = m。addVar(乌兰巴托= 10,vtype =伽马线暴。连续的,name = " x ")
y = m。addVar(乌兰巴托= 5,vtype =伽马线暴。连续的,name = " y ")
z = m.addVar (vtype =伽马线暴。连续的,name = " z ")
w1 = m.addVar (vtype =伽马线暴。连续的,name = " w1 ")
w2 = m.addVar (vtype =伽马线暴。连续的,name = " w2 ")
b = m.addVar (vtype =伽马线暴。二进制,name = " b ")
#常量
每股收益= 0.0001
M = 10 + eps #最小的x和y界限
#模型如果x > y, b = 1, b = 0
m。addConstr (x > = y + eps - M * (1 - b), name = " bigM_constr1 ")
m。addConstr (x < = y + M * b, name = " bigM_constr2 ")
#添加指标约束
m。addConstr ((b = = 1) > > (z = = w1)、name = " indicator_constr1 ")
m。addConstr ((b = = 0) > > (z = = w2)、name = " indicator_constr2 ")
#构建模型的其余部分
#……
注意,上述想法还如果某些条款\ (x \) \ (y \) \ (z \) \ (w_1 \)和\ (w_2 \)常量值。
评论
0评论
文章是关闭了评论。