Pyomo: ошибка значения: нет значения для неинициализированного объекта NumericValue fo [1,1_C1]

Эта ссылка https://github.com/amianAA/ALNS содержит алгоритм ALNS, который был написан для оптимизации Модели железнодорожной сети MINLP (применительно к сети Мадрида). Хотя комментарии были написаны на испанском языке, но я считаю, что это не будет большой проблемой, поскольку Google Translate может помочь в этом отношении. Когда я запускал файл 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. Не мог бы кто-нибудь прийти ко мне на помощь, чтобы разрешить ошибку. заранее спасибо


person Anas Musah    schedule 25.06.2018    source источник


Ответы (1)


Два комментария к этой модели:

  1. Непосредственная проблема заключается в том, что трассировка стека затрагивает строку if expr!=0:. Здесь оператор неравенства заставляет Pyomo вычислить значение expr. Поскольку некоторые из переменных, участвующих в выражении, не инициализированы и не имеют значений, наблюдается ошибка No value for uninitialized NumericValue object.
  2. Я надеюсь, что model.b[wo,l] - это параметр. Если это переменная, возможно, вы пытаетесь выразить дизъюнктивную логику в объявлении ограничения, которое обычно не поддерживается в языке алгебраического моделирования. Чтобы узнать больше об этом, загляните в Pyomo.GDP. Если это параметр, то все в порядке.
person Qi Chen    schedule 26.06.2018
comment
Спасибо за комментарий @Qi Chen, model.b [wo, 1] - это параметр. Но инициализация - это проблема. Я закомментировал это ограничение и протестировал остальные, у меня та же ошибка. Между тем, когда я распечатал экземпляр модели, все объявления были показаны! - person Anas Musah; 26.06.2018
comment
Я удивлен. Вы говорите, что трассировка стека идентична, даже если вы закомментируете это ограничение? - person Qi Chen; 26.06.2018
comment
Да @Oi, это была ошибка, которую я получил для третьего ограничения restr3: ValueError: Нет значения для неинициализированного объекта NumericValue trans [2_N_Ministerios, 1,1_C1,3_C3]. Снова Traceback подразумевает строку 'if (expr2 + expr3)! = 0 и (expr1 + expr4)! = 0:'. Я согласен, что проблема может быть связана с неинициализацией некоторых переменных, но я не могу понять, где именно! Не могли бы вы запустить файлы на своем конце и посмотреть, возникнет ли у вас такая же проблема. Возможно, проблема была с моей стороны. - person Anas Musah; 26.06.2018
comment
Возможно, попробуйте expr is 0, чтобы принуждение к value() не происходило для выражения. - person Qi Chen; 26.06.2018
comment
Ух ты! это сработало как по волшебству. Большое спасибо @Qi. Пожалуйста, мне нужно пояснить разницу между ! = и нет. Но у меня снова возникла другая ошибка, вызвавшая еще одну головную боль. Я собираюсь открыть еще один вопрос о Stackoverflow. Пальцы вверх! - person Anas Musah; 27.06.2018