Pyomo:Python代码的访问解决方案

ken*_*n_a 4 python optimization mathematical-optimization linear-programming pyomo

我有一个我想解决的线性整数程序.我安装了解算器glpk(感谢这个答案)和pyomo.我写了这样的代码:

from pyomo.environ import *
from pyomo.opt import SolverFactory

a = 370
b = 420
c = 2

model             = ConcreteModel()
model.x           = Var([1,2], domain=NonNegativeIntegers)
model.Objective   = Objective(expr = a * model.x[1] + b * model.x[2], sense=minimize)
model.Constraint1 = Constraint(expr = model.x[1] + model.x[2] == c)
# ... more constraints

opt = SolverFactory('glpk')

results = opt.solve(model)
Run Code Online (Sandbox Code Playgroud)

这产生了文件解决方案results.yaml.

我有很多问题,我想用同样的模式来解决,但不同的a,bc值.我想指定不同的值a,bc,解决了模型,得到的解决方案model.x[1]model.x[2],并有一上市a,b,c,model.x[1]model.x[2].我阅读文档,但示例只写文件的解决方案,如results.yaml.

有什么办法可以从代码中访问解决方案值吗?

谢谢,

cri*_*007 8

我不确定这是否是您正在寻找的,但这是我在我的一个脚本中打印一些变量的方式.

from pyomo.environ import *
from pyomo.opt import SolverFactory
from pyomo.core import Var

M = AbstractModel()
opt = SolverFactory('glpk')

# Vars, Params, Objective, Constraints....

instance = M.create_instance('input.dat') # reading in a datafile
results = opt.solve(instance, tee=True)
results.write()
instance.solutions.load_from(results)

for v in instance.component_objects(Var, active=True):
    print ("Variable",v)
    varobject = getattr(instance, str(v))
    for index in varobject:
        print ("   ",index, varobject[index].value)
Run Code Online (Sandbox Code Playgroud)


小智 8

这是脚本的修改版本,它说明了打印变量值的两种不同方式:(1)通过显式引用每个变量和(2)迭代模型中的所有变量.

# Pyomo v4.4.1
# Python 2.7
from pyomo.environ import *
from pyomo.opt import SolverFactory

a = 370
b = 420
c = 4

model             = ConcreteModel()
model.x           = Var([1,2], domain=Binary)
model.y           = Var([1,2], domain=Binary)
model.Objective   = Objective(expr = a * model.x[1] + b * model.x[2] + (a-b)*model.y[1] + (a+b)*model.y[2], sense=maximize)
model.Constraint1 = Constraint(expr = model.x[1] + model.x[2] + model.y[1] + model.y[2] <= c)

opt = SolverFactory('glpk')

results = opt.solve(model)

#
# Print values for each variable explicitly
#
print("Print values for each variable explicitly")
for i in model.x:
  print str(model.x[i]), model.x[i].value
for i in model.y:
  print str(model.y[i]), model.y[i].value
print("")

#
# Print values for all variables
#
print("Print values for all variables")
for v in model.component_data_objects(Var):
  print str(v), v.value
Run Code Online (Sandbox Code Playgroud)

这是产生的输出:

Print values for each variable explicitly
x[1] 1.0
x[2] 1.0
y[1] 0.0
y[2] 1.0

Print values for all variables
x[1] 1.0
x[2] 1.0
y[1] 0.0
y[2] 1.0
Run Code Online (Sandbox Code Playgroud)