Originally posted by: Rym
I developped the product function but the probelm becomes no convex
my .mod file
int mySeed;
execute{
var now = new Date();
mySeed = Opl.srand(Math.round(now.getTime()/1000));
}
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=24;
int ramm=48;
int diskm=900;
string S[VMmin..VMmax]=["s","m","l","xl"];
{string} VMTypes={S[v] | v in VMmin..VMmax};
int VM[i in V]=1+(rand() % (VMmax - VMmin+ 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]=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]=cpum;
ramj[i]=ramm;
diskj[i]=diskm;
}
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 int R[P];
dexpr int RW = sum (j in P) R[j] ;
maximize 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 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];
forall(j in P) cps:R[j] == sum(i1 in V,i2 in V,i3 in V) cpui[i1]*rami[i2]*(lumda[i1][j]==1)*(lumda[i2][j]==1)*(lumda[i3][j]==1);
}
execute
{
writeln("lumda= ",lumda);
//writeln("minx",minx);
//writeln("mini",ro);
writeln("R =",R);
writeln("RW=",RW);
writeln("VMs= ",O);
//writeln("PMs= ",pm);
}
#DecisionOptimization#OPLusingCPLEXOptimizer