Buongiorno a tutti.
Sto implementando un problema di ottimizzazione di clustering di 25 punti in 5 clusters attraverso Pyomo utilizzando Gurobi come solver. Il codice acquisisce da Excel tre liste, una lunga 125 celle (25x5, cij), una 625 (25x25, cjk) e l'ultima lunga 25 (demand). I dati di input sono giusti, controllando le variabili nella sezione "Variable explorer".
from pyomo.environ import *
from openpyxl import load_workbook
cartella=load_workbook(filename="prova2.xlsx")
foglio=cartella["Foglio3"]
SS = {'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25'}
PS = {'1','2','3','4','5'}
NSS = 25
NPS = 5
cij={}
for j in range(2,NSS+2):
for i in range(1,NPS+1):
cij[j-1,i] = foglio.cell(j,i).value
cjk = {}
for m in range(2,NSS+2):
for k in range(7,NSS+7):
cjk[m-1,k-6] = foglio.cell(m,k).value
demand={}
for n in range(2,NSS+2):
demand[n-1] = foglio.cell(n,33).value
maxCapacity = 500
model= ConcreteModel()
model.xij = Var(SS, PS, within = Binary)
model.yjk = Var(SS, SS, domain = NonNegativeReals)
def obj(model): #funzione obiettivo
return sum([cij[s1,p]*model.xij[s1,p]+ cjk[s1,s2]*model.yjk[s1,s2]
for s1 in SS for s2 in SS for p in PS])
model.sum = ConstraintList() #Condizione 1
for s in SS:
model.sum.add(sum([model.xij[s,p] for p in PS]) == 1)
model.domanda = ConstraintList() #Condizione 2
for p in PS:
model.domanda.add(sum([model.xij[s,p]*demand[s]for s in SS]) <= maxCapacity)
model.constr1 = ConstraintList() #Condizione 3
for p in PS:
for s1 in SS:
for s2 in SS:
model.constr1.add(expr=(model.yjk[s1,s2] >= model.xij[s1,p]-model.xij[s2,p]))
model.constr2 = ConstraintList() #Condizione 4
for p in PS:
for s1 in SS:
for s2 in SS:
model.constr1.add(expr=(model.yjk[s1,s2] >= model.xij[s2,p]-model.xij[s1,p]))
model.obj = Objective (rule = obj, sense = minimize)
results = SolverFactory('gurobi').solve(model)
timlresults.write()
for s in SS:
for p in PS:
if model.xij[s,p]==1:
print("Il carico ",s ,"appartiene al cluster", p,)
Facendolo girare su Python, il sistema fornisce un errore di questo tipo:
Traceback (most recent call last):
File "/Users/gianlucasabbatini/.spyder-py3/cluster2.py", line 54, in <module>
model.domanda.add(sum([model.xij[s,p]*demand[s]for s in SS]) <= maxCapacity)
File "/Users/gianlucasabbatini/.spyder-py3/cluster2.py", line 54, in <listcomp>
model.domanda.add(sum([model.xij[s,p]*demand[s]for s in SS]) <= maxCapacity)
KeyError: '4'
Mi chiedevo che tipo di errore fosse e quale fosse un modo per risolverlo, visto che i dati in ingresso da Excel sono tutti giusti.
Grazie.