[Scip] Separation in Diving Mode
Jonas Witt
jonas.witt at rwth-aachen.de
Thu Jul 18 11:56:21 MEST 2013
Hi all,
I have written a separator (in GCG but I have a SCIP problem) which
holds a non-basic feasible solution x and tries to separate this
solution by applying the follwing strategy:
It calculates a basic feasible solution x* , generates cutting planes
which cut off x* and adds all generated cutting planes which also cut
off x to the separation storage. I call SCIPstartDive(), change the dive
objective by SCIPchgVarObjDive() and obtain x* by solving the dive LP
(SCIPsolveDiveLP()). Then I call SCIPseparateSol() with solution NULL
and store the cuts which cut off x.
This works fine, but sometimes there are some problems with the function
SCIProwGetObjParallelism() which is called when adding a cut to the
separation storage. It calculates the scalar of
row*lpobj/||row||*||lpobj|| where || || is the square norm. Since it
uses the current LP's objective function (which has changed due to
SCIPchgVarObjDive()), some of the values stored in the row or the
current LP are wrong. This leads to a wrong calculation and for example
to the following error:
src/scip/lp.c:6731: SCIProwGetObjParallelism: Assertion
`SCIPsetIsSumLE(set, parallelism, 1.0)' failed.
I tried to set lp->objsquarenormunreliable = TRUE in
SCIPlpMarkDivingObjChanged() and in SCIPendDive(). First, this worked
for me. But now the problem occurred again. Should I recalculate the
norms which are stored in the row everytime I call
SCIProwGetObjParallelism() or is there an easier way to avoid errors
like that?
Best regards,
Jonas
More information about the Scip
mailing list