dd

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;