/*********************************************
* OPL 12.5 Model
* Author: Rim
* Creation Date: 5 févr. 2016 at 00:31:15
*********************************************/
int TrS;
int TrM;
int TrL;
int TrXL;
int fo =...;
int counts;
int countm;
int countl;
int countxl;
int v = ...;
range V=1..v;
int p = ...;
range P = 1..p;
int cpuj[P] = ...;
int ramj[P] = ...;
int diskj[P] = ...;
int cpui[V];
int rami[V];
int diski[V];
int VMmin=1;
int VMmax=4;
int VM[i in V]=VMmin+rand(VMmax-VMmin+1);
string S[VMmin..VMmax]=["s","m","l","xl"];
string vms[i in V]=S[VM[i]];
execute
{
writeln("vms=",vms);
for (var i in vms)
{
if(vms[i]=="s")
{
cpui[i]=1;
rami[i]=2;
diski[i]=225;
counts++;
}
else if(vms[i]=="m")
{
cpui[i]=2;
rami[i]=4;
diski[i]=550;
countm++;
}
else if(vms[i]=="l")
{ cpui[i]=4;
rami[i]=7;
diski[i]=1100;
countl++;
}
else
{
cpui[i]=8;
rami[i]=14;
diski[i]=2200;
countxl++;
}
}
writeln ("cpui[]=",cpui);
writeln ("rami[]=",rami);
writeln ("diski[]=",diski);
writeln("le nombre de vms en S est égal à ",counts);
writeln("le nombre de vms en M est égal à ",countm);
writeln("le nombre de vms en L est égal à ",countl);
writeln("le nombre de vms en XL est égal à ",countxl);
};
//the model/problem definition
dvar boolean lumda[V][P];
dexpr int O = sum( i in V, j in P) lumda[i][j];
{string} VMTypes={S[v] | v in VMmin..VMmax};
dexpr int ODPerVMType[vtype in VMTypes]=sum( i in V, j in P:vms[i]==vtype) lumda[i][j];
maximize O;
//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];
}
float TrSF;
execute
{
TrS=ODPerVMType["s"];
TrM=ODPerVMType["m"];
TrL=ODPerVMType["l"];
TrXL=ODPerVMType["xl"];
TrSF=(counts-TrS)/counts;
TrMF=(countm-TrM)/countm;
TrLF=(countl-TrL)/countl;
TrXLF=(countxl-TrXL)/countxl;
writeln("*** "," ",TrSF," ",TrMF," ",TrLF," ",TrXLF,"***");
}
main {
var status = 0;
thisOplModel.generate();
// This is an epsilon value to check if reduced cost is strictly negative
var ofile = new IloOplOutputFile("res.txt");
var min=20;
var max=50;
var mix=max-min+1;
for(var j=1;j<=100;j=j+(min+(Opl.rand(mix))))
{
var sumTrSF=0;
for (var i=0; i<=5;i++)
{
writeln("######Ittération numéro ", i,"#######");
writeln("");
// Retrieving model definition, engine and data elements from this OPL model
// to reuse them later
var masterDef = thisOplModel.modelDefinition;
var masterCplex = cplex;
var masterData = thisOplModel.dataElements;
// Creating the master-model
var masterOpl = new IloOplModel(masterDef, masterCplex);
masterData.v=j;
masterOpl.addDataSource(masterData);
writeln("solving with ",j," vms");
masterOpl.generate();
var O;
if ( masterCplex.solve() )
{
masterOpl.postProcess();
sumTrSF+=masterOpl.TrSF;
O = masterCplex.getObjValue();
}
else
{
writeln("No solution to master problem!");
}
// Preparing sub-model source, definition and engine
var subSource = new IloOplModelSource("mod2.mod");
var subDef = new IloOplModelDefinition(subSource);
var subCplex = new IloCplex();
// Ceating the sub model
var subOpl = new IloOplModel(subDef,subCplex);
// Using data elements from the master model.
var subData = new IloOplDataElements();
subData.fo = O;
writeln("Nouveau valeur de fo est égal à ", O);
subData.v = masterOpl.v;
subData.p = masterOpl.p;
subData.cpui = masterOpl.cpui;
subData.rami = masterOpl.rami;
subData.diski = masterOpl.diski;
subData.cpuj = masterOpl.cpuj;
subData.ramj = masterOpl.ramj;
subData.diskj = masterOpl.diskj;
subData.vms = masterOpl.vms;
writeln("sum of TrMs=",sumTrSF);
}
}
}