Originally posted by: Rym
no solution with epsilon=0.001;
int mySeed;
execute{
var now = new Date();
mySeed = Opl.srand(Math.round(now.getTime()/1000));
}
float epsilon=0.001;
int v = 2;
range V = 1..v;
int p=2;
int d=3;
range P = 1..p;
range D = 1..d;
int cpui[V];
int rami[V];
int diski[V];
int cpuj[P];
int ramj[P];
int diskj[P];
int VMmin=1;
int VMmax=4;
int cpum=20;
int ramm=40;
int diskm=1000;
string S[VMmin..VMmax]=["s","m","l","xl"];
int VM[i in V]=1+(rand() % (VMmax - VMmin+ 1));
string vms[i in V]=S[VM[i]];
execute VMS
{
var ofilevms = new IloOplOutputFile("resvmss.txt");
writeln("vms=",vms);
for (var i in vms)
{ ofilevms.write("'",vms[i],"',");
if(vms[i]=="s")
{
cpui[i]=1;
rami[i]=2;
diski[i]=50;
}
else if(vms[i]=="m")
{
cpui[i]=2;
rami[i]=4;
diski[i]=100;
}
else if(vms[i]=="l")
{ cpui[i]=4;
rami[i]=8;
diski[i]=150;
}
else
{
cpui[i]=8;
rami[i]=16;
diski[i]=250 ;
}
}
writeln(cpui);
writeln(rami);
writeln(diski);
};
execute PMS
{
for (var i in P)
{
cpuj[i]=20;
ramj[i]=40;
diskj[i]=1000;
}
writeln(cpuj);
writeln(ramj);
writeln(diskj);
};
//the model/problem definition
dvar boolean lumda[V][P];
dexpr int O = sum( i in V, j in P) lumda[i][j];
dvar float R[P][D];
dexpr float minx[j in P] = minl(R[j][1],(minl(R[j][2],R[j][3])));
dexpr int mini[j in P]=(minx[j]==R[j][1])*(1)+((minx[j]==R[j][2])&&(abs(minx[j]-R[j][1])>=epsilon))*(2)+((minx[j]==R[j][3])&&(abs(minx[j]-R[j][1])>=epsilon)&&(abs(minx[j]-R[j][2])>=epsilon))*(3);
dexpr float RW = sum (j in P,l in D) sum(minij in 1..3) (minij==mini[j])*(R[j][l]-R[j][minij]);
minimize RW;
//constraint
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 somme des vms hebergèes ne depasse pas le nombre de demandes satisfaites
forall(j in P)
{ res:
R[j][1]==(cpum-(sum(i in V) lumda[i][j]*cpui[i]))/cpum;
R[j][2]==(ramm-(sum(i in V) lumda[i][j]*rami[i]))/ramm;
R[j][3]==(diskm-(sum(i in V) lumda[i][j]*diski[i]))/diskm;
}
//la quantité de cpu consommée par les vms ne depasse pas 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 pas 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 pas la quantité de disk de la pm
diskr:
forall( j in P)
sum( i in V) diski[i]*lumda[i][j] <= diskj[j];
//remplissage des ressources restante
}
{int} countPM={j | i in V,j in P:lumda[i][j]==1 };
int pm= card(countPM);
execute
{
writeln("lumda= ",lumda);
writeln("R =",R);
writeln("minx= ",minx);
writeln("mini= ",mini);
writeln("RW=",RW);
writeln("VMs= ",O);
writeln("PMs= ",pm);
}
#DecisionOptimization#OPLusingCPLEXOptimizer