Gurobi Python:不能叫外面的决策变量”。addConstr”功能
回答你好,我使用Gurobi Python和试图解决一个独立优化问题如下所示:
在哪里间{n},是决策变量,R是一个函数的间{s、n}。
在这个问题上,因为的表达式R是非常复杂的(即。,很难实现R在一行model.addConstr (…))。因此,我们要定义R第一,然后构造约束。一个简化版本的代码,反映出我们的想法如下:
! pip安装gurobipy
进口gurobipy全科医生
从gurobipy进口伽马线暴
导入数学
进口numpy np
#创建一个新的模型
m = gp.Model (“mip1”)
#定义固定数量
C_exp_c = 111
S = 20 #总服务号码(VNF连锁店的数量)
N = 8 # VNF街区【注意,我们只考虑云中的时钟!】
形状= (S、N)
#创建变量
x_vars = m。addVars(形状,vtype =伽马线暴。二进制,name = ' X ')
#
R_c = np.zeros(形状)
R_e = np.zeros(形状)
#定义R
年代的范围(s):
n (n)范围:
R_c [s、n] = max (1 - x_vars (s、n), 0)
R_e [s、n] = max (1 - x_vars (s、n), 0)
:# < =约束方程(8 b)
m.addConstr(伽马线暴。quicksum (R_c范围(s、n) n (n)的年代范围(s))) < = C_exp_c)
#设置目标函数
目标=伽马线暴。quicksum (R_c [s、n] + R_e [s、n])的n (n)范围的年代范围(s))
m。ModelSense = GRB.MINIMIZE
m.setObjective(客观)
m.optimize ()
解决方案= m。getAttr (‘x’, x_vars)
当我们excecute,表现为有一个错误
我寻找许多Gurobi例子在Github,发现没有例子展示了他们做同样的事情——除了叫外面的决策变量”。addConstr”功能,他们都是直接调用决策变量的功能“.addConstr”。
第一个问题是:我可以叫外面的决策变量”。addConstr”功能显示在我的代码吗?
第二个是,如果是的,你能帮我找出我的代码有什么问题?因为我新的Python,也许有很多.....愚蠢的错误无论如何,非常感谢!
-
有两个问题与你的代码。
1。你不是创建一个20 x3变量x_vars而是要创建两个变量x[20]和[8]通过\ (\ texttt {x[20]} \)和\ (\ texttt {x [8]} \)。因此,您得到KeyError。通过构造x变量
x_vars = m。addVars (S、N, vtype =伽马线暴。二进制,name = ' X ')
解决了这个问题。
2。你的最大价值LinExpr对象。这不是定义。Gurobi有自己的max函数来处理这个问题。您可以使用addGenConstrMax方法制定你需要的表达式。为此,你需要为每个术语引入辅助变量\ (1-x_ {s、n} \),因为addGenConstrMax方法只接受单一优化变量。此外,您必须定义\ (\ texttt {R_c} \)作为优化变量。
最好的是,你甚至不需要马克斯表达式,因为x变量是二进制。这意味着
\ [R_c = \马克斯{1 - x, 0} = 1 - x。\]
我不完全理解你为什么需要\ (\ texttt {R_c} \)和\ (\ texttt {R_e} \),因为相同的值相等。
那么什么是应该为你工作
x_vars = m。addVars (S、N, vtype =伽马线暴。二进制,name = ' X ')
R_c = m。addVars (S、N, vtype =伽马线暴。二进制,name = ' R_c ')
年代的范围(s):
n (n)范围:
m。addConstr (R_c (s、n) = = 1 - x_vars [s、n], name = " max_ % d % d % (s、n))
[…]最好的问候,
Jaromił0 -
亲爱的Jaromił,
非常感谢你为你的温暖和专业的回答,它帮助很多!
回答你的问题:事实上,R_c和R_e是不同的函数对x。这个项目是一个简化版,通过编写R_c很抱歉混淆了你和R_e相同的形式由于我们的疏忽。但是我相信这并不影响你的回复的准确性,你说我们想问的问题,非常感谢!
我们将根据你的建议修改我们的Python程序。如果我们遇到一个新问题,我们将设法解决它自己。如果它不工作,我们将继续跟进下这个问题。
最后,这个论坛真是太棒了!谢谢你提供这样一个平台!
最好的,
汉
0
请登录留下你的评论。
评论
2的评论