2

我有一個線性整數程序,我想解決。我安裝了求解器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/),對吧? –

回答

6

我不知道如果這是你在找什麼,但是這是一種方式,我有被印在了我的一個腳本,一些變量。

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文檔後發現它:) –

4

這是你的腳本的修改版本,說明打印變量值的兩種不同的方式:(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