Originally posted by: Rym
The .mod is attatched bellow
/*********************************************
* OPL 12.6.3.0 Model
* Author: Regaieg
* Creation Date: 11 janv. 2017 at 11:36:52
*********************************************/
int v = 10;
range V = 1..v;
int p=5;
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=21;
int ramm=40;
int diskm=1000;
string S[VMmin..VMmax]=["s","m","l","xl"];
{string} VMTypes={S[v] | v in VMmin..VMmax};
int VM[i in V]=1+(rand() % (4 - 1+ 1));
string vms[i in V]=S[VM[i]];
tuple PM
{
int npm;
string nvm;
}
{PM} indexes={<i,j> | i in P,j in VMTypes};
int countPVX[indexes];
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]=105;
}
else if(vms[i]=="l")
{ cpui[i]=4;
rami[i]=7;
diski[i]=150;
}
else
{
cpui[i]=8;
rami[i]=14;
diski[i]=250 ;
}
}
writeln(cpui);
writeln(rami);
writeln(diski);
};
execute PMS
{
for (var i in P)
{
cpuj[i]=21;
ramj[i]=40;
diskj[i]=1000;
}
writeln(cpuj);
writeln(ramj);
writeln(diskj);
};
//the model/problem definition
dvar boolean lumda[V][P];
dvar int R[P][D];
dexpr float cpuc[j in P]= (cpum-(sum(i in V,j in P) lumda[i][j]*cpui[i]))/21;
dexpr float ramc[j in P]= (ramm-(sum(i in V,j in P) lumda[i][j]*rami[i]))/40;
dexpr float diskc[j in P]= (diskm-(sum(i in V,j in P) lumda[i][j]*diski[i]))/1000;
dexpr float minx[j in P] = minl(cpuc[j],(minl(ramc[j],diskc[j])));
dexpr int mini[j in P]=(minx[j]==cpuc[j])*(1) +(minx[j]==ramc[j])*(2)+(3)*(minx[j]==diskc[j]);
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 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];
//la somme des vms hebergèes ne depasse pas le nombre des demandes satisfaites
//glob:
//fo-((fo*10)/100) <= sum (i in V, j in P) lumda[i][j];
// glob:
//fo <= sum (i in V, j in P) lumda[i][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];*/
}
execute
{
writeln(R);
}
#DecisionOptimization#MathematicalProgramming-General