Pyomo:"No value for uninitialized NumericValue object",试图评估二进制约束



使用 Pyomo 和 GLPK 4.65,我正在尝试优化几家工厂对几种产品的生产。

优化中要降低的成本之一与以下事实有关:如果必须启动工厂,则起始成本为 100 美元。

# I define the Binary Constraint to know if the factory was producing, by seeing a 'factories_list', and by using 'big M'
model.factory_was_producing = Var(model.T, model.i, model.k, domain=Binary)
def factory_was_producing_rule(model, T, i, k):
return factories_list[0, i, k] <= model.factory_was_producing[T,i,k] * 1000000
model.factory_was_producing_constraint = Constraint(model.T, model.i, model.k, rule=factory_was_producing_rule)
# I try to define the Starting costs, by multiplying the $100 by the binary constraing 'factory_was_producing_constraint'
def f_Factory_Starting_Costs(model, T, i, k):
return 100 * value(model.factory_was_producing_constraint[T,i,k])
model.Factory_Starting_Costs = Param(model.T, model.i, model.k, rule=f_Factory_Starting_Costs)

但是,我收到以下错误:

ValueError: No value for uninitialized NumericValue object factory_was_producing[1,Boston,Product_A]

"factory_was_producing"约束似乎返回了严格的值:

factory_was_producing : Size=24, Index=factory_was_producing_index
Key                             : Lower : Value : Upper : Fixed : Stale : Domain
(1, 'Boston', 'Product_A') :     0 :   0.0 :     1 : False : False : Binary
(1, 'Florida', 'Product_A') :     0 :   1.0 :     1 : False : False : Binary
(1, 'New York', 'Product_A') :     0 :   0.0 :     1 : False : False : Binary

我一直在浏览这个常见错误的解决方案,处理"非此即彼"约束和条件约束,但我无法理解它们以用于我的问题。

您正在弹出该错误,因为在此语句中:

# I try to define the Starting costs, by multiplying the $100 by the binary constraing 'factory_was_producing_constraint'
def f_Factory_Starting_Costs(model, T, i, k):
return 100 * value(model.factory_was_producing_constraint[T,i,k])
model.Factory_Starting_Costs = Param(model.T, model.i, model.k, rule=f_Factory_Starting_Costs)

您在创建模型期间使用了value(),此时变量值未知*。 也。。。 您不能将其转换为模型内固定值的Param。 我不确定你想在那里完成什么。 如果在上一个约束中捕获启动成本的值,则可以在目标函数中使用它。 在伪代码中:

obj = <some cost summation stuff> + model.start_factory[...] * 100

我确实认为您可能对时间索引有更多的思考要做。 :) 是否有可能在每个 tilmestep 中独立"启动"工厂,或者只是不按时间索引该变量......?

*是的,您可以初始化值并在此处获取一些内容,但这只是一个快照和不正确的结构。

相关内容

  • 没有找到相关文章

最新更新