[Scip] Could a global cut be discarded ?

nikolaj@crt.umontreal.ca nikolaj at crt.umontreal.ca
Mon Jul 6 17:36:35 MEST 2009


> Hi Nikolaj,

Hi Tobias,

Thank you very much for your answer and help.

I still have some issues with global cuts not taken into account. See below.

> Now back to your questions:
>
>
> As far as I can see, you are essentially facing two issues:
>
>
> 1. The global cut pool is not separated at local nodes, because the
> "separating/poolfreq" parameter is still on its default value 0. You
> should just set it to 1 (or any appropriate positive value) in order to
> make sure that your cuts from one local node are also used in other local
>  nodes.

I've set this parameter to 1 but nothing changed. I still see my global
cut discovered/violated three times during the search.

>
> 2. Even if the global cut pool added one of your "old" cuts to the
> intermediate cut storage (from which the cuts are added to the LP after cut
> filtering), you will find the same cut again in your separator and
> basically waste the time to find an already known cut.

Ok, I understand this.

> In order to avoid
> this, my suggestion is to separate your cuts in a "delayed" fashion. This
>  means, when your cut separator is called (which is always after the
> global cut pool has already been scanned), and there are already cuts in
> the separation storage, then you just do nothing and wait for the next
> round. If you want to do this manually, you can call SCIPgetNCuts() to get
> the current number of cuts stored in the separation storage. If this is
> positive, just set *result = SCIP_DELAYED and do nothing. The
> SCIP_DELAYED
> status tells SCIP that even though your separator did not find any cuts it
>  should be called again (even on the same solution) if nobody else found
> a cut or all cuts have been discarded in the filtering step. The same thing
> can be done automatically by setting the SEPA_DELAY flag to TRUE in the
> creation of the separator plugin. For constraint handlers, this flag is
> called CONSHDLR_DELAYSEPA, see the sepa_xxx.c and cons_xxx.c templates. If
> the plugin has this flag, than SCIP only calls it if none of the higher
> priority plugins have found a cut for the current solution. If you want to
> have a finer control on when to separate cuts and when to delay your
> separator, you need to use the manual way described above. But I think you
> should be fine with the automatic way, at least if your separation
> procedure is so expensive that you really want to only call it if nobody
> else has found a cut.
>
>

This sounds like a perfect answer to my problem but I can't make it work.
Maybe I'm doing something wrong somewhere? I've tried both solution (by
hand by
calling SCIPgetNCuts() and the automatic version by setting the SEPA_DELAY
flag to TRUE)
but none of them seems to work: the global cut is still generated three
times.

I've tested each solution separately and together.

I've taken away all the other separators and added the "faulty" separator
with SEPA_DELAY flag to FALSE and tested
how many cuts where in the global cut pool. SCIPgetNCuts() always returns
0 at the beginning of the separator.

SCIPgetNCutsApplied() and SCIPgetNCutsFound() always return exactly the
same number of cuts and this number is exactly the number of discovered
cuts
by the separator. What I understand is that the same cut that was
generated three times is considered as three different cuts. Is this
correct ? But it is exactly the same cut discovered by the same separator..

>
> I hope this solves most of your issues. If not, feel free to ask again.

Thank you very much for your help.

>
>
>
> Best,
>
>
> Tobias

Best regards,

Nikolaj
>
>
>






More information about the Scip mailing list