为什么我不能从 'Nonetype' 转换为浮点数?

Why cannot I convert from 'Nonetype' to float?

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

float() argument must be a string or a number, not '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)

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

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

第三,你是从ConcreteModel开始的,这意味着不需要调用model.create()(或model.create_instance())。这只是在已经是 "concrete instance" 的情况下创建一个不必要的副本。也就是说,您可以将 model 对象发送到求解器,访问 .value 的代码将按原样工作。

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