#Fichier collecte_2_camions.mod
#Jours dans la semaine
set Jours;
set triplet1;
set triplet2;
set triplet3;
#display nbJours,Jours,triplet1,triplet2,triplet3;
#Sites
set Sites;
#tableau des collectes cibles hebdo par Site
param collCible{i in Sites};
#display collCible;
#tableau des surfaces camion équivalentes à une semaine de livraisons par Site
param surfHebdo{i in Sites};
#display surfHebdo;
#surface maxi d'un camion
param surfMaxCamion;
#display surfMaxCamion;
#camions
set Camions;
#display Camions;
#matrice de collecte
var Collecte{i in Sites, j in Jours, k in Camions} binary;
#************* objectif ********************
#la somme sur tous les sites des (1 pour un site multipliée par la surface hebo du site) doit être maximal
maximize surfaceTotaleHebdo: sum{i in Sites, j in Jours, k in Camions} Collecte[i,j,k]*surfHebdo[i];
#************* fin objectif ********************
#************* contraintes ********************
# 1) une seule livraison pour un jour et un site
s.t. uniciteCamionSiteJour{i in Sites, j in Jours}:
sum{k in Camions}Collecte[i,j,k],<=1;
# 2) la capacité d'un camion ne peut etre dépassee dans une tournee
s.t. capaciteCamionJour{j in Jours, k in Camions}:
sum{i in Sites} Collecte[i,j,k]*surfHebdo[i],<=surfMaxCamion;
# 3) 2 jours de repos entre 2 livraisons
s.t. JoursdeRepos1{i in Sites, k in Camions}:
sum{j in triplet1} Collecte[i,j,k],<=1;
s.t. JoursdeRepos2{i in Sites, k in Camions}:
sum{j in triplet2} Collecte[i,j,k],<=1;
s.t. JoursdeRepos3{i in Sites, k in Camions}:
sum{j in triplet3} Collecte[i,j,k],<=1;
# 4) le nombre de livraisons pour un site i doit correspondre à la cible collCible[i]
s.t. livraisonSite{i in Sites}:
sum{j in Jours, k in Camions} Collecte[i,j,k],=collCible[i];
solve;
end;