ScipincludebranchrulemybranchiningRule () chiamato molte volte
-
21-12-2019 - |
Domanda
Sono inclusa la mia regola di ramificazione su Scip e sto usando la funzione SCIPincludeBranchruleMybranchingrule()
per inizializzare alcuni dati di regole di ramificazione.Una delle cose che faccio è chiamare la funzione SCIPgetNVars()
.Quando eseguo il codice, vedo che la funzione è chiamata molte volte (non una volta, come pensavo, prima che inizi l'algoritmo B & B) e ottengo il seguente errore attivato dalla funzione SCIPgetNVars()
:
.
[src/scip/scip.c:10048] ERROR: invalid SCIP stage <0>
Sono confuso sull'uso del SCIPincludeBranchruleMybranchingrule()
, poiché la documentazione afferma che questa funzione può essere utilizzata per inizializzare i dati delle regole di ramificazione.Vorrei inizializzare alcuni dati che possono essere utilizzati in ogni nodo B & B, forse i dati di regole di ramificazione non sono il modo giusto di farlo.
apprezzerò qualsiasi aiuto!
Soluzione
La cosa importante da notare qui è che non ci sono problemi disponibili per i quali si desidera accedere alle variabili.
Le regole di ramificazione della SCIP forniscono diverse callback per l'inizializzazione dei dati. Il include
-
La callback viene chiamata solo una volta quando inizia a Scip, AKA nella fase SCIP_STAGE_INIT
di Scip.
In questa fase, vuoi che la regola di ramificazione informi lo scip che esiste, e facoltativamente introdurre alcuni parametri utente indipendenti dal problema .
Ci sono altre due funzioni di callback che consentono di memorizzare i dati che sono più adatti per ciò che intendi fare; SCIPbranchruleInitsolMybranchingrule
che è chiamato poco prima del (presunto)
Il problema sta per essere risolto tramite ramo e rilegato, e SCIPbranchruleInitMybranchingrule
, che viene chiamato dopo che un nuovo problema di lettura è stato trasformato.
Poiché l'esecuzione di una regola di ramificazione è limitata all'interno del processo di branch-and-bound, il callback è SCIPbranchruleInitSolMybranchingrule
che è necessario implementare spostando tutti i problemi specifici per l'inizializzazione dei dati. Non dimenticare di implementare anche SCIPbranchruleExitsolMybranchrule
per liberare i dati memorizzati ogni volta che la ricerca branch-and-legato viene terminata, o se la ricerca è stata terminata, o se un termine è stato colpito, o Scip deciso che vuole un altro riavvio. .
FYI: i dati assegnati durante la richiamata includono possono essere liberati con la callback SCIPbranchruleFreeMybranchingrule
-richiamata, che viene eseguita una volta quando Scip sta per uscire e liberare tutta la memoria di sistema sinistra.