0

I'm implementing a branch and price algorithm in c using SCIP.

Question: To call the branching mechanism, I use the basic BRANCHEXECLP mechanism. How does SCIP know when to branch? When the current relaxation solution has non-integer solutions, right? I don't have to tell SCIP to invoked the branching mechanism for this case, right?

I'm asking because (for the most part) my B&P algorithm is working well. But, at some point it reaches a node corresponding to the dual bound solution. After solving the pricing problem (and no columns are attractive to enter the master problem), the relaxation solution at this node contains non-integer solutions, but the branching mechanism is not invoked. The run just quits. Any idea as to what is going on here?

Thanks, Rob Curry

1 Answers1

1

I guess you checked during pricing that there are fractional variables in the current LP solution?

And the dual bound at that node equals the global dual bound? Did you mark your objective to only have integral values? In that case, if the dual bound is close enough to the primal bound that rounding it up gives the same number, SCIP will just cut off the node. Perhaps also SCIP found a new solution after your pricing which was immediately proven to be optimal by the current global dual bound? SCIP automatically runs some simple rounding heuristics after each solved LP in the pricing loop.

Gerald
  • 696
  • 3
  • 7
  • Thanks for the help. Yes, there are fractional variables in the current LP solution. Yes, the dual bound at the current node is equal to the global dual bound. No, I did not mark my objective to only have integral values. The integer variables are not in the objective. The heuristics could be the problem. Is there any easy way to turn off these heuristics? – Rob Curry Feb 02 '17 at 16:45
  • And the primal bound does not equal the dual bound? The heuristics should not be a problem, they will just try to construct a feasible solution. But you can turn them off by "set heur emph off" in the interactive shell (this will turn off all heuristics). But I would not recommend that. – Gerald Feb 02 '17 at 17:15
  • You say that the run just quits, what do you mean with that? Does it claim optimality? Does it abort? If it aborts, did you run in debug mode (compile with OPT=dbg) and are there any asserts coming up? – Gerald Feb 02 '17 at 17:22
  • The primal bound does not equal the dual bound. When it "quits," it does not claim optimality. It aborts, and creates output and error files. The error file says "returned with error code 139." – Rob Curry Feb 02 '17 at 17:31
  • Ok, this might be a segfault. Could you compile in debug mode and run it in gdb to see where it crashes? – Gerald Feb 02 '17 at 17:34
  • Ok, I fixed the segfault. Now I'm getting "returned with error code 132" – Rob Curry Feb 02 '17 at 19:13
  • Are you running this with "make test"? I would recommend running the failing instance in the interactive shell, started with gdb. This should normally give you a hint about what is going wrong when it aborts. – Gerald Feb 05 '17 at 20:52