Индекс недопустим для индексируемого компонента. Параметр с двойной индексацией в pyomo

#python #pyomo

Вопрос:

Я пытаюсь создать параметр Wind_DA с двойным индексом следующим образом:

 import pandas as pd
import pyomo.environ as pe
import pyomo.opt as po

#DATA
T=3;
W=1;

time = ['t{0}'.format(t 1) for t in range(T)]
wind=['W{0}'.format(w 1) for w in range(W)]

Wind_DA={}
Wind_DA['w1', 't1']=200
Wind_DA['w1', 't2']=200
Wind_DA['w1', 't3']=200

#MODEL
seq=pe.ConcreteModel()

### SETS
seq.W = pe.Set(initialize = wind)
seq.T =pe.Set(initialize = time)

### PARAMETERS

seq.Wind_DA = pe.Param(seq.W, seq.T, initialize = Wind_DA)
 

Я получаю следующую ошибку:

Ошибка ключа: «Индекс «(«w1», «t1″)» недопустим для индексированного компонента «Wind_DA»».

Однако, когда я печатаю на консоли Wind_DA[('w1', 't1')] , я получаю 200 , что означает, что этот словарь имеет этот индекс. В чем может быть проблема? Заранее благодарю вас!

Ответ №1:

Это просто опечатка.

При создании массива ветра с wind=['W{0}'.format(w 1) for w in range(W)] помощью вы используете заглавную букву W, но при создании параметра Wind_DA = {}... вы используете меньшую букву W

Просто измените wind=['W{0}'.format(w 1) for w in range(W)] на нижний регистр w , и это должно работать должным образом. wind=['w{0}'.format(w 1) for w in range(W)]

 import pandas as pd
import pyomo.environ as pe
import pyomo.opt as po

#DATA
T=3
W=1

time = ['t{0}'.format(t 1) for t in range(T)]
wind=['w{0}'.format(w 1) for w in range(W)]

Wind_DA={}
Wind_DA['w1', 't1']=200
Wind_DA['w1', 't2']=200
Wind_DA['w1', 't3']=200

#MODEL
seq=pe.ConcreteModel()

### SETS
seq.W = pe.Set(initialize = wind)
seq.T =pe.Set(initialize = time)

### PARAMETERS
seq.Wind_DA = pe.Param(seq.W, seq.T, initialize = Wind_DA)