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

问题描述:

我有一个线性整数程序,我想解决。我安装了求解器glpk(感谢this answer)和pyomo。我写这样的代码:Pyomo:从Python代码访问解决方案

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) 

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

我有很多问题,我想解决使用相同的模型,但与a,b,c值不同。我想不同的值赋给abc,解决了模型,得到model.x[1]model.x[2]的解决方案,并有abcmodel.x[1]model.x[2]的列表。我读了documentation,但示例仅写入文件的解决方案,如results.yaml

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

感谢,

+0

迪有一段时间没有使用这个库。你不能只访问model.x.value吗?还有model.Objective.value。 – sascha

+0

@sascha,谢谢。我试着在model.x中为我:print(model.x [i] .value)',它工作。 –

+0

@sascha,如果你告诉我为什么我不应该使用这个库,它会很好。你的意思是[WinGLPK](http://winglpk.sourceforge.net/),对吧? –

我不知道如果这是你在找什么,但是这是一种方式,我有被印在了我的一个脚本,一些变量。

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) 
+0

谢谢。我把代码中的for循环放入我的变量中,它显示了我想访问的值! –

+1

我很确定这个循环遍历所有定义的变量......我不知道。几年之后,我在挖掘可怜的Pyomo文档后发现它:) –

这是你的脚本的修改版本,说明打印变量值的两种不同的方式:(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 

下面是生成的输出:

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