Originally posted by: Matt31
Hi,
I've implemented a Dantzig-Wolfe algorithm (i.e. column generation) using CPLEX to solve the LP master problem. I'm working with the Java API. There were a number of other forum postings on the subject of column generation, and I followed the instructions to reuse the same IloCplex object for each iteration of Dantzig-Wolfe. That is, I define an IloLPMatrix and only add columns directly to this between calls to IloCplex.solve(). As noted in another post, reusing this IloCplex object should maintain basis information even after I've added new columns.
https://www.ibm.com/developerworks/forums/thread.jspa?messageID=14833017� When I allow CPLEX to solve the master completely, the master's objective monotonically decreases each iteration. However, I found that when I limit the number of Simplex iterations to some small number (e.g. 10) with IntParam.ItLim, CPLEX sometimes reaches an objective that is worse than the previous iteration. This only seems possible if it's not re-using the basis status.
Accordingly, I started using setBasisStatuses() as below. However, the same problem occurs: limiting the number of iterations sometimes causes CPLEX to find an objective that is worse than the previous iteration.
cplex.setParam(IntParam.AdvInd, 1);
for (dwIter = 0; dwIter < maxDwIter; dwIter++) {
cplex.setBasisStatuses(warmStart.numVars, warmStart.numVarStatuses, warmStart.ranges, warmStart.rangeStatuses);
cplex.solve();
warmStart.numVarStatuses = cplex.getBasisStatuses(warmStart.numVars);
warmStart.rangeStatuses = cplex.getBasisStatuses(warmStart.ranges);
// Solve subproblems and add columns to |cplex|...
}
Is there a way to know for sure whether the basis is being used? If it's not, could there be something I'm missing?
Thanks a lot,
-Matt
#CPLEXOptimizers#DecisionOptimization