[SCIP] Number of heuristic's calls
Gregor Hendel
hendel at zib.de
Fri May 11 16:16:26 CEST 2018
Hi Andre,
Is the if-statement really the last thing in the execution callback?
Then I am not surprised.
When we write a heuristic, we generally try to make it return as fast as
possible if some necessary preconditions are not satisfied, as it is in
your case.
I guess that you set the result pointer to
*result = SCIP_DIDNOTFIND
prior to your new if-statement?
If so, this will still increase the run counter by 1 for the statistics.
The correct result stages should be
*result = SCIP_DIDNOTRUN
if( ... )
{
return SCIP_OKAY;
}
// all conditions are satisfied, run the heuristic
*result = SCIP_DIDNOTFIND;
// ...
if( foundsol )
*result = SCIP_SUCCESS;
Cheers,
Gregor
Am 11.05.2018 um 15:59 schrieb André Filipe Lanca Serrano:
> Hi Gregor,
>
> Thanks for the tips.
>
>> Most likely, SCIP decides to restart the solution process, such that
>> effectively not only 1, but 2 root nodes are evaluated. -> Exactly!
>
> I already verified the logs and SCIP is actually restarted.
>
> I included a statement into the end of heurExec callback to return
> immediately if SCIPheurGetNCalls(heur) > 0 like this:
>
> /** execution method of primal heuristic */
> static
> SCIP_DECL_HEUREXEC(heurExecAtfmGA)
> { /*lint --e{715}*/
>
> ...
>
> /* only call heuristic once at the root */
> if (SCIPgetDepth(scip) <= 0 && SCIPheurGetNCalls(heur) > 0)
> {
> return SCIP_OKAY;
> }
> return SCIP_OKAY;
> }
>
> It still runs my heuristic twice at the root node... What am I doing
> wrong here?
>
>
> Quoting Gregor Hendel <hendel at zib.de>:
>
>> Hi Andre,
>>
>> the properties look good for the purpose you describe, although I
>> would suggest to use the letter 'M' to indicate a heuristic of that
>> name :)
>>
>> Most likely, SCIP decides to restart the solution process, such that
>> effectively not only 1, but 2 root nodes are evaluated. Can you
>> verify whether SCIP actually restarted from some log file output?
>>
>> If you really want to run only once, you have to include a statement
>> into the heurExec callback to return immediately if
>> SCIPheurGetNCalls(heur) > 0.
>>
>> Hope this helps,
>> Gregor
>>
>> Am 09.05.2018 um 16:33 schrieb André Filipe Lanca Serrano:
>>> Hi to all,
>>>
>>> I created an heuristic and I would like to call it just once, in the
>>> root node, as the first heuristic. I'm using the following
>>> properties in my heuristic.
>>>
>>> #define HEUR_NAME "myheuristic"
>>> #define HEUR_DESC "My heuristic"
>>> #define HEUR_DISPCHAR 'g'
>>> #define HEUR_PRIORITY 99999999
>>> #define HEUR_FREQ 0
>>> #define HEUR_FREQOFS 0
>>> #define HEUR_MAXDEPTH -1
>>> #define HEUR_TIMING SCIP_HEURTIMING_BEFORENODE
>>> #define HEUR_USESSUBSCIP FALSE
>>>
>>> After running my project I get two calls from my heuristic using the
>>> method SCIPheurGetNCalls(heur). What am I doing wrong here? Am I
>>> missing smth? I followed all the instructions on how to add primal
>>> heuristics and I guess it's smth to do with the properties...
>>>
>>> Thank you in advance.
>>>
>>> Kind regards,
>>> André Serrano
>>>
>>> _______________________________________________
>>> Scip mailing list
>>> Scip at zib.de
>>> https://listserv.zib.de/mailman/listinfo/scip
>>
>> _______________________________________________
>> Scip mailing list
>> Scip at zib.de
>> https://listserv.zib.de/mailman/listinfo/scip
>
>
>
> _______________________________________________
> Scip mailing list
> Scip at zib.de
> https://listserv.zib.de/mailman/listinfo/scip
More information about the Scip
mailing list