バイパイトグラフをサブグラフに分割するためのアルゴリズム
-
29-09-2020 - |
質問
バイパリットグラフを特定の制約を持つサブグラフに分割するためのアルゴリズムを探しています。既存のアルゴリズムが私の問題を解決したかどうかにかからないかどうかはわかりません。
私は、ノードが顧客である無向のバイパイトグラフを持っています( $ c $ )およびサービス( $ s $ < /スパン>)これをいくつかの小さなサブグラフに分割し、各サブグラフ内のサービス量をいくつかの最大数 $ n $ に制限します。残念ながら、グラフの接続性が高すぎるので、切断されたサブグラフを探すことは十分ではないので、私はサービスを複製する必要があると思います。
正式には、次のような一連のサブグラフが欲しいのですが。
- 各顧客 $ c \ c $ は正確に1つのサブグラフ に表示されます。
- すべてのエッジが正確に1つのサブグラフ(顧客が表示されているもの)に表示されます
- 各サービス $ s は、任意の数のサブグラフに表示されることができます(スプリットを支援するためのサービスが重複しても大丈夫です)
- 各サブグラフは、 $ n $ サービスを持つ必要があります( $ n $ は指定された定数です。それは、任意の顧客に接続されている最高のサービスよりも大きくなることが保証されています)
- サブグラフはできるだけ多くの顧客を持つべきです(この制限なしで、各顧客を自分のサービスのコピーで自分のサブグラフに入れることによって機能的に解決可能です)。それは正式に証明されるのではなく発見的なことがあります。
誰もこれを行うためのアルゴリズムを提案することができますか?ノードの数は巨大ではありません(およそ1000の顧客、100人のサービス、各顧客は5つ以下のサービスに接続しています)ので、ブルート力の近づき、またはBig-Oスケーリングが悪い人が適切であるかもしれません。
解決
それはNP-HARDであるかもしれないように匂いがします。
SATソルバーまたはILPソルバーを使用する方法は1つです。ほとんどの $ m $ サブグラフを持つことを決定したいとします。次に、ブール変数を持つことができます。 $ x_ {i、k}、y_ {j、k} $ $ $ i$ はサブグラフ $ k $ とservice $ j $ がサブグラフ $ k $ 。あなたはあなたの要求に基づいて束の制約(節)を入手してから、SATソルバーまたはILPソルバーに実行可能な解決策を見つけることができます。最悪の走行時間は指数関数的です。これはあなたの状況で十分にうまく機能しないかもしれません。