We are trying to implement Benders Decomposition for a Fixed charge facility location-allocation problem given in Daskin.
We have decomposed the problem into master and sub problems and then tried to insert the capacity constraint as a Lazycut using MIPSOL. It is working fine and giving me the optimal solution.
But, I am not sure whether the implementation part is correct or not.
We are getting objective value and bound for the considered minimization problem through the following commands.
def mycallback(model, where):
if where == GRB.Callback.MIPSOL:
obj = model.cbGet(GRB.Callback.MIPSOL_OBJ)
bound = model.cbGet(GRB.Callback.MIPSOL_OBJBND)
then, we are inserting lazy constraint by model.cbLazy using the feedback from the sub problem.
The objective and bound list :
Obj list-->> [8550, 8550, 8900, 8900, 23780, 31345, 27745, 28350, 30460, 30037, 30246, 28450, 29870, 27760, 29330, 29280]
Bound list--->> [-1e+100, -1e+100, -1e+100, 0.0, 20780.0, 20780.0, 20780.0, 24935.995627686796, 24935.995627686796, 25285.145721177472, 25820.18344674822, 26915.25982256021, 26915.25982256021, 27093.500000000004, 27093.500000000007, 27169.56521739131]
For the minimization problem, the obj value should be decreasing continuously in each iteration, but this is not the case here. As we can see in the Obj list, the obj value is not decreasing continuously, but fluctuating.
Please suggest if this behavior is common or we are making some mistakes during implementation.
The code and the log file of the solution is attached through dropbox.
Thanks and Regards
Please sign in to leave a comment.