Originally posted by: Rym
Cplex generate negative numberz when my contraints oblige all the values to be positive. Thanks
The model:
float Rwa=0.145614029;
int fo =5;
int v = 5;
range V = 1..v;
int p=5;
range P = 1..p;
int d=3;
range D=1..d;
string vms[V]= ["l", "x" ,"x" ,"x" ,"m"];
//string PMs[1..p] = ...;
//int counts = ...;
//int countm = ...;
//int countl = ...;
//int countxl = ...;
int cpui[V] = [4, 8, 8, 8, 2];
float rami[V]=[15,30,30,30,7.5] ;
int diski[V] = [80,160,160,160,32];
int cpuj[P];
float ramj[P];
int diskj[P];
int VMmin=1;
int VMmax=4;
string S[VMmin..VMmax]=["s","m","l","x"];
{string} VMTypes={S[v] | v in VMmin..VMmax};
int OSmod=0;
int NbSS=0;
int NbSM=0;
int NbSL=0;
int NbSXL=0;
float Trs=0;
float Trm=0;
float Trl=0;
float Trxl=0;
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;
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];
dvar boolean phy[P];
//dexpr int O = sum( i in V, j in P) lumda[i][j];
dvar float Rj2[j in P,l in D];
dvar float Rj[j in P,l in D] in 0..1 ;
dvar float ro[P] in 0..1;
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]==ro[j]))*(Rj[j][k]-ro[j]);
dexpr float Rk=sum(j in P,k in D) Rj2[j][k];
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];
forall(j in P)
{cv:
Rj[j][1]==(cpum-(sum(i in V) lumda[i][j]*cpui[i]))/cpum;
Rj[j][2]==(ramm-(sum(i in V) lumda[i][j]*rami[i]))/ramm;
Rj[j][3]==(diskm-(sum(i in V) lumda[i][j]*diski[i]))/diskm;
}
forall(j in P,k in D)
{ cps: ro[j]<=Rj[j][k];
}
glob:
fo <= sum (i in V, j in P) lumda[i][j];
cpx: forall(j in P,k in D) Rj[j][k]>=0;
cpd:forall(j in P,k in D) Rj2[j][k]>=0;
rwco:
Rk<=Rwa;
rkx:
forall(j in P,k in D) (!(Rj[j][k]==ro[j])) => (Rj2[j][k]==(Rj[j][k]-ro[j]));
forall(j in P,k in D) ((Rj[j][k]==ro[j])) => (Rj2[j][k]==0);
}
execute
{
writeln("RWa",Rwa);
writeln("RWk",Rk);
writeln("RW=",RWx);
writeln("Rj2=",Rj2);
writeln("Rj=",Rj);
writeln("ro=",ro);
}
The result:
[90 90 90 90 90]
[375 375 375 375 375]
[1520 1520 1520 1520 1520]
// solution (optimal) with objective 1
RWa0.145614029
RWk0.145614029
RW=0.145614029
Rj2= [[0.05614 0.089474 -2.7756e-17]
[-2.0292e-9 -2.0292e-9 -2.0292e-9]
[-2.7756e-17 -2.7756e-17 -2.7756e-17]
[-2.7756e-17 -2.7756e-17 -2.7756e-17]
[-2.7756e-17 -2.7756e-17 -2.7756e-17]]
Rj= [[0.66667 0.7 0.61053]
[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]]
ro= [0.61053 1 1 1 1]
Thanks
#DecisionOptimization#OPLusingCPLEXOptimizer