我有许多具有多个索引的变量,例如:
flow[i,j,k]
使用 Gurobi 变量名称:flow_1_1_1, ..., flow_1_2_3
等。
如果 Gurobi 模型对象是全局变量,则可以将解决方案值访问为flow[i,j,k].x
我的问题是有没有办法存储“流”对象并稍后加载它以重新优化?不幸的是,不支持pickle。
如果没有,我最好的选择是什么?
我有许多具有多个索引的变量,例如:
flow[i,j,k]
使用 Gurobi 变量名称:flow_1_1_1, ..., flow_1_2_3
等。
如果 Gurobi 模型对象是全局变量,则可以将解决方案值访问为flow[i,j,k].x
我的问题是有没有办法存储“流”对象并稍后加载它以重新优化?不幸的是,不支持pickle。
如果没有,我最好的选择是什么?
如果模型根本没有改变,您可以导出并稍后导入MST 文件
恐怕,通过创建自己的数据结构并将x
-values 与您的索引一起保存在那里,您通常会更好。在以后重新优化的情况下,您只需重新创建模型并设置.start
为您保存的值。
请注意,使用这种方法,您将始终丢失预求解、根松弛、根节点和分支定界信息。如果某些模型文件格式可能有助于更好的重新优化启动,我没有经验。
优化后可以恢复变量的值。然后使用这些进行重新优化,如下所示(sol_U 是字典,我们在其中恢复 varialbe vU 的数据)。
m.optimize()
status = m.status
if status == GRB.Status.OPTIMAL:
sol_V=m.getAttr('x', vV)
sol_U=m.getAttr('x', vU)
print('Optimization status was %d' % status)
print('The optimal objective is %g' % m.objVal)
for e in OpEq:
for bl in Blocs:
for t in Te:
if sol_U[bl,t, e] > 0.1:
print('u_(%s,%i,%s)-> %f' % (bl,t,e, sol_U[bl,t, e]))
sol_V = m.getAttr('x', vV)
for op in Op_:
for bl in BlocsR:
for t in Te:
if sol_V[bl,t,op] > 0.1:
print('v_(%s,%i,%i)-> %f' % (bl,t,op, sol_V[bl,t, op]))