我怎样才能Gurobi python变量的值等待模型更新
回答我开发一个二次规划模型使用Gurobi python API。包含函数的目标制定与决策变量有关,如obj = f (x) + g (y),我需要值的决策变量函数f (), g ()。这就是为什么输入函数f (), g()应该是可接受的格式列表或数组类型功能而Gurobi模型使用tupledict结构,不适合一般的计算。我怎样才能值变量等待模型更新如下?
:x [0]
:< gurobi.Var等待模型更新>
- - - - - - - - - - - - - - - - - - - - - - - psedo代码- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
进口gurobipy全科医生
从gurobipy进口伽马线暴
def func ():
mdl = gp.Model ()
x = mdl。addVars(100磅= 0,vtype = GRB.INTEGER)
因为我在范围(100):
值[我]= x[我]# TypeError:浮动()的参数必须是一个字符串或一个数字,不是“Var”
值[我]= x[我]。X # AttributeError:指数范围的属性“X”
obj = func(值)
mdl。setObjective (obj GRB.MINIMIZE)
-
同样的问题也被张贴在StackOverflow:我怎样才能得到变量的值等待模型更新Gurobi python -堆栈溢出
0 -
首先,我很抱歉之前的调查不足。
关键是值提取的变量在优化之前,不能捕获与X属性和很难搜索更新方法。
我现在简单的代码如下,但真正的二次函数由cal_module()示例要复杂得多。换句话说,结合二次函数是对象像MIP - > MIQP +域函数。因此在优化步骤,等决策变量x, y需要转换为numpy或熊猫作为二次输入配方包含在目标函数。这就是为什么我问如何得到变量的值是不确定在每一个模型迭代?
- - - - - - - - - - - - - - - - - - - - - - -样品- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -进口numpy np
进口gurobipy全科医生
从gurobipy进口伽马线暴def cal_module (x, y):
m = np.array ([])
因为我在np.arange (len (x) 1):
r = x[我]* * 2 + y (i + 1) * * 3
m = np。追加(m, r)
返回米mdl = gp.Model ()
x = mdl。addVars(20磅= 5,乌兰巴托= 5,vtype = GRB.INTEGER)
y = mdl。addVars(20磅= 5,乌兰巴托= 5,vtype = GRB.INTEGER)mdl。addConstrs (x [t] + y [t] < = 3 t的范围(20))
pre_x pre_y = [], []
因为我在范围(20):
pre_x = x[我]。value_method或任何其他方法
pre_y = y[我]。value_method或任何其他方法
obj = gp。quicksum (2 * x [t] + [t] t的范围(20))+ cal_module (pre_x pre_y)
mdl。setObjective (obj GRB.MINIMIZE)mdl.optimize ()
0 -
如果我理解正确的话,你想构建一个二次表达式,将其添加到目标函数,优化它。你可以而且应该直接使用的变量对象来实现这一点。下面的代码应该做你有什么想法
进口gurobipy全科医生
从gurobipy进口伽马线暴
def cal_module (x, y,模型):
qExpr = gp.QuadExpr (0)
因为我在范围(len (x) 1):
z =模型。addVar(磅= 0,乌兰巴托= 25日vtype =伽马线暴。整数,name = " aux_y_sqr_ % d % (i + 1))
模型。addConstr (z = = y (i + 1) * y (i + 1) name = " aux_y_sqr_constr_ % d % (i + 1))
qExpr。添加(x[我]* * 2 + y (i + 1) * z)
返回qExpr
mdl = gp.Model ()
x = mdl。addVars(20磅= 5,乌兰巴托= 5,vtype =伽马线暴。整数,name = " x ")
y = mdl。addVars(20磅= 5,乌兰巴托= 5,vtype =伽马线暴。整数,name = " y ")
mdl。addConstrs (x [t] + y [t] < = 3 t的范围(20))
obj = gp。quicksum (2 * x [t] + [t] t的范围(20))+ cal_module (x, y, mdl)
mdl。setObjective (obj GRB.MINIMIZE)
mdl.setParam(“凸”,2)
mdl.write (“myLP.lp”)
mdl.optimize ()请注意,该变量tupledicts\ (\ texttt {x, y} \)直接传递到\ (\ texttt {def_module} \)功能。
自从Gurobi不支持立方\ (y ^ 3 \),你必须添加一个辅助变量模型立方项二次和双线性项\ (z = y ^ 2 \) \ (y \ cdot z \),看到的我怎么模型在Gurobi多重线性方式?
你的模型是凸的,因此,参数非凸必须设置。我使用了吗写方法写一个LP文件,这使得分析是否确实是一个正确的模型,更容易。
最好的问候,
Jaromił0 -
嗨Jaromił,
你的评论非常有助于理解Gurobi的解决流程。多谢。
当涉及到二次表达式,我的问题是非线性(不是二次),代表一个物理公式和看起来几乎不可能转换成模型使用gurobi库的基础变量,因为它的复杂性。
作为一个结果,我想抓住任何属性的变量之前解决更新()方法。我寻找的属性是一个状态变量包含0(零)或其他价值,但是我找不到这种属性gurobi文档中,//m.a-toku.com/manbet体育手机客户端documentation/9.5/refman/attributes.html秒:属性。
挖出这个问题,我想知道我可以知道变量在优化的价值是零(0)。
最好的问候,
Namkyoung李
0 -
嗨Namkyoung李,
如果我理解正确你的评论,你正在试图创建模型条件语句,即。类似,如果变量\ (x = 0 \)然后使用约束\(\)否则使用约束\ (b \)。这是正确的吗?
如果是的,那么这篇文章我怎么在Gurobi模型条件语句?应该是你寻找的东西。
如果不是,请精心远一点吗?可能提供的一个小例子你系模型。最好的问候,
Jaromił0 -
嗨Jaromił,
我很欣赏你的延续的帮助。
这是另一个示例代码,其中包含一个错误关于指标约束。
我追求构建配方与输入变量是否有值0或正整数。最好的问候,
Nam-kyoung
进口gurobipy全科医生
从gurobipy进口伽马线暴
def tmp_f (x):
k = np。阵列([1我的范围(10)))
j在x:
k [j] = 0
返回总和((k + 1) * * 2)
m = gp.Model (qp)
x = m。addVars(10磅= 0,乌兰巴托= 10,vtype =伽马线暴。整数,name = " x ")
y = m。addVars(10磅= 0,乌兰巴托= 10,vtype =伽马线暴。整数,name = " y ")
b = m。addVars (10, vtype =伽马线暴。二进制,name = " b ")
#基本约束
m。addConstrs (x[我]+ 2 * y[我]< = 21我的范围(10))
m。addConstrs (x[我]- y[我]> = 0我的范围(10))
m.addConstr (x.sum (“*”) = = 9)
#大m方法
每股收益= 0.000001
M = 100 +每股收益
#模型如果x > 0 b = 1, b = 0
m。addConstrs (x[我]> =每股收益- M * (1 - b[我])我的范围(10))
m。addConstrs (x[我]< = M * b[我]我的范围(10))
#指标约束
z =[] #←←←初始化输入nonlinear-type配方
t = 1
因为我在范围(10):
m。addConstr ((b[我]= = 1)> > (t = =))
z.append (t)
#目标函数
obj = gp。quicksum (x[我]+ y[我]我的范围(10))
m。setObjective (obj + tmp_f (z), GRB.MAXIMIZE)
m.optimize ()0 -
这个线程是仍在继续指标约束包含常量值。
0
请登录留下你的评论。
评论
8的评论