how to rislove this, min flow but with linear function in 3 pieces
Awaiting user input### Definire il numero di pezzi della funzione
param M = Infinity;
### Definire un parametro N che è il dimensione del parametro(insieme) T
param T; # Parametro T.
### INSIEMI
set NODI ;
set ARCHI within NODI cross NODI ;
param b{NODI};
param c{ARCHI,1..T}, integer ;
param d{ARCHI}>=0, default Infinity ; # non serve dato che la capacità è infinita
param h{0..T} >= 0 , integer; # il parametro h che è fisso.
# Check
check{i in 1..T-1}: h[i] < h[i+1] ; # i valori di h sono crescenti.
check{(i,j) in ARCHI, k in 1..T-1}: c[i,j,k] > c[i,j,k+1];# i valori di c sono decrescenti
### VARIABILI
var x{(i,j) in ARCHI} >=0, integer ; # possiamo anche togliere il limite superiore <= d[i,j.
#var numero_k{(i,j) in ARCHI} >=0, integer ; # possiamo anche togliere il limite superiore <= d[i,j.
var f{ARCHI} integer ; # possiamo anche togliere il limite superiore <= d[i,j.
var f1{ARCHI} integer; # possiamo anche togliere il limite superiore <= d[i,j.
var f2 {ARCHI} integer ; # possiamo anche togliere il limite superiore <= d[i,j.
var f3{ARCHI} integer ; # possiamo anche togliere il limite superiore <= d[i,j.
#var vincoli{ARCHI,i in 1..PEZZI} binary;
var vbk{ARCHI,0..T}binary;
var pezzo_1{ARCHI} >= 0, <=1, integer;
var pezzo_2{ARCHI} >= 0, <=1, integer;
var pezzo_3{ARCHI} >= 0, <=1, integer;
### VINCOLI
#vincolo principale per un problema di costo minimo.
subject to bilancio{i in NODI} : sum{j in NODI :
(i,j) in ARCHI}x[i,j] - sum{j in NODI : (j,i) in ARCHI} x[j,i] = b[i] ;
#vincolo del primo pezzo
subject to variabili_binaria1{(i,j) in ARCHI, k in 0..T}:
x[i,j] >= (vbk[i,j,k]*h[k]) -(1- vbk[i,j,k])* 3 * h[T] ;
#vincolo del primo pezzo
subject to variabili_binaria2{(i,j) in ARCHI, k in 0..T-1}:
x[i,j] <= vbk[i,j,k]*h[k+1] + (1- vbk[i,j,k])* 3 * h[T] ;
subject to bilancio_variabili_binaria{(i,j) in ARCHI}:
sum{k in 0..T} vbk[i,j,k] = 1;
subject to bilancio_pezzo_1{(i,j) in ARCHI}:
pezzo_1[i,j] = vbk[i,j,0];
subject to bilancio_pezzo_2{(i,j) in ARCHI}:
pezzo_2[i,j] = sum{k in 1..T-1}vbk[i,j,k];
subject to bilancio_pezzo_3{(i,j) in ARCHI}:
pezzo_3[i,j] = vbk[i,j,T];
subject to bilancio_pezzi{(i,j) in ARCHI}:
pezzo_1[i,j]+ pezzo_2[i,j] + pezzo_3[i,j] = 1;
#il primo pezzo della funzione
subject to funzion_1{(i,j)in ARCHI}:
f1[i,j]= pezzo_1[i,j]*(c[i,j,1]*x[i,j]);
# il secondo pezzo della funzione
subject to funzione_2{(i,j)in ARCHI}:
f2[i,j]= pezzo_2[i,j] * (sum{k in 1..T-1}( vbk[i,j,k]* ((c[i,j,k+1]*x[i,j]) + sum{r in 1..k} ((c[i,j,r] - c[i,j,r+1])*h[r])) ));# il terzo pezzo della funzione
subject to funzione_3{(i,j)in ARCHI}:
f3[i,j]= (pezzo_3[i,j] * (c[i,j,T]*x[i,j] + sum{r in 1..T-1} (c[i,j,r] - c[i,j,r+1])*h[r] ));
subject to funzione{(i,j) in ARCHI}:
f[i,j] =
f1[i,j] + f2[i,j] + f3[i,j];
minimize costo_totale:
sum {(i,j) in ARCHI}(f1[i,j]+ f2[i,j]+ f3[i,j]);
-
AMPL accepts this model without any errors. It is OK to write the objective as the sum of three variables, each of which equals a different expression. The expression for f2[i,j] has a product of 3 variables -- pezzo_2[i,j], vbk[i,j,k], and x[i,j] -- but AMPL's interface to Gurobi offers the option of converting that to an equivalent quadratic formulation, which Gurobi can handle if you add nonconvex=2 to your gurobi_options string.
Do you have any problems when you add some data and attempt to solve the resulting problem? If you need help that might be related to AMPL, you can post a question on the AMPL forum at https://discuss.ampl.com.
0
Please sign in to leave a comment.
Comments
1 comment