この問題があります。残りのエッジの数が最大化される (またはカットされるエッジの数が最小化される) という制約に従って、x ノードと nx ノードの 2 つのサブグラフに分割したい n ノードのグラフがあります。
それが理にかなっているのかどうかはわかりません。グラフ理論の人ではありませんが、これは私の問題の抽象的なバージョンです。役立つ可能性のあるアルゴリズムは何ですか?
これは宿題の問題ではありません。面白い問題だと思います!
Cで実装する予定です。
この問題があります。残りのエッジの数が最大化される (またはカットされるエッジの数が最小化される) という制約に従って、x ノードと nx ノードの 2 つのサブグラフに分割したい n ノードのグラフがあります。
それが理にかなっているのかどうかはわかりません。グラフ理論の人ではありませんが、これは私の問題の抽象的なバージョンです。役立つ可能性のあるアルゴリズムは何ですか?
これは宿題の問題ではありません。面白い問題だと思います!
Cで実装する予定です。
The special case where x = n - x is called the minimum bisection problem and is NP-hard. This makes your problem NP-hard as well. There are several heuristics described in the Wikipedia article on graph partitioning, including local search (e.g., start with a random cut and repeatedly swap pairs of vertices that decrease the size of the cut) and spectral methods (e.g., compute and threshold the second eigenvector). If n is small, integer programming is also a possibility.
おそらく、ノードに対する深さ優先検索です。ノードを 1 つずつ割り当て、それまでのカット数をカウントします。その数が最適なソリューションの数を超える場合、このソリューションを中止してバックトラックします。
私はこれを Prolog タイプのアルゴリズムとして想像してきましたが、C でそれを行うのはそれほど難しいことではありません。バックトラックとは、最後に割り当てられたノードの割り当てを解除することを意味します。
基本的に、最小カット問題の修正版を見ています。
1 つの方法は、karger のアルゴリズムを変更することです。 Karger のアルゴリズム では、最終的に頂点が 2 つになるまで、ランダムなエッジに沿って頂点を収縮させます。残りのエッジはカットを表します。ランダムなので、これを何度も行い、カット内のエッジが最も少ないソリューションを維持します。
変更されたバージョンでは、頂点が x 回折りたたまれたら、折りたたみを停止して外向きのエッジをカウントし (これらはあなたのケースではカットになります)、適切な回数だけ実行すると、解決策が得られます。トリッキーな部分は、信頼性を満足のいく限界まで高めるために計算を何回繰り返すかを考え出すことです