conroran
conroran

Reputation: 15

PYOMO ERROR: KeyError: "Index '0' is not valid for indexed component 'y' "

This is the hole Error:

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'"

I've proved everything, checking every RangeSet and it's ok so I don't why it doesn't work well. Thanks for reading this, if anyone could help...

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)

Upvotes: 1

Views: 5103

Answers (1)

AirSquid
AirSquid

Reputation: 11903

Problem discovered. I think you must have just changed the model type to Abstract as when I change it back to Concrete the problem with y shows up.

You are indexing model.y with double indexing (Python standard). Pyomo ... for whatever reason ... uses comma separated indices for multiple indexing. Note the change in my code below. If this is a head-hurter, I've built models and put the indices in a tuple just to keep myself sane. Such as: model.y[(i, s)] which is unnecessary, but works and makes it look more distinct for pyomo.

Couple other notes...

  • I removed some of the unnecceary imports. One was causing some kind of warning.
  • I chopped down your indices just to see a smaller printout

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()

Yields:

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]

Upvotes: 2

Related Questions