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
值不同。我想不同的值赋给a
,b
和c
,解决了模型,得到model.x[1]
和model.x[2]
的解决方案,并有a
,b
,c
,model.x[1]
和model.x[2]
的列表。我读了documentation,但示例仅写入文件的解决方案,如results.yaml
。
有什么办法可以从代码访问解决方案的值?
感谢,
我不知道如果这是你在找什么,但是这是一种方式,我有被印在了我的一个脚本,一些变量。
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)
谢谢。我把代码中的for循环放入我的变量中,它显示了我想访问的值! –
我很确定这个循环遍历所有定义的变量......我不知道。几年之后,我在挖掘可怜的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
迪有一段时间没有使用这个库。你不能只访问model.x.value吗?还有model.Objective.value。 – sascha
@sascha,谢谢。我试着在model.x中为我:print(model.x [i] .value)',它工作。 –
@sascha,如果你告诉我为什么我不应该使用这个库,它会很好。你的意思是[WinGLPK](http://winglpk.sourceforge.net/),对吧? –