Buongiorno devo risolvere il seguente modello:
Smistamento vetture
Un’azienda produttrice di automobili deve pianificare lo smistamento delle vetture in un paese
straniero. Le vetture raggiungono il paese via mare e le navi possono attraccare in 3 diversi porti,
P1, P2 e P3. Per ciascun porto si deve pagare una tassa per ciascuna automobile del carico: nel
porto P1 la tassa ammonta a 150 euro per vettura, nel porto P2 a 250 euro per vettura, mentre
nel porto P3 la tassa è di 200 euro a vettura. Inoltre è prevista una tassa per l’utilizzo di ciascun
porto, pari rispettivamente a 1500, 1500 e 2000 euro. Le automobili devono essere inviate ai 4
centri di smistamento presenti nel paese, S1, S2, S3 e S4. L’invio di un’automobile dal porto P1
costa 0.2 euro/Km, l’invio di un’automobile dal porto P2 costa 0.1 euro/Km, mentre dal porto
P3 costa 1 euro/Km. Le distanze, in chilometri, tra porti e centri di smistamento sono riportate
nella tabella.
S1 S2 S3 S4
P1 250 150 100 200
P2 400 300 300 600
P3 40 15 30 10
La richiesta del centro di smistamento S1 è di almeno 170 vetture, quella del centro S2 è di
130 vetture, quella del centro S3 è di 100 vetture mentre la domanda di S4 è di 200 vetture.
Per motivi strategici, il centro S3 deve essere fornito da un solo porto. Inoltre se il porto P2
serve il centro di smistamento S2 deve servire anche S4. Sapendo che il porto P1 gestisce al
piu 350 automobili, il porto P2 gestisce al piu 200 vetture mentre il terzo porto gestisce al piu
300 vetture, scrivere il modello in programmazione lineare che pianifichi la distribuzione delle
vetture minimizzando i costi.
Io ho cercato di risolverlo in questo modo, riporto il codice di AMPL:
file SmistamentoVetture.mod
set P; #porti
set S; #centri di smistamento;
param T{P};# tassa per ogni automobile per ogni porto
param Tp{P};#tassa per ogni porto
param C{P};#costo del trasporto al kilometro per ogni porto
param A{P,S};#distanza da porto i a centro di smistamento j
param R{S};#richiesta di auto da ciascun centro di smistamento
param G{P};# max quantita di auto gestibili da ciascun porto
var x{P,S}, integer >=0; #quantita di auto dal porto i al centro di smistamento j
var y{P,S}, binary;# =1 se auto vengono spedite dal porto i al centro di smist j, 0 altrimenti
minimize costi:
sum{i in P,j in S}(x[i,j]*T[i]+y[i,j]*Tp[i]+y[i,j]*A[i,j]*C[i]);
subject to richiesta{j in S}:
sum{i in P}x[i,j]>=R[j];
subject to capacita{i in P}:
sum{j in S}x[i,j]<=G[i];
subject to condizione{i in P,j in S}:
y[i,j]=ceil(x[i,j]/(1+x[i,j]));
subject to condizione3{j in S:j=3}:
sum{i in P}y[i,j]<=1;
subject to condizione4 {i in P, j in S: i=2}:
y[i,2]<=y[i,4];
Sostanzialmente, ho creato due variabili, x e y.
X[i,j] è una variabile intera = quante vetture vengono spedite verso il centro "j" partendo dal porto "i".
La variabile y[i,j] è una variabile binaria =1 se le vetture vengono spedite dal porto "i" al centro "j".
Di seguito riporto anche il file dei dati(.dat) e il file.run.
Il problema è che, NON RIESCO AD ABBINARE la variabile y alla variabile x. questo mi è indispensabile per tener conto nella soluzione delle tasse per l'utilizzo di un porto.
Qualcuno puo darmi una mano?
Grazie
file SmistamentoVetture.dat
set P:=p1 p2 p3; #porti
set S:=s1 s2 s3 s4; #centri di smistamento;
param: T Tp C G:=
p1 150 1500 0.2 350
p2 250 1500 0.1 200
p3 200 2000 1 300;
param: R:= s1 170 s2 130 s3 100 s4 200;
param A: s1 s2 s3 s4:=
p1 250 150 100 200
p2 400 300 300 600
p3 40 15 30 10;
file SmistamentoVetture.run
reset;
model SmistamentoVetture.mod
data SmistamentoVetture.dat
option solver cplex;
option show_stats 3;
#option cplex_options 'sensitivity presolve=0';
suffix up OUT;
suffix down OUT;
solve;
display x;
display y;
display costi;
Grazie ancora