Models#
Multi-objective diet model#
Model (download here).
set MINREQ; # nutrients with minimum requirements
set MAXREQ; # nutrients with maximum requirements
set NUTR := MINREQ union MAXREQ; # nutrients
set FOOD; # foods
set STORE; # stores
param cost {STORE,FOOD} > 0;
param f_min {FOOD} >= 0;
param f_max {j in FOOD} >= f_min[j];
param n_min {MINREQ} >= 0;
param n_max {MAXREQ} >= 0;
param amt {NUTR,FOOD} >= 0;
var Buy {j in FOOD} >= f_min[j], <= f_max[j];
minimize total_cost {s in STORE}:
sum {j in FOOD} cost[s,j] * Buy[j];
minimize total_number: sum {j in FOOD} Buy[j];
subject to diet_min {i in MINREQ}:
sum {j in FOOD} amt[i,j] * Buy[j] >= n_min[i];
subject to diet_max {i in MAXREQ}:
sum {j in FOOD} amt[i,j] * Buy[j] <= n_max[i];
Data (download here).
data;
set MINREQ := A B1 B2 C CAL ;
set MAXREQ := A NA CAL ;
set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ;
param: f_min f_max :=
BEEF 2 10
CHK 2 10
FISH 2 10
HAM 2 10
MCH 2 10
MTL 2 10
SPG 2 10
TUR 2 10 ;
set STORE := "A&P" JEWEL VONS ;
param cost: BEEF CHK FISH HAM MCH MTL SPG TUR :=
"A&P" 3.19 2.59 2.29 2.89 1.89 1.99 1.99 2.49
JEWEL 3.09 2.79 2.29 2.59 1.59 1.99 2.09 2.30
VONS 2.59 2.99 2.49 2.69 1.99 2.29 2.00 2.69 ;
param: n_min n_max :=
A 700 20000
C 700 .
B1 0 .
B2 0 .
NA . 50000
CAL 16000 24000 ;
param amt (tr): A C B1 B2 NA CAL :=
BEEF 60 20 10 15 938 295
CHK 8 0 20 20 2180 770
FISH 8 10 15 10 945 440
HAM 40 40 35 10 278 430
MCH 15 35 15 15 1182 315
MTL 70 30 15 15 896 400
SPG 25 50 25 15 1329 370
TUR 60 20 15 10 1397 450 ;
An infeasible model#
Model (download here).
var x;
var y;
var z;
subj to c1:
x+y >= 1;
subj to c2:
y + log(z + exp(x+3)) <= 1.83;
subj to c3:
z + log(y + 3.8*exp(x+3)) >= -14.265;
Another infeasible model#
Model (download here).
var x integer >= 5;
var y integer;
minimize TotalSum:
x - 2*y;
subj to C1:
-x + 21*y >= 2;
subj to C2:
-3*x + 2*y <= 1;
subj to C3:
20*x + y <= 20;
n-Queens model#
Model : (download here).
# nQueens problem, binary formulation
param n default 10;
set ROWS := {1..n};
set COLUMNS := {1..n};
# X[i,j] is one if there is a queen at (i,j); else zero
var X{ROWS, COLUMNS} binary;
maximize max_queens: sum {i in ROWS, j in COLUMNS} X[i,j];
subject to column_attacks {j in COLUMNS}:
sum {i in ROWS} X[i,j] = 1;
subject to row_attacks {i in ROWS}:
sum {j in COLUMNS} X[i,j] = 1;
subject to diagonal1_attacks {k in 2..2*n}:
sum {i in ROWS, j in COLUMNS: i+j=k} X[i,j] <= 1;
subject to diagonal2_attacks {k in -(n-1)..(n-1)}:
sum {i in ROWS, j in COLUMNS: i-j=k} X[i,j] <= 1;