网络流量优化(Gurobi)

时间:2018-08-05 17:50:26

标签: python optimization graph mathematical-optimization gurobi

我正在尝试使用python和gurobi优化器来建模和解决优化问题。这是我第一次使用优化器解决问题。首先,我编写了一个非常大的问题,并逐步添加了所有变量和约束。但是那有问题。所以我一次又一次地将问题简化为小版本。毕竟,现在我有一个非常简单的代码:

from gurobipy import *

m = Model('net')
x = m.addVar(name = 'x')
y = m.addVar(name = 'y')
m.addConstr(x >= 0 and x <= 9000, name = 'flow0')
m.addConstr(y >= 0 and y <= 1000, name = 'flow1')
m.addConstr(y + x == 9990, name = 'total_flow')

m.setObjective(x *(4 + 0.6*(x/9000)) + (y * (4 + 0.6*(y/1000))), GRB.MINIMIZE)

solo = m.optimize()

if solo:
    print ('find!!!')

这实际上是一个简单的网络流问题(对于具有两个节点和两个边的图形),我想计算每个边(x和y)的流。显然,每个边缘的流量不能为负,并且不能大于边缘容量(x(capa)= 9000,y(capa)= 1000)。第三个约束条件显示了两边的总流量限制。最后,目标函数必须使方程最小化。

现在我对这段代码有疑问:

  1. 为什么“ solo”是(无)?
  2. 如何打印解决方案变量。我使用了getAttr()函数。但我找不到变量名称(x,y或flow0,flow1)的作用

3.Ive得到了这个结果。但我真的不明白! 例如:它在每次迭代中计算的剂量是多少?!

提前发送Tnx,请原谅我的简单问题...

image of results!!!!

1 个答案:

答案 0 :(得分:0)

optimize()方法始终返回None,请参见print(help(m.optimize))。调用此方法后,模型的状态存储在m.status中,而解决方案值存储在每个变量的.X属性中(假定模型已求解到最佳状态)。要访问它们,您可以使用m.getVars()

# your model ...
m.optimize()

if m.status = GRB.OPTIMAL:
    for var in m.getVars():
        print(var.VarName, var.X)

您发布的日志显示障碍方法(也称为内点方法)的每次迭代的目标值。有关详细概述,请参见here