为什么我不能从 '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
文件的名称传递给它。
我正在尝试保存此优化问题的解,但它们是 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
文件的名称传递给它。