"""
    Esercitazione 1
    Esercizio 3
    Autore: Mauro Maria Baldi
"""
import pulp

# Lista delle origini
origini = ["Rimini", "Firenze"]

# Lista delle destinazioni
destinazioni = ["Palermo", "Milano", "Roma"]

# Dizionario contenente l'offeta
offerta = {"Rimini": 300, "Firenze": 600}

# Dizionario contenente la domanda
domanda = {"Palermo": 325, "Milano": 300, "Roma": 275}

# Lista di liste per i costi di trasporto
            # Palermo   Milano      Roma
costi = [[  2500,       1700,       1800],      # Rimini
         [  2500,       1800,       1400]]      # Firenze

# Inserimento dei costi in pulp
C = pulp.makeDict([origini, destinazioni], costi, 0)

# Dichiarazione del modello
model = pulp.LpProblem("Trasporti", pulp.LpMinimize)

# Dichiarazione delle variabili
x = pulp.LpVariable.dicts("x", (origini, destinazioni), lowBound = 0, upBound = None, cat = "Continuous")

# Funzione obiettivo
model+= pulp.lpSum([C[i][j]*x[i][j] for i in origini for j in destinazioni]), "FO"

# Vincoli di disponibilità presso i centri di distribuzione
for i in origini:
    model+= pulp.lpSum(x[i][j] for j in destinazioni) == offerta[i], "Origine %s" %i

# Vincoli di domanda presso le destinazioni
for j in destinazioni:
    model+= pulp.lpSum(x[i][j] for i in origini) == domanda[j], "Destinazione %s" %j

# Stampa a video del modello
print(model)
print()

# Risoluzione e stato
model.solve()
status = pulp.LpStatus[model.status]
print(status)
print()

# Valore delle variabili
for var in model.variables():
    print(var.name, "=", var.varValue)
print()

# Valore della funzione obiettivo
FO = pulp.value(model.objective)
print("FO =", FO)

