PYOMO ERROR: KeyError: «Индекс '0' недействителен для индексированного компонента 'y'» - PullRequest
0 голосов
/ 28 мая 2020

Это дыра. Ошибка:

ERROR: Rule failed when generating expression for objective FObj: KeyError:
    "Index '4' is not valid for indexed component 'y'"
ERROR: Constructing component 'FObj' from data=None failed:
        KeyError: "Index '4' is not valid for indexed component 'y'"

Я все проверил, проверил каждый RangeSet, и все в порядке, поэтому я не понимаю, почему он не работает. Спасибо, что прочитали это, если кто-нибудь может помочь ...

from pyomo.environ import *
from pyomo.opt import SolverFactory
from pyomo.core.base.PyomoModel import AbstractModel
from pyomo.core.base.constraint import Constraint
from pyomo.core.base.set import RangeSet
#import pyomo.dae
import numpy as np
import logging 
logging.getLogger('pyomo.core').setLevel(logging.ERROR)

   model = AbstractModel()

   model.personas = RangeSet(0, 29)
   model.sabados = RangeSet(0,3)

   model.y = Var(model.personas,model.sabados, within = Binary)


   def ObjFunction(model):
      return sum(model.y[i][s] for i in model.personas for s in model.sabados)
   model.FObj= Objective(rule=ObjFunction, sense = maximize)

1 Ответ

1 голос
/ 28 мая 2020

Проблема обнаружена. Я думаю, вы, должно быть, только что изменили тип модели на Abstract, поскольку, когда я возвращаю его к Concrete, появляется проблема с y.

Вы индексируете model.y с двойной индексацией (Python стандарт). Pyomo ... по какой-то причине ... использует индексы, разделенные запятыми, для множественной индексации. Обратите внимание на изменение в моем коде ниже. Если это головокружительно, я построил модели и поместил индексы в кортеж, чтобы оставаться в здравом уме. Например: model.y[(i, s)], который не нужен, но работает и делает его более заметным для pyomo.

Пара других примечаний ...

  • Я удалил часть ненужного импорта. Один из них вызывал какое-то предупреждение.
  • Я сократил ваши индексы, чтобы увидеть распечатку меньшего размера

from pyomo.environ import *
from pyomo.opt import SolverFactory
#from pyomo.core.base.PyomoModel import AbstractModel
#from pyomo.core.base.constraint import Constraint
#from pyomo.core.base.set import RangeSet
#import pyomo.dae
import numpy as np
import logging 
#logging.getLogger('pyomo.core').setLevel(logging.ERROR)

model = ConcreteModel()

model.personas = RangeSet(0, 3)
model.sabados = RangeSet(0,2)

model.y = Var(model.personas,model.sabados, within = Binary)


def ObjFunction(model):
  return sum(model.y[i,s] for i in model.personas for s in model.sabados)
model.FObj= Objective(rule=ObjFunction, sense = maximize)

model.pprint()

Урожайность:

1 Set Declarations
    y_index : Dim=0, Dimen=2, Size=12, Domain=None, Ordered=True, Bounds=None
        Virtual

2 RangeSet Declarations
    personas : Dim=0, Dimen=1, Size=4, Domain=Integers, Ordered=True, Bounds=(0, 3)
        Virtual
    sabados : Dim=0, Dimen=1, Size=3, Domain=Integers, Ordered=True, Bounds=(0, 2)
        Virtual

1 Var Declarations
    y : Size=12, Index=y_index
        Key    : Lower : Value : Upper : Fixed : Stale : Domain
        (0, 0) :     0 :  None :     1 : False :  True : Binary
        (0, 1) :     0 :  None :     1 : False :  True : Binary
        (0, 2) :     0 :  None :     1 : False :  True : Binary
        (1, 0) :     0 :  None :     1 : False :  True : Binary
        (1, 1) :     0 :  None :     1 : False :  True : Binary
        (1, 2) :     0 :  None :     1 : False :  True : Binary
        (2, 0) :     0 :  None :     1 : False :  True : Binary
        (2, 1) :     0 :  None :     1 : False :  True : Binary
        (2, 2) :     0 :  None :     1 : False :  True : Binary
        (3, 0) :     0 :  None :     1 : False :  True : Binary
        (3, 1) :     0 :  None :     1 : False :  True : Binary
        (3, 2) :     0 :  None :     1 : False :  True : Binary

1 Objective Declarations
    FObj : Size=1, Index=None, Active=True
        Key  : Active : Sense    : Expression
        None :   True : maximize : y[0,0] + y[0,1] + y[0,2] + y[1,0] + y[1,1] + y[1,2] + y[2,0] + y[2,1] + y[2,2] + y[3,0] + y[3,1] + y[3,2]

5 Declarations: personas sabados y_index y FObj
[Finished in 2.6s]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...