1
Fork 0
mirror of https://github.com/Steffo99/appunti-magistrali.git synced 2024-11-24 03:04:18 +00:00

Importa OLI da Steffo99/gmpl-stuff

This commit is contained in:
Steffo 2024-06-04 08:16:15 +02:00
parent 89b3a26aa7
commit f8c212ff85
Signed by: steffo
GPG key ID: 5ADA3868646C3FC0
4 changed files with 148 additions and 0 deletions

View file

@ -0,0 +1,21 @@
/* Primale */
var x;
var y;
maximize s: x + y;
c1: 2*x + y <= 5;
c2: x + 2*y <= 5;
/* Duale */
var a;
var b;
minimize z: 5*a + 5*b;
c3: 2*a + b >= 1;
c4: a + 2*b >= 1;
solve;
display x, y, s;
display a, b, z;
end;

View file

@ -0,0 +1,13 @@
var w >= 0;
var x >= 0;
var y >= 0;
var z >= 0;
maximize sol: 3*w - 2*x + z;
c1: w - x + 3*y >= 8;
c2: 4*x + 5*z <= 12;
c3: 3*w - 4*y + z >= 15;
solve;
display sol, w, x, y, z;
end;

View file

@ -0,0 +1,75 @@
/*
Un grossista gestisce nel suo magazzino P tipi di prodotti differenti.
- [x] Ogni prodotto k = 1..P ha un volume di v_k unità.
- [x] Ogni prodotto ha una domanda stimata, per le prossime T settimane, pari a d_{tk} (t = 1..T).
- [x] L'approvigionamento di ogni prodotto k è limitato a un massimo di m_k unità per settimana.
- [x] Il volume totale disponibile nel magazzino è pari a V.
- [x] Ogni prodotto k non può occupare più di V_k unità di spazio in magazzino.
- [x] Alla settimana t = 0 il magazzino dispone di I_{0k} unità di ogni prodotto k.
- [x] Alla fine della settimana T devono rimanere in magazzino s_k unità di ogni prodotto k.
- [x] In ogni settimana si può ordinare (o meno) ogni prodotto k al rispettivo fornitore.
- [x] Il prodotto viene consegnato al magazzino nella stessa settimana.
- [x] Ogni ordine di prodotto k non può essere inferiore a una data quantità minima q_k.
Si scriva un modello di programmazione lineare per aiutare l'azienda a definire una politica di approvigionamento che permetta di soddisfare la domanda, nel rispetto di tutti i vincoli e minimizzando la giacenza media delle T settimane.
*/
# Numero di prodotti
param P;
# Numero di settimane
param T;
# Domanda per ogni prodotto
param domanda{1 .. P, 1 .. T}, >= 0;
# Offerta per ogni prodotto
param approvigionamento{1 .. P}, >= 0;
# Quantità in magazzino di ogni prodotto alla settimana 0
param quantitaIniziale{1 .. P}, >= 0;
# Capacità in magazzino massima di ogni prodotto
param capacita{1 .. P}, >= 0;
# Capacità massima in totale
param capacitaTotale, >= 0;
# Quantità minima di ogni prodotto che deve rimanere in magazzino alla fine dell'ultima settimana
param safety{1 .. P}, >= 0;
# Dimensione minima di un ordine
param ordineMinimo{1 .. P}, >= 0;
# Quantità da ordinare ogni settimana di ogni prodotto
var ordine{1 .. P, 1 .. T}, >= 0;
# Quantità in magazzino di ogni prodotto
var quantita{1 .. P, 1 .. T}, >= 0;
# Quantità totale di prodotti in magazzino
var quantitaTotale{1 .. T}, >= 0;
# All'ultima settimana, la quantità deve essere almeno safety
c1{p in 1 .. P}: safety[p] <= quantita[p, T];
# La quantità di ogni prodotto deve sempre essere minore della capacità e la safety.
c2{p in 1 .. P, t in 1 .. T}: quantita[p, t] <= capacita[p];
# Ci possono essere massimo X prodotti in magazzino.
c3{t in 1 .. T}: quantitaTotale[t] == sum{p in 1 .. P} quantita[p, t];
c4{t in 1 .. T}: quantitaTotale[t] <= capacitaTotale;
# Si può ordinare al minimo X e al massimo Y prodotti ogni settimana
c5{p in 1 .. P, t in 1 .. T}: ordine[p, t] >= ordineMinimo[p];
c6{p in 1 .. P, t in 1 .. T}: ordine[p, t] <= approvigionamento[p];
# La quantità è uguale alla somma degli ordini e della quantità iniziale
c7{p in 1 .. P, t in 1 .. T}: quantita[p, t] == quantitaIniziale[p] + sum{u in 1 .. t} ordine[p, u] - sum{u in 1 .. t} domanda[p, u];
# Funzione obiettivo
minimize sol: sum{t in 1 .. T} quantitaTotale[t];
solve;
end;

View file

@ -0,0 +1,39 @@
/*
A warehouse has to store n boxes in a rack with m shelves.
The first m1 shelves have length L1, while the remaining have length L2.
Each box j = 1..n has length l_j and a frequency of usage f_j.
Write a linear programming model that helps the warehouse to decide how to store the boxes,
so that the sum of the frequencies of the boxes stored in the first m1 shelves is maximized.
(N.B. It is not known if all the boxes can be stored.)
*/
# Set casse
param nCasse >= 1;
set CASSE := 1..nCasse;
# Set scaffali
param nScaffali >= 1;
set SCAFFALI := 1..nScaffali;
# Parametri cassa
param dimensione{c in CASSE} >= 0;
param frequenza{c in CASSE} >= 0;
# Parametri scaffali
param spazioA >= 0;
param spazioB >= 0;
param cutoff >= 1, <= nScaffali + 1; # Tutti gli scaffali maggiori o uguali a questo numero saranno considerati nel set B
param spazio{s in SCAFFALI} := if s >= cutoff then spazioB else spazioA;
set SCAFFALI_A := 1..cutoff;
set SCAFFALI_B := cutoff + 1 ..nScaffali;
# Vincoli
var suScaffale{c in CASSE, s in SCAFFALI} binary;
c1{c in CASSE}: sum{s in SCAFFALI} suScaffale[c, s] == 1;
c2{s in SCAFFALI}: sum{c in CASSE} dimensione[c] * suScaffale[c, s] <= spazio[s];
# Funzione obiettivo
maximize z: sum{c in CASSE, s in SCAFFALI_A} suScaffale[c, s] * frequenza[c];
solve;
end;