2

해결하려는 선형 정수 프로그램이 있습니다. 솔버 glpk (덕분에 this answer)와 pyomo를 설치했습니다. 다음과 같은 코드를 작성했습니다 :Pyomo : Access Solution from 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, bc 값을 사용하여 해결하고 싶은 많은 문제가 있습니다. 나는 a, bc에 다른 값을 할당 모델을 해결 model.x[1]model.x[2]의 용액을 제조하고, a, b, c, model.x[1]model.x[2]의 목록을 갖고 싶어. documentation을 읽었지만 예제는 results.yaml과 같은 파일에만 해결책을 씁니다.

코드에서 솔루션 값에 액세스 할 수있는 방법이 있습니까? 이 당신을 위해 무엇을 찾고 있습니다,하지만 내가 몇 가지 변수가 내 스크립트 중 하나에 인쇄되는이 방법의 경우

덕분에,

+0

디는 한 동안이 lib 디렉토리를 사용하지 마십시오. model.x.value에 액세스 할 수 없습니까? 또한 모델입니다. 목표. 값. – sascha

+0

@ sascha, 감사합니다. 나는'for model.x : print (model.x [i] .value)'를 시도해 보았습니다. –

+0

@ sascha, 왜 내가이 lib를 사용하면 안되는지 말해 주면 좋을 것입니다. 당신은 [WinGLPK] (http://winglpk.sourceforge.net/)을 의미합니까? –

답변

6

잘 모르겠어요. (1) 명시 적으로 각 변수 (2) 모델의 모든 변수를 통해 반복에 의해를 참조하여 :

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

여기에 변수 값을 인쇄하는 두 가지 방법을 보여 스크립트의 수정 된 버전입니다.

# 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