Ottimizzazione Pyomo

di il
1 risposte

Ottimizzazione Pyomo

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.

1 Risposte

  • Re: Ottimizzazione Pyomo

    Stai cercando di leggere il valore associato ad una chiave inesistente di un dizionario, e quella chiave e' la stringa "4".

    Siccome nella riga incriminata, l'unico dizionario e' `model`, ti conviene aggiungere un print per vedere se contiene davvere la stringa '4' tra le chiavi:
    [CODE] [...] print('contenuto di model: ', model) for p in PS: model.domanda.add(sum([model.xij[s,p] * demand[s] for s in SS]) <= maxCapacity)
Devi accedere o registrarti per scrivere nel forum
1 risposte