最良の解決策の1つは、線形計画法緩和または直接整数計画法に基づいている可能性があります。後者の場合、分岐とバックトラックは暗黙的に行われるため、自分で管理する必要はありません。
この手法を使用して2つの方法で解決されることを確認しました。境界アルゴリズムも少し改善できます。
教科書メソッド
バイナリ変数の使用 バツ私はj 表す f(i )= j、連続変数を定義できます f(i )=Σんj = 1jバツ私はj
制約を追加する Σ私バツ私はj= 1 そして Σjバツ私はj= 1 1つの位置に1つのノードのみが割り当てられることを表します。
各エッジについて、コスト ce には2つの制約があります。 ce≥ F(i )− f(j ) そして ce≥ F(j )− f(私)、あなたは最小化したい Σece
この問題を整数プログラミングソルバーに与えることができます。これにより、バックトラッキングを実行できます。または、毎回自分で線形プログラミングの緩和を解決できます(学習したい場合は、ソルバーが内部で最適化します)。
別の緩和
位置をバイナリ変数として使用する代わりに、 f(i )< f(j ) すなわちノード 私 ノードの前に移動 j。これは、自分で分岐を行い、それらの変数を明示的に指定しない場合に、より適応されます。
このアプローチを使用すると、各ノードでより高速な問題を解決できる場合があります。ここでは、このペーパーで示すように、より単純な最小コストのフロー問題として解決できます。多くの時間を調査して問題を調査する意思がない限り、私はそれをお勧めしません。
その他のテクニック
分岐限定の場合、コスト関数の下限で十分です。小さな問題の場合、境界アプローチは完全に問題ありません。
より厳密にすることもできます。ノードが配置されていないエッジごとに、可能な限り最適な無料のラベルを選択して、そのコストを見積もります。複数のエッジが異なるノードに同じ配置を使用する場合がありますが、これはコストを0と推定するよりも優れています。
このスキームにはさまざまなバリエーションがあります。ラベル付けされていないノードごとに(オーバーラップに関係なく)最適なフリーラベルを選択するか、ノードの小さなグループ内でのみオーバーラップを考慮します。