2017-05-05 18 views
0

Pyomo 5.1.1에서 추상 모델을 만든 다음 Python 내에서 값을 채우려고합니다 (예 : AMPL 파일 사용 안 함). 나는 기본적으로 Pyomo documentation example을 따르지만, "Constant objective detected"를 얻고 있습니다.추상 pyomo 모델에서 콘크리트 모델을 인스턴스화

import pyomo.environ as oe 
model = oe.AbstractModel() 
model.I = oe.Set() 
model.J = oe.Set() 
model.a = oe.Param(model.I,model.J) 
model.b = oe.Param(model.I) 
model.c = oe.Param(model.J) 
model.x = oe.Var(model.J,domain=oe.NonNegativeReals) 
def obj_expression(model): 
    return oe.summation(model.c,model.x) 

model.OBJ = oe.Objective(rule=obj_expression) 
def ax_constraint_rule(model,i): 
    return sum(model.a[i,j]*model.x[j] for j in model.J) >= model.b[i] 

model.AxbConstraint = oe.Constraint(model.I,rule=ax_constraint_rule) 

그리고, 나는 실제 값 나는 다음과 같은 오류 얻을

aa = np.array([[1,2,1,4],[5,2,2,4]]) 
bb = np.array([2,4]) 
cc = np.array([1,2,4,2]) 

cmodel = model.create_instance() 
cmodel.a.values = aa 
cmodel.b.values = bb 
cmodel.c.values = cc 

opt = oe.SolverFactory("glpk") 
results = opt.solve(cmodel) 

으로이 모델을 초기화하려고 :

WARNING:pyomo.core:Constant objective detected, replacing with a placeholder to prevent solver failure. WARNING:pyomo.core:Empty constraint block written in LP format - solver may error WARNING: Constant objective detected, replacing with a placeholder to prevent solver failure. WARNING: Empty constraint block written in LP format - solver may error

을 분명하게 나는 방법에 뭔가 문제가있다 cmodel 초기화하지만 파이썬 내에서 초기화를 설명하는 설명서를 찾을 수 없습니다.

답변

1

AMPL .dat 파일에서 데이터를로드 할 필요가없는 경우 ConcreteModel부터 시작하는 것이 좋습니다. 이 경우, 변경할 필요가있는 경우를 제외 해, Param 오브젝트에 데이터를 격납 할 필요는 없습니다. 구성 요소를 인덱싱하기위한 Set 객체의 생성은 여전히 ​​권장됩니다. 그렇지 않으면 모델에 추가하는 구성 요소와 충돌 할 수있는 이름으로 Set 객체가 암시 적으로 만들어집니다.

ConcreteModel 정의를 데이터를 입력으로 사용하는 함수 안에 넣으면 본질적으로 AbstractModelcreate_instance 메서드에서 제공하는 기능을 복제 할 수 있습니다. 예를 들어,

import pyomo.environ as oe 

def build_model(a, b, c): 
    m = len(b) 
    n = len(c) 
    model = oe.ConcreteModel() 
    model.I = oe.Set(initialize=range(m)) 
    model.J = oe.Set(initialize=range(n)) 
    model.x = oe.Var(model.J,domain=oe.NonNegativeReals) 

    model.OBJ = oe.Objective(expr= oe.summation(c,model.x)) 
    def ax_constraint_rule(model,i): 
     arow = a[i] 
     return sum(arow[j]*model.x[j] for j in model.J) >= b[i] 
    model.AxbConstraint = oe.Constraint(model.I,rule=ax_constraint_rule) 
    return model 

# Note that there is no need to call create_instance on a ConcreteModel 
m = build_model(...) 
opt = oe.SolverFactory("glpk") 
results = opt.solve(m) 

또한, 먼저 Pyomo 식을 구축 할를 사용하기 전에 array.tolist() 방법을 사용하여 파이썬 목록에 대한 모든 NumPy와 배열을 변환하는 것이 좋습니다. Pyomo는 아직 표현 시스템에 내장 된 배열 연산 개념을 가지고 있지 않으며, Numpy 배열을 사용하는 방식은 일 수 있습니다. 단지 Python 목록을 사용하는 것보다 느립니다.