问题
I have a linear integer programme I want to solve. I installed solver glpk (thanks to this answer) and pyomo. I wrote code like this:
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)
This produces solution to file results.yaml
.
I have many problems I want to solve using the same model but with different a
, b
, and c
values. I want to assign different values to a
, b
, and c
, solve the model, obtain solution of model.x[1]
and model.x[2]
, and have a listing of a
, b
, c
, model.x[1]
and model.x[2]
. I read documentation but examples only write solutions to file such as results.yaml
.
Is there any way I can access to solution values from code?
Thanks,
回答1:
I'm not sure if this is what you are looking for, but this is a way that I have some variables being printed in one of my scripts.
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)
回答2:
Here's a modified version of your script that illustrates two different ways of printing variable values: (1) by explicitly referencing each variable and (2) by iterating over all variables in the model.
# 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
Here's the output generated:
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
回答3:
I found the pyomoio
module in the urbs project. It extracts sets, parameters, variables, and so on, and the returns them in pandas
objects, which are very convenient for visualization in jupyter notebooks.
I build a simple model
model = ConcreteModel()
model.act = Set(initialize=list('IJK'))
model.goods = Set(initialize=list('ijk'))
u0 = {}
u0['i', 'J'] = 2.
u0['k', 'I'] = .3
model.U0 = Param(model.goods, model.act, initialize=u0, default=0)
I can then read it in a pandas DataFrame, with all the labels set appropriately.
import pyomoio as po
u_df = po.get_entity(model, 'U0').unstack()
print(u_df)
# act I J K
# goods
# i 0.0 2.0 0.0
# j 0.0 0.0 0.0
# k 0.3 0.0 0.0
来源:https://stackoverflow.com/questions/38700214/pyomo-access-solution-from-python-code