1

SCIP に独自の分岐ルールを含めており、SCIPincludeBranchruleMybranchingrule()関数を使用して分岐ルール データを初期化しています。私が行うことの 1 つは、SCIPgetNVars()関数を呼び出すことです。コードを実行すると、関数が何度も呼び出されていることがわかり (B&B アルゴリズムが開始される前に、思ったように 1 回ではありませんでした)、SCIPgetNVars()関数によってトリガーされた次のエラーが表示されます。

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

SCIPincludeBranchruleMybranchingrule()ドキュメントには、この関数を使用して分岐規則データを初期化できると記載されているため、の使用について混乱しています。すべての B&B ノードで使用できるいくつかのデータを初期化したいのですが、分岐ルール データが正しい方法ではない可能性があります。

どんな助けにも感謝します!

4

1 に答える 1

2

ここで注意すべき重要なことは、変数にアクセスしたい問題はまだないということです。

SCIP の分岐規則は、データの初期化のためにいくつかのコールバックを提供します。- コールバックは、 SCIP の開始時、つまりSCIP の段階でinclude一度だけ呼び出されます。SCIP_STAGE_INITこの段階で、分岐ルールが存在することを SCIP に通知し、オプションで問題に依存しないいくつかのユーザー パラメーターを導入する必要があります。

目的に適したデータの保存を可能にするコールバック関数がさらに 2 つあります。SCIPbranchruleInitsolMybranchingruleこれは (事前に解決された) 問題が分枝限定法によって解決される直前にSCIPbranchruleInitMybranchingrule呼び出され、 は新しく読み込まれた問題が変換された後に呼び出されます。

分岐ルールの実行は分岐限定プロセス内に制限されているため、コールバックは、SCIPbranchruleInitSolMybranchingrule問題固有のすべてのデータ初期化をそこに移動することによって実装する必要があります。SCIPbranchruleExitsolMybranchrule検索が終了した場合、制限時間に達した場合、または SCIP が別の再起動が必要であると判断した場合に、分枝限定検索が終了するたびに保存されたデータを解放する実装も忘れないでください。

参考までに: インクルード コールバック中に割り当てられたデータは、SCIPbranchruleFreeMybranchingrule-callback を使用して解放できます。これは、SCIP が終了しようとしているときに 1 回実行され、残っているすべてのシステム メモリを解放します。

于 2014-07-29T16:12:04.137 に答える