how to rislove non linear error of my code, it is min flow but with linear function in 3 pieces
Answered#WHY IT GIVES ME NON LINEAR CONTRAINTS?, PLEASE HELP ME
/*so i have created 0..T binary variable , each one should be 1:
- 0 <= x[i,j] <= h[1]
- h[k] <= x[i,j] <= h[k+1], k=1,..,T-1
- x[i,j] >= h[T].
and for each one i have a function for it
*/
# file.mod is :
### Definire il limite sup di x[i,j]
param M = 30;
### 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 ; # quantità dedi prodotti.
var z{(i,j) in ARCHI} integer ; #
var vbk{(i,j) in ARCHI,0..T}binary; # una variabile binaria per ciascun pezzo.
### 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] ;
#primo pezzo: vincolo "0"
subject to variabili_binaria_1{(i,j) in ARCHI}:
x[i,j] <= (vbk[i,j,0] *h[1] ) + (1- vbk[i,j,0])* M ;
#secondo pezzo: vincoli k=1,...,T-1
subject to variabili_binaria_k1{(i,j) in ARCHI, k in 1..T-1}:
x[i,j] >= (vbk[i,j,k]*h[k]) - (1- vbk[i,j,k])* M ;
subject to variabili_binaria_k2{(i,j) in ARCHI, k in 1..T-1}:
x[i,j] <= vbk[i,j,k]*h[k+1] + (1- vbk[i,j,k])* M ;
#terzo pezzo: vincol T
subject to variabili_binaria_T1{(i,j) in ARCHI}:
x[i,j] >= (vbk[i,j,T] *h[T] ) - (1- vbk[i,j,T])* M ;
#la somma delle variabile binarie per cisacun arco = 1
subject to bilancio_variabili_binaria{(i,j) in ARCHI}:
sum{k in 0..T} vbk[i,j,k] = 1;
#vincolo del primo pezzo della funzione
subject to bilancio_z1{(i,j) in ARCHI}:
z[i,j] >= vbk[i,j,0]*(c[i,j,1] * x[i,j]) -(1- vbk[i,j,0])* M;
#vincolo del secondo pezzo della funzione
subject to bilancio_z2{(i,j) in ARCHI}:
z[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])
)
)
-(1- sum{k in 1..T-1}(vbk[i,j,k]))* M;
#vincolo del terzo pezzo della funzione
subject to bilancio_z3{(i,j) in ARCHI}:
z[i,j] >= vbk[i,j,T]*(
(c[i,j,T]*x[i,j]) +
sum{r in 1..T-1} ((c[i,j,r] - c[i,j,r+1])*h[r])
)
- (1- vbk[i,j,T])* M;
#obiettivo
minimize costo_totale:
sum{(i,j) in ARCHI}(z[i,j]);
#file.dat is :
### SET
param T := 8;
### INSIEMI
set NODI := n1 n2 n3 n4 n5 ;
set ARCHI := (n1,n2) (n1,n3) (n1,n5) (n2,n3) (n3,n4) (n4,n2) (n4,n5) (n5,n3) ;
### PARAMETRI
param b :=
n1 2
n2 5
n3 1
n4 -4
n5 -4 ;
param h :=
1 2
2 3
3 4
4 5
5 7
6 8
7 9
8 10;
param c :=
# Esempio per un arco (n1, n2)
n1 n2 1 10
n1 n2 2 8
n1 n2 3 6
n1 n2 4 5
n1 n2 5 4
n1 n2 6 3
n1 n2 7 2
n1 n2 8 1
# Esempio per un altro arco (n1, n3)
n1 n3 1 -2
n1 n3 2 -4
n1 n3 3 -6
n1 n3 4 -8
n1 n3 5 -10
n1 n3 6 -12
n1 n3 7 -14
n1 n3 8 -16
# Esempio per un altro arco (n1, n5)
n1 n5 1 15
n1 n5 2 13
n1 n5 3 11
n1 n5 4 9
n1 n5 5 7
n1 n5 6 5
n1 n5 7 3
n1 n5 8 1
# Esempio per un altro arco (n2, n3)
n2 n3 1 -1
n2 n3 2 -3
n2 n3 3 -5
n2 n3 4 -7
n2 n3 5 -9
n2 n3 6 -11
n2 n3 7 -12
n2 n3 8 -13
# Esempio per un altro arco (n3, n4)
n3 n4 1 15
n3 n4 2 12
n3 n4 3 10
n3 n4 4 9
n3 n4 5 7
n3 n4 6 6
n3 n4 7 4
n3 n4 8 3
# Esempio per un altro arco (n4, n2)
n4 n2 1 15
n4 n2 2 14
n4 n2 3 10
n4 n2 4 9
n4 n2 5 8
n4 n2 6 6
n4 n2 7 5
n4 n2 8 3
# Esempio per un altro arco (n4, n5)
n4 n5 1 14
n4 n5 2 12
n4 n5 3 10
n4 n5 4 8
n4 n5 5 6
n4 n5 6 3
n4 n5 7 2
n4 n5 8 1
# Esempio per un altro arco (n5, n3)
n5 n3 1 -2
n5 n3 2 -4
n5 n3 3 -7
n5 n3 4 -8
n5 n3 5 -9
n5 n3 6 -10
n5 n3 7 -11
n5 n3 8 -12;
-
You have terms vbk[i,j,0]*(c[i,j,1] * x[i,j]) where vbk and x are both optimization variables. Thus, you have a nonlinear term vbk * x.
1 -
i thought if i do multiply a binary variable that is 0 or 1 with another variable shouldn't give me non linear equation. i delete it and now it works correctly and i can now finish my project, thank you sir a lot.
0 -
i thought if i do multiply a binary variable that is 0 or 1 with another variable shouldn't give me non linear equation. i delete it and now it works correctly and i can now finish my project, thank you sir a lot.
A linearization of a product of a binary variable with an integer variable is not easily possible due to the discrete nature of the integer variable. You could represent the integer variable in terms of multiple binary variables but this trade-off is not always good.
You can linearize binary * binary or binary * continuous if finite bounds are given.
1
Please sign in to leave a comment.
Comments
3 comments