4
$\begingroup$

I want to use SCIP to run a pure cutting planes algorithm on a MIP.

Setting limits/nodes = 1 and increasing the limit of the maximum separated cuts at the root separating/maxcutsroot = 2147483647 alone do not produce the expected behavior.

What is the correct parameter setup?

Self-answer for future reference. The solution is provided below.

$\endgroup$

2 Answers 2

3
$\begingroup$

Several mechanisms must all be disabled. A cut separation loop in SCIP is

  1. solve LP
  2. separate global cut pool
  3. call separators
  4. filter cuts
  5. add surviving cuts to LP
  6. repeat.

Accordingly, the following parameters should be adjusted (replace setParam with the equivalent call on your environment).

Node limit.

Prevents branching.

setParam("limits/nodes", 1)

Global stall count cap.

Separation stops after a few rounds (10 is default) without dual bound improvement.

setParam("separating/maxstallroundsroot", -1)

Global cut count cap.

Default is 2000 cuts per round at the root.

setParam("separating/maxcutsroot", 2147483647)

Per-separator round limits.

Each separator has its own maxroundsroot, and the loop exits when all separators exhaust their own cap.

SCIP_SEPARATORS = [
    "aggregation", "clique", "closecuts", "cmir", "convexproj",
    "disjunctive", "dualbound", "eccuts", "flowcover", "gomory",
    "impliedbounds", "intobj", "lagromory", "mcf", "mixing",
    "oddcycle", "rapidlearning", "rlt", "strongcg", "zerohalf",
]
for sep in SCIP_SEPARATORS:
    try:
        setParam(f"separating/{sep}/maxroundsroot", -1)
        setParam(f"separating/{sep}/maxsepacutsroot", 2147483647)
    except Exception:
        pass  # separator absent in this SCIP build

Cut filters.

SCIP discards cuts whose efficacy is below minefficacyroot or whose direction is too parallel to existing cuts via minorthoroot.

setParam("separating/minefficacyroot", 0.0)
setParam("separating/hybrid/minorthoroot", 0.0)
$\endgroup$
0
$\begingroup$

Besides the mentioned answer, please note that neither SCIP nor the rest of today's modern solvers would be used as a pure cutting-plane algorithm, for many implemented hidden staff that may not be turned off anyway. However, many internal features need to be switched off. Some of them were written in the previous answer, and you can add the following for having more control over the solver behaviour.

  • To turn the presolving and heuristics totally off:
model.setPresolve(SCIP_PARAMSETTING.OFF)
model.setHeuristics(SCIP_PARAMSETTING.OFF)
  • To push the solver to use the maximum armor of the separation procedure:
model.setSeparating(SCIP_PARAMSETTING.AGGRESSIVE)
  • To stop as soon as the total number of nodes ever created reaches 1
model.setLongintParam("limits/totalnodes" , 1)
  • To turn a specific cut off:
model.setIntParam("separating/strongcg/freq", -1)
model.setIntParam("separating/gomory/freq", 20000)
model.setIntParam("separating/aggregation/freq", -1)
model.setIntParam("separating/mcf/freq", -1)
model.setIntParam("separating/closecuts/freq", -1)
model.setIntParam("separating/clique/freq", -1)
model.setIntParam("separating/zerohalf/freq", -1)
model.setIntParam("separating/rlt/freq", -1)
model.setIntParam("separating/flower/freq", -1)
  • To prioritize the random branching rule of the default rule with strong branching
model.setIntParam("branching/random/priority", 20000)

And if you would like to turn off the cuts entirely:

model.setParam("separating/maxcuts", 0)
model.setParam("separating/maxcuts", 0)
model.setParam("separating/maxcutsroot", 0)
model.setParam("separating/maxrounds", 0)
model.setParam("separating/maxroundsroot", 0)
$\endgroup$

Your Answer

Draft saved
Draft discarded

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.