Question

J'inclus ma propre règle de branchement sur SCIP et j'utilise le SCIPincludeBranchruleMybranchingrule() fonction pour initialiser certaines données de règles de branchement.L'une des choses que je fais est d'appeler le SCIPgetNVars() fonction.Lorsque j'exécute le code, je vois que la fonction est appelée plusieurs fois (pas une seule fois, comme je le pensais, avant le démarrage de l'algorithme B&B) et j'obtiens l'erreur suivante déclenchée par le SCIPgetNVars() fonction:

[src/scip/scip.c:10048] ERROR: invalid SCIP stage <0>

Je suis confus quant à l'utilisation de SCIPincludeBranchruleMybranchingrule(), puisque la documentation indique que cette fonction peut être utilisée pour initialiser les données des règles de branchement.Je voudrais initialiser certaines données qui peuvent être utilisées sur chaque nœud B&B, peut-être que les données des règles de branchement ne sont pas la bonne façon de le faire.

J'apprécierai toute aide !

Était-ce utile?

La solution

La chose importante à noter ici est qu'il n'y a pas encore de problème disponible pour lequel vous souhaitez accéder aux variables.

Les règles de branchement de SCIP fournissent plusieurs rappels pour l'initialisation des données.Le include- Le rappel n'est appelé qu'une seule fois lorsque Scip commence, alias dans le SCIP_STAGE_INIT étape du SCIP.À ce stade, vous souhaitez que la règle de branchement informe SCIP de son existence et, éventuellement, introduise certains paramètres utilisateur qui sont indépendant du problème.

Il existe deux autres fonctions de rappel qui permettent de stocker des données mieux adaptées à ce que vous avez l'intention de faire ; SCIPbranchruleInitsolMybranchingrule qui est appelé juste avant le problème (présolvé) est sur le point d'être résolu via la branche et la liaison, et SCIPbranchruleInitMybranchingrule, qui est appelé après la transformation d'un problème nouvellement lu.

Étant donné que l'exécution d'une règle de branchement est limitée au processus de branchement et de liaison, votre rappel est SCIPbranchruleInitSolMybranchingrule que vous devez implémenter en y déplaçant toutes les initialisations de données spécifiques au problème.N'oubliez pas de mettre également en œuvre SCIPbranchruleExitsolMybranchrule pour libérer les données stockées à chaque fois que la recherche de branchement et de liaison est terminée, soit si la recherche a été terminée, soit si un délai a été atteint, ou si SCIP a décidé de redémarrer à nouveau.

POUR VOTRE INFORMATION:Les données allouées lors du rappel d'inclusion peuvent être libérées avec le SCIPbranchruleFreeMybranchingrule-callback, qui est exécuté une fois lorsque SCIP est sur le point de quitter et de libérer toute la mémoire système restante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top