Sul sito non è presente lo zip con il codice Lingo ufficiale, quindi quella che segue è un tentativo di soluzione, e ho l'idea che non sia nemmeno tanto felice... vabbeh.
Dati
I dati di questo problema sono:
- quanto tipo di materiale serve per produrre un certo prodotto;
- le variabili alfa, beta e gamma per calcolare il prezzo di un prodotto;
- la quantità di materia prima disponibile, per ognuno dei 5 tipi di materiale.
Variabili
La variabile qui dovrebbe essere solo quanti esemplari di un certo prodotto produrre, e sempra una variabile continua non negativa.
Funzione obiettivo
Sembra che la funzione obiettivo consista nel massimizzare il prezzo del singolo prodotto, tramite quelle funzioni viste prima.
Vincoli
L'unico vincolo che mi viene in mente è:
- l'assorbimento di materie prime deve essere inferiore a quelle disponibili
Discussione della soluzione
Comunque vada, questo non è un problema lineare perché ho le variabili all'esponente etc. (c'entra qualcosa?). Pertanto, la soluzione che si spera uscirà da Lingo sarà un ottimo locale, e non è garantito che sia un ottimo globale.
Codice Lingo
Ed ecco il presunto codice Lingo.
!Prezzi. PNL del 7 aprile 2008;
model:
sets:
prodotti /1..3/;
q /1..3/: x; ! Variabile: numero di quantità di prodotto i da produrre;
dispmat /1..5/: tabdisp;
tabmat (dispmat, prodotti): tabella; ! Faccio riferimento al data "tabella";
alfa /1..3/: tabalfa;
beta /1..3/: tabbeta;
gamma /1..3/: tabgamma;
endsets
data:
! Tabella delle materie per prodotto;
! Le materie sono in colonna, i prodotti sono in riga;
tabella = 20 15 30
12 18 40
25 21 30
30 38 18
25 12 33;
! Parametri per il calcolo del prezzo del prodotto;
tabalfa = 50 48 65;
tabbeta = 50 55 45;
tabgamma = 0.8 0.2 0.5;
! Disponibilità delle materie;
tabdisp = 1600 1800 2200 3800 1300;
enddata
! Funzione obiettivo;
max = @sum(prodotti(i): tabalfa(i) + (tabbeta(i) * 2.78 ^((0 - tabgamma(i)) * x(i))));
! Vincoli;
x(1)*tabella(1,1) + x(2) * tabella(1,2) + x(3) * tabella(1,3) <= tabdisp(1);
x(1)*tabella(2,1) + x(2) * tabella(2,2) + x(3) * tabella(2,3) <= tabdisp(2);
x(1)*tabella(3,1) + x(2) * tabella(3,2) + x(3) * tabella(3,3) <= tabdisp(3);
x(1)*tabella(4,1) + x(2) * tabella(4,2) + x(3) * tabella(4,3) <= tabdisp(4);
x(1)*tabella(5,1) + x(2) * tabella(5,2) + x(3) * tabella(5,3) <= tabdisp(5);
x(1) > 0;
x(2) > 0;
x(3) > 0;
end