9

I have two questions on branch-bound-and-price.

  1. Why does it sometimes fail? For instance, the paper by Dabia et al shows results where the proposed algorithm fails for some cases. The paper does not explain why it fails. Is it because of the time limit? Or is there any other reason the branch-bound-and-price fail for some problems?

  2. An odd behavior of the branch-bound-and-price algorithm:

I am implementing a branch-bound-and-price algorithm with column generation for an electric vehicle routing problem to minimize a certain cost. I am modifying two software - vrpy and cspy for implementation.

My column generation currently works fine using the labeling algorithm. I know this because when I calculate the duality gap, it converges to 0 in the last iteration when there is no route found with a negative reduced cost.

I have a problem during the branch and bound though. I find that sometimes the parent node in the branch-and-bound search tree has a lower bound on the objective function value that is WORSE than the child node. This means that an additional constraint on the master problem (more bounding) has IMPROVED the objective function value for the child node.

I have double and triple-checked the master problem formulation with bounding but I don't see where it went wrong. It seems to happen when I have a larger network. It also seems to happen more when I have some negative edge costs in the network.

Does anyone know why this would be?

SecretAgentMan
  • 1,895
  • 2
  • 13
  • 39
  • 1
    "I know this because when I calculate the duality gap, it converges to 0 in the last iteration when there is no route found with a negative reduced cost": how do you calculate the duality gap? – fontanf Mar 15 '22 at 21:13
  • 3
    Hi @Dr. Soomin Woo PhD and welcome to or.stackexchange. I'm sorry to say this, but it very much sounds as if you have a bug in your code. If you have a decreasing LP value after branching, it means that you are creating some good columns (maybe not feasible?) that you did not create before branching. That is, suddenly you find columns that are either "too good to be feasible" or which should have been found before branching. – Sune Mar 16 '22 at 07:41
  • Hi @Sune. Thank you very much for your helpful comment! I indeed create some initial set of routes before starting the iterative process of column generation. For example, I create a route [source - i - sink], for all customers i in the network to visit even if this route may not be feasible and assign a cost of 10e10 (big M). Also when I add a branching constraint (ex: edge flow (i,j)=0), I add a huge cost to the edge cost for (i,j), instead of deleting all the routes that use the edge (i, j) and still include (i, j) in the network at the huge cost. Do you think that could be the reason? – Dr. Soomin Woo PhD Mar 17 '22 at 04:52
  • Hi @fontanf, thank you for reading my question! I have calculated the dual objective function in two ways. 1) the objective function of the relaxed problem + the minimum reduced cost found from pricing, and 2) the sum of all the duals of all constraints + the minimum reduced cost found from pricing. I sometimes see the difference between the two dual values.. When I say I close the duality gap, I meant the dual objective function found from 1). That's when I have found no route with a negative reduced cost and I calculate the min reduced cost to be zero. Is this wrong? – Dr. Soomin Woo PhD Mar 17 '22 at 04:52
  • 1
    @Dr.SoominWooPhD I think I would take a very close look at the routes/columns you generate after branching. It is rather hard to diagnose a code-bug at a distance, but from what you are writing, it sounds as if you create some columns, which are actually not feasible, or maybe you calculate a too low cost for these new columns, so that they are "too good to be feasible". So, inspect your newly generated columns (after branching) and calculate by hand the true cost and validate feasibility. – Sune Mar 17 '22 at 07:23
  • 1
    "assign a cost of 10e10 (big M" > what are the costs of the other routes? If they are too far from 10e10, you'll likely have numerical issues. If these routes are feasible, set them their real cost; otherwise try a to find a better bound – fontanf Mar 17 '22 at 09:27
  • 1
    Considering how you compute the duality gap, it would be 0 even if the pricing algorithm is wrong – fontanf Mar 17 '22 at 09:28
  • Thank you @fontanf. Just following up - 1) The other routes cost less than 100 and the routes that are infeasible or not allowed with respect to the bounding constraints cost 10e10. What do you mean I will likely have numerical issues? Is it too big? 2) Do you recommend another way to calculate the duality gap? – Dr. Soomin Woo PhD Mar 18 '22 at 03:12
  • 1
  • Yes, that's way to big. The difference between the smallest and the largest coefficient shouldn't exceed 10e6, and less is better. 2) No, what I mean is that you're duality gap being doesn't imply that you pricing solver works as expected. If this is not a numerical issue, it's likely an issue with the pricing solver
  • – fontanf Mar 18 '22 at 05:56
  • 1
    Maybe it's worth noting that the pricing is not standard as the edge cost/weight is dependent on the resources. This has been discussed here and here. I am not entirely sure whether this would be a source of such weird behaviour but would be helpful if someone has encountered this before, as I think this may also be a factor. – David Torres Mar 24 '22 at 11:49