Originally posted by: SystemAdmin
First, my apologies if I am misunderstanding your question. The process you describe sounds like a technique often used in the field of Constraint Programming (CP). If by chance you are coming at this problem from a CP point of view, you might be better served by trying the CP Optimizer engine that is a part of the IBM ILOG CPLEX Optimization Studio. The Forum for that engine is found at
http://www.ibm.com/developerworks/forums/forum.jspa?forumID=2066 and you might wish to re-post your question there.
I will assume from here on that you do actually mean to use Mathematical Programming techniques traditionally associated with CPLEX, and also that the process you described is being done for research purposes. If, in your initial question, you simply want CPLEX to determine an optimal solution, I'll risk stating the obvious that it is necessary only to declare the constraints and the objective function, and then call the solve() function, rather than constructing your own search algorithm using function populate().
In the process you described, with the parameter settings as you show, I would expect more than three integer feasible solutions to be found by a single call to populate(). If indeed only three were found, then that would mean only three exist. When you then add constraints that remove these solutions, the result from the next call to the populate() function should be a declaration of infeasibility, not a new solution.
Let me illustrate with a very trivial example:
Maximize
x+y
subject to
binaries
x y
end
This has four feasible solutions, (0,0), (0,1), (1,0), and (1,1). Under the maximum setting of the pool intensity parameter, as you have indicated, the populate function does find all four of these solutions. If I next add the following constraints to remove these solutions ...
-x-y<=-1
-x+y<=0
x-y<=0
x+y<=1
... it results in an infeasible model. If I omit any one of these four constraints, the associated solution is again feasible to this restricted model.
So, I don't understand how you got a feasible model if you added constraints that remove all the solutions found by populate() under its aggressive setting.
Now, on most models, it is not practical to attempt to generate all feasible solutions - there will be combinatorially many of them. If you run populate() for a while, stop and eliminate via new constraints the solutions that were found, and then run again, there won't be any guarantee of a constantly improving objective function, because it is not predictable in which order populate will find solutions, and also because a model may contain multiple solutions with a given objective function value. In the above example, with the populate limit set to 1 for explanatory purposes, populate could happen to find the solution (1,0) first, giving an objective function value of 1. If x-y<=0 is added to the model, the next call to populate might happen to find (0,0) or (0,1), giving either a worse answer or an answer of equal quality to the one just eliminated, or it might find (1,1).
(On such a simple example, the above order of solutions found isn't likely, but the point is that you can't predict the ordering.)
#CPLEXOptimizers#DecisionOptimization