我正在尝试保存此优化问题的解决方案,但它们是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)
答案 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
文件的名称传递给它。