我有以下一段Python代码来定义一堆“ obj”:
obj1=LinExpr(sumOFw_plusPLUSw_minus)
obj2=LinExpr(quicksum(epsilon[s] for s in N))
其中“ sumOFw_plusPLUSw_minus”是一个表达式,“ epsilon”是一个Var类型。
我想使其参数化,以便以后可以添加更多目标表达式。为了应用该方法,我尝试在循环内准备一个字符串,并使用此字符串按如下所示调用上述表达式,但在第5行得到了“ GurobiError:无法将参数转换为表达式”。
for j in range(1,2):
for i in range(1,num_obj):
valid_obj='obj'+str(i)
if j==1:
m.setObjective(valid_obj, GRB.MINIMIZE)
else:
m.setObjective(valid_obj, GRB.MAXIMIZE)
m.update()
m.optimize()
问题在于'obj'+ str [i]只是一个Python字符串,而不是一个对象。Gurobi不知道如何将Objective值设置为字符串,它正在寻找目标表达式。
要基于参数获取不同的目标函数,可以声明“目标成本”并将其存储在列表中。例如:
cost =[]
cost[0] = LinExpr(sumOFw_plusPLUSw_minus)
cost[1] = LinExpr(quicksum(epsilon[s] for s in N))
...
现在,您可以通过根据索引的值在成本列表中调用适当的元素来设置“目标” i
。(您甚至可以添加不同的元素,只要它们是有效且线性的即可。)
valid_obj = cost[i]
m.setObjective(valid_obj, GRB.MINIMIZE)
只要列表中的每个元素都是模型中决策变量的有效线性表达式,它将起作用m
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句