1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| tuple Node {
int indice;
string nom;
};
tuple Product{
int indice;
string nom;
};
//Ensembles
{Node} Suppliers = ...;
{Node} Plants = ...;
{Node} Customers = ...;
{Product} Raw_Materials = ...;
{Product} Intermediate_Products = ...;
{Product} Finished_Products = ...;
{int} Time_Periods = ...;
{Node} Origin_Nodes = Suppliers union Plants;
{Node} Destination_Nodes = Plants union Customers;
{Product} Commodities = Raw_Materials union Intermediate_Products union Finished_Products;
{Product} Commodities1 = Raw_Materials union Intermediate_Products;
{Product} Commodities2 = Intermediate_Products union Finished_Products;
{Node} Origin_Commodity[Commodities] = ...;
{Node} Destination_Commodity[Commodities] = ...;
{Node} Plant_Commodity[Commodities] = ...;
{Product} Commodity_Origin[Origin_Nodes] = ...;
{Node} Opened_Plants = ...;
{Node} Closed_Plants = ...;
//Données
float Demand_Customer[Time_Periods][Customers][Finished_Products] = ...;
float Production_Max[Time_Periods][Origin_Nodes][Commodities] = ...;
float Production_Min[Time_Periods][Origin_Nodes][Commodities] = ...;
float Capacity_Max[Time_Periods][Origin_Nodes] = ...;
float Capacity_Min[Time_Periods][Origin_Nodes] = ...;
float Number_Unit[Plants][Commodities2][Commodities] = ...;
float Cost_Of_Selecting[Time_Periods][Origin_Nodes] = ...;
float Cost_Of_Producing[Time_Periods][Commodities][Origin_Nodes] = ...;
float Cost_Of_Transporting[Time_Periods][Commodities][Origin_Nodes][Destination_Nodes] = ...;
{Product} L[Commodities1][Plants] = ...;
//Les variables de décision
dvar int+ y[Time_Periods][Origin_Nodes] in 0..1;
dvar int+ v[Time_Periods][Commodities][Origin_Nodes] in 0..1;
dvar float+ x[Time_Periods][Commodities][Origin_Nodes][Destination_Nodes];
//Fonction objective
dexpr float Total_Selection = sum( t in Time_Periods, o in Origin_Nodes ) Cost_Of_Selecting[t][o]*y[t][o];
dexpr float Total_Production = sum( t in Time_Periods, k in Commodities, o in Origin_Commodity[k]) Cost_Of_Producing[t][k][o]*v[t][k][o];
dexpr float Total_Transport = sum( t in Time_Periods, k in Commodities, o in Origin_Commodity[k], d in Destination_Commodity[k]) Cost_Of_Transporting[t][k][o][d]*x[t][k][o][d];
minimize Total_Selection + Total_Production + Total_Transport;
//Contraintes
subject to {
c_assign1:
forall (c in Customers, t in Time_Periods, f in Finished_Products) {
sum(p in Plants) x[t][f][p][c] <= Demand_Customer[t][c][f] ;
}
c_assign2:
forall (k in Commodities1, t in Time_Periods, p in Plant_Commodity[k]) {
sum(o in Origin_Commodity[k]) x[t][k][o][p] - sum(j in L[k][p], d in Destination_Commodity[j]) Number_Unit[p][j][k]*x[t][j][p][d]== 0 ;
}
c_assign3:
forall (o in Origin_Nodes, t in Time_Periods) {
sum(k in Commodity_Origin[o], d in Destination_Commodity[k]) x[t][k][o][d] <= Capacity_Max[t][o]*y[t][o] ;
}
c_assign4:
forall (o in Origin_Nodes, t in Time_Periods) {
sum(k in Commodity_Origin[o], d in Destination_Commodity[k]) x[t][k][o][d] >= Capacity_Min[t][o]*y[t][o] ;
}
c_assign5:
forall (o in Origin_Nodes, t in Time_Periods, k in Commodity_Origin[o]) {
sum(d in Destination_Commodity[k]) x[t][k][o][d] <= Production_Max[t][o][k]*v[t][k][o] ;
}
c_assign6:
forall (o in Origin_Nodes, t in Time_Periods, k in Commodity_Origin[o]) {
sum(d in Destination_Commodity[k]) x[t][k][o][d] >= Production_Min[t][o][k]*v[t][k][o] ;
}
c_assign7:
forall (o in Closed_Plants, t in Time_Periods : t < card(Time_Periods)) {
y[t+1][o] >= y[t][o] ;
}
c_assign8:
forall (o in Opened_Plants, t in Time_Periods : t < card(Time_Periods)) {
y[t+1][o] <= y[t][o] ;
}
} |
Partager