2

Ich habe ein lineares Ganzzahl-Programm, das ich lösen möchte. Ich installierte Löser glpk (danke an this answer) und pyomo. Ich schrieb Code wie folgt:Pyomo: Access Solution Von Python Code

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) 

Diese Lösung results.yaml Datei erzeugt.

Ich habe viele Probleme, die ich lösen möchte mit dem gleichen Modell, aber mit anderen a, b und c Werte. Ich will verschiedene Werte a, b und c, lösen das Modell zuordnen, erhalten Lösung von model.x[1] und model.x[2], und haben eine Liste von a, b, c, model.x[1] und model.x[2]. Ich lese documentation, aber Beispiele schreiben nur Lösungen in Datei wie results.yaml.

Gibt es eine Möglichkeit, auf Lösungswerte aus Code zuzugreifen?

Danke,

+0

Di nicht verwenden diese lib in eine Weile. Können Sie nicht einfach auf model.x.value zugreifen? Und auch model.Objective.value. – sascha

+0

@sascha, danke. Ich habe 'für i in model.x: print (model.x [i] .value)' versucht, und es hat funktioniert. –

+0

@sascha, auch wäre es nett wenn du mir sagst warum ich diese lib nicht benutzen soll. Du meinst [WinGLPK] (http://winglpk.sourceforge.net/), richtig? –

Antwort

6

Ich bin mir nicht sicher, ob dies ist, was Sie suchen, aber das ist eine Art und Weise, die ich habe einige Variablen in einem meiner Skripte gedruckt.

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

danke. Ich habe die for-Schleife in meinen Code mit meinen Variablen eingefügt, und es zeigt Werte, auf die ich zugreifen wollte! –

+1

Ich bin mir ziemlich sicher, dass dies alle definierten Variablen umläuft ... Ich weiß nicht. Ich habe es gefunden, nachdem ich vor ein paar Jahren in der armen Pyomo Dokumentation gegraben habe :) –

4

Hier ist eine modifizierte Version des Skripts, die zwei verschiedene Arten von Drucken variabler Werte zeigt: (1), indem Sie explizit jede Variable Referenzierung und (2) durch alle Variablen im Modell iterieren.

# 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 

Hier ist die Ausgabe generiert:

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