创建二进制变量子集的具体指标nodepairs(边缘)
回答你好!
我一个相当新的Python / Gurobi,目前我对创建二进制struggeling决策变量的选择优势的路径规划问题,关于他们的索引。
我创建了一个小型exampe 6 x6网格细胞障碍自由和障碍。这个表格里的每一个细胞都被数字1到36。只有那些细胞障碍V免费保存在节点的集合。
我知道如果我想创建一组节点之间所有可能的边缘在V等于我会写点东西:
n = len (V)
x =模型。addVars (n, n, m, vtype = B, name = ' x ')
现在我的情况,以确保避免障碍,只有neigbouring障碍之间的连接/边缘自由细胞被允许和保存在一组边E -边缘的一个子集。
E = [[9], [9, 3], [3,4], [4 3], ....]
创建二进制变量的匹配指数允许node-pair边我试过这样的,但我不知道如果这是可能的。
艾凡:我的
e =模型。addVar(我[0],[1],vtype = B, name = ' e ' + str(我[0])+“_”+ str(我[1]))
我需要地址第一和第二索引(=第一和第二单元)binaryvariable每条边的其他约束。
我希望在一个可以理解的方式描述我的问题在我的问题上,我感谢任何帮助。
提前谢谢和最好的问候,
索菲娅
-
你好,索菲娅,
你可以以不同的方式构造边缘变量。一种方法是使用\ (\ texttt的{}\)循环和addVar方法,例如,
进口gurobipy全科医生
m = gp.Model(“测试”)
E = [[0, 1], [1,2], [2、3]]
e = {}
艾凡:我的
e[(我[0],[1]))= m。addVar (vtype = B, name = ' e % d % d %(我[0],[1]))
m.update ()
#访问变量通过e [0, 1], e [1、2], e (2、3)
打印(e [0,1])或通过使用addVars方法
进口gurobipy全科医生
m = gp.Model(“测试”)
E = [(0, 1), (1、2), (2, 3)]
e = m。addVars (E, vtype = B, name = ' E ')
m.update ()
打印(e [0,1])
打印(e [1,2])注意,在后一种情况下,条目\ (\ texttt {E} \)元组而不是列表的长度2。如果你不能改变你当前的代码来生成元组而不是列表的长度,你可以执行
E = [[0, 1], [1,2], [2、3]]
E =(元组(我)我的E)这将把每个列表\ (\ texttt{[0, 1],…} \)为元组\ (\ texttt {(0, 1),…} \)
最好的问候,
Jaromił0 -
嗨Jaromił,
谢谢你帮我解决一下这个问题。我构造变量首先建议使用for循环和它将正常工作。
现在我struggeling与另一个问题关于我的一个约束:
我创建了另一个变量v:
v = {}
因为我在边缘:
v((我[0],[1]))=模型。addVar (vtype =“我”、名称=“v”+ str(我0)+“_”+ str(我1)))Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) / v(边缘[ij]]的ij范围(len(边缘)))< = W * m - T) name = '约束5 ')
由于v(边缘[ij]]是一个决策变量不是一个常数我得到以下Gurobi错误:
“GurobiError:除数必须一个常数”
你能给我一个提示就如何处理/解决这个问题吗?再次感谢你的helpt
最好的问候,
索菲娅
0 -
你好,索菲娅,
知识库文章我怎么在Gurobi除以一个变量?你寻求的答案。
最好的问候,
Jaromił0 -
嗨Jaromił,
是的,谢谢你,这正是我在寻找的。我试图效仿你的推荐文章,但仍然犯了一些错误我自己似乎无法解决。
v = {}
因为我在边缘:
v((我[0],[1]))=模型。addVar (vtype =“我”、名称=“v”+ str(我0)+“_”+ str(我1)))
#介绍连续变量z
z =模型。addVar (vtype = ' C ' name = ' z ')
#添加约束v * z = 1
在ij范围(len(边缘)):
模型。addConstr (z * v(边缘[ij]] = = 1)
Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) / z ij范围(len(边缘)))< = W * m - T))我仍然得到相同的Gurobi错误因子必须是常数(这是有道理的,因为z是一个决策变量,就像v) ?我误解了这篇文章了吗?
再次很抱歉打扰. .
最好的问候,
索菲娅
0 -
你好,索菲娅,
注意,通过引入约束\ (z \ cdot v_ {ij} = 1 \)它认为\ (z = \压裂{1}{v_ {ij}} \)。因此,你的约束应该阅读
Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) * z为ij在范围(len(边缘)))< = W * m - T))
请注意,目前你介绍1辅助变量\ z(\)来代表所有部门由每个\ (v_ {ij} \)。然而,您应该引入一个辅助变量为每个变量\ \ (z \) (v_ {ij} \)
v = {}
z = {}
为我在边缘:
v (((0),我1])]=模型。addVar (vtype =“我”、名称=“v”+ str(我0)+“_”+ str(我1)))
z[(我[0),我1])]=模型。addVar (vtype =“我”、名称=“z”+ str(我0)+“_”+ str(我1)))
#添加约束v * z = 1
为ij在范围(len(边缘)):
模型。边addConstr (z [[ij]] * v(边缘[ij]] = =1)
Model.addConstr (gp。边quicksum (e [[ij]] * d (ij) * z (ij)为ij在范围(len(边缘)))< = W * m - T))如果变量\ \ texttt {e} \)和\ (\ texttt {d} \)都是优化变量,那么你将会引入额外的辅助变量处理三线性项,cf。我怎么模型在Gurobi多重线性方式?如果只有一个变量\ \ texttt {e} \)和\ (\ texttt {d} \)是一种优化变量,那么你很可能需要设置参数非凸= 2,因为你的模型是凸的。
Model.setParam(“凸”,2)
最好的问候,
Jaromił0 -
嗨Jaromił,
非常感谢你的帮助!我按你的建议实施必要的辅助变量,设置参数凸= 2。我现在工作很好!
谢谢你的时间!
最好的祝福,索菲娅
0
请登录留下你的评论。
评论
6个评论