set P;
set M;
set T := 1..6;
param am {M} >= 0; # Available Machines Count
param mm {M, T} >= 0; # Maintenance Machines Count
param pf {P} >= 0; # Profit
param tm {P, M} >= 0; # Time
param de {P, T} >= 0; # Demand
param si := 0 # Initial Stock
param sf := 0.5; # Stock Fee
param sc := 100; # Stock Capacity
param fsc := 50; # Final Stock Capacity
param dm := 24; # Days per Months
param sd := 2; # Sessions per Day
param hs := 8; # Hours per Session
var x {P, T} >= 0;
var d {P, T} >= 0;
var i {P, T} >= 0;
maximize Total_Profit:
sum {p in P, t in T} pf[p] * d[p, t] - sum {p in P, t in T} sf * i[p, t];
subject to Machine_Availability {m in M, t in T}:
sum {p in P} tm[p, m] * x[p, t]
<= (am[m] - mm[m, t]) * dm * sd * hs;
subject to Demand {p in P, t in T}:
d[p, t] <= de[p, t];
subject to Stock {p in P, t in T}:
x[p, t] + (if t > 1 then i[p, t - 1] else si) = d[p, t] + i[p, t];
subject to Stock_Capacity {p in P, t in T}:
i[p, t] <= sc;
subject to Final_Stock_Capacity {p in P}:
i[p, 6] = fsc;
data;
set P := 1 2 3 4 5 6 7;
set M := Grinding Vertical_Drilling Horizontal_Drilling Boring Planing;
param am :=
Grinding 4
Vertical_Drilling 2
Horizontal_Drilling 3
Boring 1
Planing 1;
param mm:
1 2 3 4 5 6 :=
Grinding 1 0 0 0 1 0
Vertical_Drilling 0 0 0 1 1 0
Horizontal_Drilling 0 2 0 0 0 1
Boring 0 0 1 0 0 0
Planing 0 0 0 0 0 1;
param pf :=
1 10
2 6
3 8
4 4
5 11
6 9
7 3;
param tm:
Grinding Vertical_Drilling Horizontal_Drilling Boring Planing :=
1 0.5 0.1 0.2 0.05 0
2 0.7 0.2 0 0.03 0
3 0 0 0.8 0 0.01
4 0 0.3 0 0.07 0
5 0.3 0 0 0.1 0.05
6 0.2 0.6 0 0 0
7 0.5 0 0.6 0.08 0.05;
param de:
1 2 3 4 5 6 :=
1 500 600 300 200 0 500
2 1000 500 600 300 100 500
3 300 200 0 400 500 100
4 300 0 0 500 100 300
5 800 400 500 200 1000 1100
6 200 300 400 0 300 500
7 100 150 100 100 0 60;
end;