Originally posted by: Rym
The model+Data:
float Rwa=0.0830409357;
int fo =5;
int v = 5;
range V = 1..v;
int p=10;
range P = 1..p;
int d=3;
range D=1..d;
string vms[V]= ["m","m","l","x","l"];
int cpui[V] = [2,2,4,8,4];
float rami[V]= [7.5,7.5,15,30,15];
int diski[V] = [32,32,80,160,80];
int cpuj[P] = [90,90,90,90,90,90,90,90,90,90];
float ramj[P]= [375,375,375,375,375,375,375, 375,375, 375] ;
int diskj[P] = [1520,1520,1520,1520,1520,1520,1520,1520,1520,1520];
int VMmin=1;
int VMmax=4;
string S[VMmin..VMmax]=["s","m","l","x"];
{string} VMTypes={S[v] | v in VMmin..VMmax};
tuple PM
{
int npm;
string nvm;
}
{PM} indexes={<i,j> | i in P,j in VMTypes};
int countPVX[indexes];
int cpum=90;
float ramm=375;
int diskm=1520;
//the model/problem definition
dvar boolean lumda[V][P];
dvar boolean phy[P];
dexpr float R1[j in P]= (cpum-(sum(i in V) lumda[i][j]*cpui[i]))/cpum;
dexpr float R2[j in P]= (ramm-(sum(i in V) lumda[i][j]*rami[i]))/ramm;
dexpr float R3[j in P]= (diskm-(sum(i in V) lumda[i][j]*diski[i]))/diskm;
dexpr float Rj[j in P,l in D]=(l==1)?R1[j]:((l==2)?R2[j]:(R3[j]));
dexpr float minx[j in P] = minl(Rj[j][1],(minl(Rj[j][2],Rj[j][3])));
dexpr float RWx=sum(j in P,k in D)(!(Rj[j][k]==minx[j]))*(Rj[j][k]-minx[j]);
dexpr int OP = sum( j in P) phy[j];
minimize OP;
//constraints
subject to{
//une machine virtuelle est hébergée par au plus une seule pm
limit:
forall( i in V)
sum( j in P ) lumda[i][j] <= 1;
//la quantité de cpu consommée par les vms ne depasse la la quantité de cpu de la pm j
cpur:
forall( j in P)
sum( i in V) cpui[i]*lumda[i][j] <= cpuj[j];
//la quantité de ram consommée par les vms ne depasse la la quantité de ram de la pm j
ramr:
forall( j in P)
sum( i in V) rami[i]*lumda[i][j] <= ramj[j];
//la quantité de disk consommée par les vms ne depasse la la quantité de disk de la pm
diskr:
forall( j in P)
sum( i in V) diski[i]*lumda[i][j] <= diskj[j];
//quand est ce que pm prends un
phyone:
forall ( i in V, j in P)
lumda[i][j]<= phy[j] ;
//quand est ce que pm prends zero
phynull:
forall (j in P)
phy[j]<= sum (i in V) lumda[i][j];
glob:
fo <= sum (i in V, j in P) lumda[i][j];
rwco:
sum(j in P,k in D)(!(Rj[j][k]==minx[j]))*(Rj[j][k]-minx[j])<=Rwa;
}
execute
{
writeln("PM=",OP);
writeln("RW=",RWx);
}
#DecisionOptimization#MathematicalProgramming-General