2017-10-01 1 views
1

이 최적화 문제의 솔루션을 저장하려고 시도했지만 Nonetype입니다. 그러므로 내가 float로 변환 할하지만 난이 오류 얻을 :'Nonetype'에서 부동으로 변환 할 수없는 이유는 무엇입니까?

float() argument must be a string or a number, not 'NoneType'

그것은 드문 인해 results.write() 1 개에서 인쇄 된 솔루션에이 6.57142857142857입니다.

from coopr . pyomo import * 
from pyomo.opt import SolverFactory 

def create_model(N=[], M=[], c={}, a={}, b={}): 
    model = ConcreteModel() 
    model.x = Var(N, within=NonNegativeReals) 
    model.obj = Objective(expr=sum(c[i]*model.x[i] for i in N)) 
    def con_rule(model, m): 
     return sum(a[i,m]*model.x[i] for i in N) >= b[m] 
    model.con = Constraint(M, rule=con_rule) 
    return model 
model = create_model(N = [1,2], M = [1,2], c = {1:1, 2:2}, 
a = {(1,1):5, (2,1):4, (1,2):7, (2,2):3}, 
b = {1:11, 2:46}) 

#model.pprint() 

instance = model.create() 
#instance.pprint() 
opt = SolverFactory("glpk") 
results = opt.solve(instance, load_solutions=False) 
results.write() 

x_1=float(model.x[1].value) 
#x_2=float(model.x[2].value or 0) 

답변

0

먼저 model.create()은 Pyomo의 최신 버전에서 더 이상 사용되지 않습니다. 나는 그것이 지금 model.create_instance로 개명된다고 생각한다.

두 번째로 과 다른 개체 인 model.create()에서 반환 된 instance 개체를 해결할 수 있습니다. 따라서 instance 개체의 변수 속성에 .value 속성에 액세스해야하며 model 개체는 액세스해야합니다.

셋째, ConcreteModel부터 시작합니다. 즉, model.create() (또는 model.create_instance())으로 전화 할 필요가 없습니다. 이것은 단순히 이미 "구체적인 인스턴스"인 불필요한 복사본을 만드는 것입니다. 즉, model 객체를 해석기에 전송하면 .value에 액세스하는 코드는 그대로 작동합니다.

AbstractModel에서 시작하는 경우에만 create_instance 메서드가 필요합니다.이 메서드는 보통 .dat 파일의 이름을 전달합니다.

관련 문제