/*Structure logique*/#Objets que vont parcourir les indicesparam nl ;set liquide :={1..nl} ; #Numérotation liquideparam nres ;set reservoir :={1..nres} ; #Numérotation réservoir#Paramètresparam qantIni {j in reservoir} >= 0 ; #quantité initiale de liquide dans réservoir jparam cap {j in reservoir} >=0 ; #capacité du réservoir jparam approv {i in liquide}>=0 ; #fourniture en liquideparam lqIni {j in reservoir} >=0, <=nl ; #type de liquide initial dans réservoir#Variablesvar q {i in liquide} >= 0; #quantités restantes a mettre dans réservoirs lorsqu'on a utilisé les capacité résiduelle des reservoirs possédant un liquide initialvar x {i in liquide, j in reservoir:qantIni[j]=0 }, binary ; #après remplissage prioritaire la variable vaut 1 si un liquide i est présent dans réservoir j, 0 si réservoir j est vide.var y {i in liquide, j in reservoir} >= 0 ; #quantité de liquide i de l’approvisionnement mis dans reservoir j#J’ai rajouté la variable “q”, il est dans les consignes#Fonction objectifminimize capacite_libre: #minimisation somme capacité de réservoirs remplissum {j in reservoir, i in liquide:qantIni[j]=0} cap [j] * x [i,j] ;/*Contraintes*/s.t. capacite {i in liquide}: # garantit que l’ensemble des réservoirs recevant du liquide i offrent une capacité totale suffisantesum {j in reservoir:qantIni[j]=0} cap [j]*x[i,j] >= q[i];s.t. compatibilite {j in reservoir}: # assure que chaque réservoir libre ne reçoit pas plus d’une sorte de liquidesum {i in liquide:qantIni[j]=0} x[i,j] <= 1 ;
s.t. approvisionnement {i in liquide}: #contrainte bilan approvisionnementsum {j in reservoir} y[i,j] = approv[i];s.t. notsameliquid {i in liquide, j in reservoir}:if (i!=lqIni[j]) then (y[i,j] 0) else (y [i,j] <= cap [j] - quantIni [j]);
for {j in reservoir}{printf {i in liquide: x[i,j]=1}"%3d, de liquide %3d, mis dans reservoir %3d\n",cap[j]-capacite[i]-qantIni[j],i,j;}
param nl ;
set liquide :={1..nl} ;
param nres ;
set reservoir :={1..nres} ;
param qantIni {j in reservoir} >= 0 ;
param cap {j in reservoir} >=0 ;
param approv {i in liquide}>=0 ;
param lqIni {j in reservoir} >=0, <=nl ;
var q {i in liquide} >= approv[i] - sum{j in reservoir : lqIni[j] = i}(cap[j] - qantIni[j]);
var x {i in liquide, j in reservoir:qantIni[j]=0 }, binary ;
var y {i in liquide, j in reservoir} >= 0;
minimize capacite_libre:
sum {j in reservoir, i in liquide:qantIni[j]=0} cap [j] * x [i,j] ;
s.t. capacite {i in liquide}:
sum {j in reservoir :qantIni[j]=0} cap [j]*x[i,j] >= q[i];
s.t. compatibilite {j in reservoir}:
sum {i in liquide:qantIni[j]=0} x[i,j] <=1 ;
s.t. approvisionnement {i in liquide}:
sum {j in reservoir} y [i,j]<=approv[i];
s.t. notsameliquid1 {i in liquide, j in reservoir: i!=lqIni[j]}:
y[i,j] = 0;
s.t. notsameliquid2 {i in liquide, j in reservoir: i=lqIni[j]}:
y[i,j] <= cap [j] - qantIni[j];
s.t. reservoir_vide{i in liquide, j in reservoir:qantIni[j]=0}:
y[i,j] <= cap[j]*x[i,j];