为什么我不能转换为'Nonetype'漂浮?

时间:2017-10-01 10:41:13

标签: nonetype pyomo

我正在尝试保存此优化问题的解决方案,但它们是Nonetype。因此,我想将它们转换为float,但我收到此错误:

  

float()参数必须是字符串或数字,而不是' NoneType'

由于results.write() x1的打印解决方案是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)

1 个答案:

答案 0 :(得分:0)

首先,在最新版本的Pyomo上不推荐使用model.create()。我相信它现在已重命名为model.create_instance

其次,您正在解决从instance返回的model.create()对象,该对象与model不同。因此,您应该访问.value对象上的变量的instance属性,而不是model对象。

第三,您从ConcreteModel开始,这意味着无需拨打model.create()(或model.create_instance())。这只是创建一个已经是“具体实例”的不必要副本。即,您可以将model对象发送给解算器,访问.value的代码将按原样运行。

仅当您从create_instance开始时才需要AbstractModel方法,然后您通常会将某个.dat文件的名称传递给它。