Originally posted by: Kamran_Sr
Hi,
I have a model that I need to solve first, and then do a flow control to improve the solution. However, I got an issue with a while loop in this flow control. What I need to do is after solving the problem if an specific decision variable (SlackCap[i]) got a positive value, I have to change the data regarding to a set, which is the index of different decision variables, and rerun the model again until that decision variable get 0 value for all its elements. I have used a while loop to do this. The issue is, although incorporated a break statement (if (feasblity[i] = 0) break;) for the loop, the model still keeps running even all elements of SlackCap[i] equals to 0.
My script code is as follows:
main {
var source = new IloOplModelSource("Feasiblity Restoration.mod");
var cplex = new IloCplex();
var def = new IloOplModelDefinition(source);
var model = new IloOplModel(def,cplex);
var data = new IloOplDataElements();
var k = 0;
model.addDataSource(data);
data.DataExcelFile = "InputData3.xlsx";
data.NbdryportsString="dryports";
data.fixedcostString = "fixedcost";
data.allocationcostString = "allocationcost";
data.coiString = "coim";
data.ceoiString = "ceoim";
data.bijString = "bijm";
data.beijString = "beijm";
data.li1String = "leaseI1";
data.li2String = "leaseI2";
data.viString = "vi";
data.hiString = "hi";
data.CapiString = "Capi";
data.LTString = "LTi";
data.RString = "Ri";
data.InversePhiNString = "InversePhiN";
data.InverseINString = "InverseIN";
data.InitialIString = "InitialI";
var Data = new IloOplDataSource("Feasiblity Restoration.dat");
model.addDataSource(Data);
model.generate();
if(cplex.solve()){
model.postProcess();
writeln("\t cost :", cplex.getObjValue());
writeln("\t SlackCap = ",model.SlackCap);
writeln("\t Location = ",model.X);
writeln("\t Allocation = ",model.Y);
var Infeasblity = new Array(model.dryports);
for(var i in model.dryports){
Infeasblity[i] = model.SlackCap[i].solutionValue;}
var dryports = model.dryports}
while(1){
for (var i in dryports){
if (Infeasblity[i]>0){
k++;
var model2 = new IloOplModel(def,cplex);
var data3 = new IloOplDataElements();
model2.addDataSource(data3);
data3.DataExcelFile = "Restoration.xlsx";
data3.NbdryportsString = "dryports"+k;
data3.fixedcostString = "fixedcost"+k;
data3.allocationcostString = "allocationcost"+k;
data3.coiString = "coim"+k;
data3.ceoiString = "ceoim"+k;
data3.bijString = "bijm"+k;
data3.beijString = "beijm"+k;
data3.li1String = "leaseI1"+k;
data3.li2String = "leaseI2"+k;
data3.viString = "_vi"+k;
data3.hiString = "_hi"+k;
data3.CapiString = "Capi"+k;
data3.LTString = "_LTi"+k;
data3.RString = "_Ri"+k;
data3.InversePhiNString = "InversePhiN"+k;
data3.InverseINString = "InverseIN"+k;
data3.InitialIString = "InitialI"+k;
var data4 = new IloOplDataSource("Feasiblity Restoration.dat");
model2.addDataSource(data4);
model2.generate();
if(cplex.solve()) {
model2.postProcess();
writeln("\t New cost"+k+" :", cplex.getObjValue());
writeln("\t New SlackCap"+k+" = ",model2.SlackCap);
writeln("\t New Location"+k+" = ",model2.X);
writeln("\t New Allocation"+k+" = ",model2.Y);
var dryports = model2.dryports;
for(var i in model2.dryports){
Infeasblity[i] = model2.SlackCap[i].solutionValue;}
var feasblity = new Array ();
for(var i in model2.dryports){
if (model2.SlackCap[i].solutionValue == 0)
feasblity[i] = model2.SlackCap[i].solutionValue}
}
}
else if (feasblity[i] = 0)
break;
}
if (feasblity[i] = 0)
break;
}
writeln("\t Final cost:", cplex.getObjValue());
writeln("\t Final SlackCap = ",model2.SlackCap);
writeln("\t Final Location = ",model2.X);
writeln("\t Final Allocation = ",model2.Y);
}
I would be grateful if someone can help me with this issue.
Regards,
Kamran
#DecisionOptimization#OPLusingCPLEXOptimizer