Ottimizzazione Pyomo
« il: Maggio 14, 2020, 10:26 »
Buongiorno. Ho un problema con questo codice. Il codice dovrebbe risolvere un problema di ottimizzazione di clustering di 25 punti e assegnarli a 5 differenti clusters. Il codice riceve da Excel i dati in modo corretto, e sono soprattutto 3 le liste principali
cij (5x25)
cjk (25x25)
demand (25)
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,)

Python dà come output un errore di questo tipo:
Traceback (most recent call last):

  File "/Users/gia/.spyder-py3/cluster2.py", line 54, in <module>
    model.domanda.add(sum([model.xij[s,p]*demandfor s in SS]) <= maxCapacity)

  File "/Users/gia/.spyder-py3/cluster2.py", line 54, in <listcomp>
    model.domanda.add(sum([model.xij[s,p]*demandfor s in SS]) <= maxCapacity)

KeyError: '4'
Mi chiedevo che tipo di errore fosse e come fare per risolverlo. Grazie.