【问题标题】:Pyomo: Value Error: No value for uninitialized NumericValue object fo[1,1_C1]Pyomo:值错误:未初始化的 NumericValue 对象 fo[1,1_C1] 没有值
【发布时间】:2018-06-26 10:06:34
【问题描述】:

此链接https://github.com/amianAA/ALNS 包含一个 ALNS 算法,该算法旨在优化 MINLP 铁路网络模型(应用于马德里的网络)。虽然 cmets 是用西班牙语写的,但我相信这不会有太大问题,因为谷歌翻译会在这方面有所帮助。当我运行 ALNP.py 文件时,它运行良好,直到 madridALNS.py 文件中的代码的这个阶段,其中整个模型是在 Pyomo 的帮助下开发的:

 #1 // output flow from each origin "wo" equal to demand of the destination origin pair "w"
 def resd1_rule(model,w):
    wo=model.tabla[w,'wo']
    expr=0
    for l in model.L:
        if model.b[wo,l]==1:
            expr += model.fo[w,l]
        if expr!=0:
            return (expr + model.h[w]==model.tabla[w,'g']*model.factorg)
        else:
            return Constraint.Skip
 model.restr1 = Constraint(model.W,rule=resd1_rule)

madridALNS.dat 文件包含模型填充数据。我立即遇到的错误是:

 ERROR: evaluating expression: No value for uninitialized NumericValue object
fo[1,1_C1]
    (expression: fo[1,1_C1] + fo[1,2_C2] + fo[1,7_C10] + fo[1,3_C3] +
    fo[1,4_C4] + fo[1,6_C8])
ERROR: evaluating object as numeric value: fo[1,1_C1] + fo[1,2_C2] +
fo[1,7_C10] + fo[1,3_C3] + fo[1,4_C4] + fo[1,6_C8]
    (object: <class 'pyomo.core.kernel.expr_coopr3._SumExpression'>)
No value for uninitialized NumericValue object fo[1,1_C1]
ERROR: evaluating expression: No value for uninitialized NumericValue object
fo[1,1_C1]
    (expression: fo[1,1_C1] + fo[1,2_C2] + fo[1,7_C10] + fo[1,3_C3] +
    fo[1,4_C4] + fo[1,6_C8]  ==  0.0)
ERROR: Rule failed when generating expression for constraint restr1 with index
1: ValueError: No value for uninitialized NumericValue object fo[1,1_C1]
ERROR: Constructing component 'restr1' from data=None failed:
    ValueError: No value for uninitialized NumericValue object fo[1,1_C1]
Traceback (most recent call last):
File "ALNS.py", line 16, in <module>
instance = model.create_instance('madridALNS.dat')
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/base/PyomoModel.py", line 723, in create_instance
profile_memory=profile_memory )
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/base/PyomoModel.py", line 806, in load
profile_memory=profile_memory)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/base/PyomoModel.py", line 870, in _load_model_data
self._initialize_component(modeldata, namespaces, component_name, profile_memory)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/base/PyomoModel.py", line 925, in _initialize_component
declaration.construct(data)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/base/constraint.py", line 793, in construct
ndx)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/base/misc.py", line 61, in apply_indexed_rule
return rule(model, index)
 File "/home/bunmalik/Desktop/project/codes/codes/ALNS/ALNS-master/madridALNS.py", line 120, in resd1_rule
if expr!=0:
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 533, in __nonzero__
return bool(self())
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 208, in __call__
exception=exception))
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 545, in _apply_operation
return next(values) == next(values)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 217, in _evaluate_arglist
yield value(arg, exception=exception)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/numvalue.py", line 161, in value
tmp = numeric(exception=exception)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 208, in __call__
exception=exception))
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 812, in _apply_operation
return sum(c*next(values) for c in self._coef) + self._const
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 812, in <genexpr>
return sum(c*next(values) for c in self._coef) + self._const
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/expr_coopr3.py", line 217, in _evaluate_arglist
yield value(arg, exception=exception)
 File "/usr/local/lib/python3.5/dist-packages/pyomo/core/kernel/numvalue.py", line 170, in value
% (obj.name,))

我正在解决我的项目工作中的类似优化问题。但是,我是 Pyomo 的新手。请有人来帮助我解决错误。提前致谢

【问题讨论】:

    标签: python-3.x optimization constraints pyomo


    【解决方案1】:

    使用此型号的两个 cmets:

    1. 直接的问题是堆栈跟踪涉及if expr!=0: 行。在这里,不等式运算符使 Pyomo 评估 expr 的值。由于表达式中涉及的一些变量未初始化且没有值,因此观察到No value for uninitialized NumericValue object 错误。
    2. 我希望model.b[wo,l]是一个参数。如果它是一个变量,那么您可能会尝试在约束声明中表达析取逻辑,这通常在代数建模语言中不受支持。有关更多信息,您需要查看 Pyomo.GDP。如果它是一个参数,那么你就可以了。

    【讨论】:

    • 感谢@Qi Chen的评论,model.b[wo,1]是一个参数。但是初始化是问题所在。我注释掉了这个约束并测试了其他约束,我得到了同样的错误。同时,当我“打印”模型实例时,所有声明都显示了!
    • 我很惊讶。你说即使你注释掉这个约束,堆栈跟踪也是一样的?
    • 是 @Oi,这是我为第三个约束 restr3 得到的错误:ValueError: No value for uninitialized NumericValue object trans[2_N_Ministerios,1,1_C1, 3_C3]。 Traceback 再次暗示 'if (expr2+expr3)!=0 and (expr1+expr4)!=0:' 行。我同意问题可能来自某些变量的未初始化,但我无法确定确切的位置!请您在最后运行这些文件,看看您是否会遇到同样的问题。也许问题出在我身上。
    • 也许尝试expr is 0,这样表达式就不会强制转换为value()
    • 哇!这就像魔术一样。非常感谢@Qi。我需要澄清 !=is not 之间的区别。但是我又遇到了一个不同的错误,这又引起了另一个头痛。我要打开另一个 Stackoverflow 问题。竖起大拇指!
    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多