MIP ソルバーが分岐する変数を選択しようとしているノードを考えると、選択する変数の小さなサブセットを提案したいと思いますが、ソルバーのヒューリスティックとの関係を断ち切ります。これにより、整数計画問題を解くのに必要な時間を大幅に短縮できると信じるに足る十分な理由があります。私は Gurobi (Python API) を好みますが、必要に応じて別のソルバー (SCIP、CPLEX) に切り替えたいと考えています。
問題:
どのGurobi コールバック コードが、ソルバーが分岐しようとしていることを教えてくれるかわかりませんでした。 CPLEX については
BranchCallback
、詳細な例を見つけました。対応する SCIP ドキュメントは次のとおりです: How to add branching rules .ソルバーに提案したい変数のサブセットは、ノードでの緩和の解が与えられると、オンザフライで計算されます。つまり、分岐の優先順位は、緩和された問題の解に応じて、ノードごとに変化します。コールバックで分岐優先度をリセットすることが許可され、期待どおりに機能するかどうかは不明です。Gurobi のドキュメントに
BranchPriority
は記載がなく、問題 1 が解決されない限り、自分で「リバース エンジニアリング」することはできません。必要に応じて、変数のサブセットを提案するだけでなく、独自の完全な分岐ルールを作成して、関係を自分で断ち切ることもできます。ただし、これは 5 年前の Gurobi では不可能であり、ドキュメントは
Callback
状況が同じであることを示唆しています。コードを変更して SCIP や CPLEX を使用するよりも、独自の分岐ルールを実装するほうが簡単に思えるので、その Google グループの投稿で言及されている「コールバックによるカスタム部分カット」を試してみます。残念ながら、これを行う方法は私には明確ではありません。それが助けになる場合:すべての係数は整数であり、すべての変数はバイナリ変数です。