有向グラフで非共有エッジの最大数を一緒に含むサイクルを見つける方法は?


26

私はコンピューター科学の理論家ではありませんが、この現実の問題はここにあると思います。

問題

私の会社には、全国にいくつかのユニットがあります。

従業員に別のユニットで作業する可能性を提供しました。しかし、条件があります:ユニットの労働者の総数は変更できません。

つまり、誰かが自分の場所を望んでいる場合、従業員が自分の部署を離れることを許可します。

(架空の)リクエストデータの例:

Name            Origin    Destination
Maria              1  ->  2
Marcos             2  ->  3
Jones              3  ->  4
Terry              4  ->  5
Joe                5  ->  6
Rodrigo            6  ->  1
Barbara            6  ->  1
Marylin            1  ->  4
Brown              4  ->  6
Benjamin           1  ->  3
Lucas              4  ->  1

上記、プロット: 上記データの視覚化

赤、青、黒のオプションをどのように選択する必要があるかをご覧ください。

27個のユニットと751個のリクエストがあるため、実際の問題はもう少し複雑です。視覚化を見てください

目標

すべての要求を収集したら、それらのほとんどをどのように満たすのでしょうか?

Theory(?)アプリケーション

グラフを持ち、すべてのユニットを頂点Vとし、リクエストを有向エッジEとするG(V,E)VEとし、交換が成功すると有向サイクルの形をとります。

各サイクルは 1回だけ使用する必要があります(労働者はユニットを2回離れることはできません)が、Vを数回訪問できますユニットは多くの労働者を退去させたい場合があります)。EV

質問

この問題が次のように表現される場合

「有向グラフで非共有エッジの最大数を一緒に含むサイクルを見つける方法」

ほとんどの要求者を満足させますか?

それは本当です、そのサイクルの最適なセットを見つけるアルゴリズムがありますか?

この貪欲なアプローチは問題を解決しますか?

  1. Gで最大の有向サイクルを見つけるGます。
  2. からエッジを削除します;G
  3. 有向サイクルがなくなるまで1を繰り返します。G

手伝って頂けますか?

元の問題を説明する別の方法を知っていますか(リクエスターのほとんどを幸せにします)?

編集:部門をユニットに変更し、問題をより適切に説明します。


3
同じエッジを複数回使用することを避けたいだけですか?アプリケーションの説明から、同じ頂点を複数回使用することは避けてください。これはより強力な条件です。
伊藤剛

3
@TsuyoshiIto:説明からわかるように、条件は各頂点で入次数が出次数と等しくなければならないということです。したがって、頂点の独立性は必要ありません。
岡本佳生

7
ところで、私の理解が正しければ、ネットワークフローを使用して多項式時間で問題を解決できるはずです。つまり、エッジに沿ったフローの単位に利益の単位を与え、各エッジに単位容量を与えた場合、問題は最大の利益の循環を見つけることです。
岡本佳生

3
この投稿では、問題の一般化について説明しますokasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html(各人が取引するアイテム、つまり仕事の配置を持っていると考えてください)。
ラドゥグリゴール

4
素晴らしい質問です。私たちがやっていることは実際に実際に使用できるような気がします。
Gopi

回答:


9

OK、TradeMaximizerのコードを読んで、次のより一般的な問題を解決できると思います。

問題:アークにコストのかかる有向グラフが与えられます。最初にカバーされる頂点の数を最大化し、2番目に総コストを最小化する頂点分離サイクルのセットを見つけます。

ここで尋ねられた質問を解決するには、頂点を従業員にし、xyの仕事を希望する場合に単位コストのの弧を描きます。従業員はエッジではなく頂点になっていることに注意してください。良いことは、従業員が「私は本当にyの仕事が欲しいが、zの仕事もやりたい」と言うことができるということです。バツyバツyyz

溶液:

  1. 次のように2部グラフを作成します。元のグラフの各頂点について、左頂点x L、右頂点x R、およびアークx Lx Rを導入します。グラフ)。元のグラフの各アークx yについて、2部グラフにアークx Ly Rを導入します。バツバツLバツRバツLバツRバツyバツLyR

  2. 二部グラフで最小コストの完全一致を見つけます。

あまりにも元のグラフのいくつかの前処理があります:SCCの間に削除アークは、その後、サイズのすべてのSCCを処理>1上記のように。

(実際、TradeMaximizerは、最大サイクルの長さなど、他のことを発見的に最適化するために、上記の2つの基準に従って、すべての最適なソリューションを反復します。大きなサイクルは、人は心を変えます。)

PS:著者のクリス・オカサキは、これがコードの機能であることをブログ投稿で確認しました。


TradeMaximizerを使用して、元の問題の解決策を見つけることができました。明日詳細を投稿します。
モトボイ

motobói@しかし、あなたがする必要があるすべては、私は2番目の段落で書いたものである...
ラドゥグリゴール

:私は、アルゴリズムについては、この説明を見つけboardgamegeek.com/wiki/page/TradeMaximizer
motobói

強力に接続されたコンポーネント間のアークを除去する必要がある理由について説明したり、説明を指摘したりできますか?
モトボイ

@motobói、これは最適化です(平均的な場合)。ステップ(1)および(2)で十分です。
ラドゥグリゴール

22

これは、標準的な最小コストの循環問題です。各有向エッジ容量与えるおよびコストを- 111ます。その場合、実行可能な循環は、エッジが互いに素な方向のサイクルの合計(つまり、結合)であり、循環のコストはエッジの数の否定です。

すべてのコストと容量は定数によって制限されているため、単純なサイクルキャンセルアルゴリズムは、多項式時間で必要な循環を見つけます。これは、明らかな欲張りアルゴリズムとほぼ同じです。

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

ここで、サイクルのコストは、エッジのコストの合計です。負のコストサイクルは、時間のBellman-Ford最短経路アルゴリズムを使用して見つけることができます。各反復は、最初の(空の)循環コスト有する少なくとも1による電流循環のコスト低減0を、最終的な循環が、少なくともコストを有する- Eを。したがって、アルゴリズムは最大E回の反復後に終了するため、その合計実行時間は最大O V E 2OVE0EEOVE2です。

これは既知の最速のアルゴリズムではありません。


人が複数の「ユニット」で働きたくない限り、これはうまくいくと思いますか?元の質問のフレージングを使用します。しかし、もし人々が複数のユニットで働きたいなら、この抽象化が崩れるのではないかと疑います。OPは1つだけのユニットの観点から問題を述べましたが、これはむしろ人為的に私を制約しているようです。[好みは1つだけの人間...?]
vzn

1
「人」と「ユニット」とは何ですか?これはグラフに関する質問です。
ジェフ

私は困惑しています:私の例はこのアルゴリズムの反例ではありませんか?Cを選択した後、サイクルC_1およびC_2はサイクルではなくなります(各サイクルに1つの反転エッジがあるため)。Cは、エッジを反転させた後にコストがプラスになり、新しいサイクルが導入されないため、再び使用されることはありません。同じ問題について話しているのでしょうか?問題の数学的定式化が必要です。
FiB

3
選択(および反転)した後、CCC1C2CCC1C2C=C1+C2C

どうやら「ユニット」は「部門」のようなものであり、ユーザーは部門間の転送要求を記録しています(部門内の正確な特定のポジションではありません)?FIBダイアグラムには、ユニットが頂点として、エッジがユニット間のempl要求としてユニットを持っているようです。FiB--「問題の数学的定式化が必要です」..正確な定式化を提供するのは本当にあなた次第です..途中にいるようです..
vzn

4

この貪欲なアプローチは、常に最良のソリューションを提供するとは限りません。

Cn{v1v2vnv1}C1C2n1C

CnC1C2それぞれ1つのエッジを失い、サイクルではなくなります。

C1C22n1=2n2

n2


-3

おそらくこれを解決するグラフ理論の方法/定式化がありますが、この問題は、すべての順列の一部が拒否され、他が有効な順列問題に似ています。順列は従業員であり、役職は会社の「役職」です。「人[x]が位置[y]を望んでいる」という要件に適合しない場合、置換は拒否されます。ユニット/部門/組織の境界の区別は、この場合のソリューションには明らかにいくらか余分です。

制約付きのこのタイプの順列問題は、SAT(充足可能性)問題のインスタンスに容易に変換できます。ブール変数の割り当ては従業員を表し、制約句は「person [x] wants position [y]」制約を表します。これには近くに古典的な例があります。通常、「ディナーテーブル」問題と呼ばれるもので、座席位置とゲストがあり、すべてのゲストが隣同士に座っているわけではありません。

そしてもちろん、PCにはおよそ数百の変数と節が関係するかなり大きなインスタンス用に、そして問題が「ハード」でない場合は数千に及ぶ洗練されたSATソルバーがあります。

例えば、専門的な参考文献については[1]を、クラス演習については[2]を参照してください。また、鳩が鳩の穴に割り当てられ、鳩よりも多いか少ない穴があるSATサークルでよく研究されている「鳩穴問題」と呼ばれるものと構造的な類似性があります。ただし、その場合、ハトは一般的に交換可能と見なされます。言い換えれば、夕食のテーブルの問題は、より強い制約のある鳩の巣の問題のようなものであり、ゲスト/ハトには好みが必要です。

もちろん、これらのタイプの問題については、制約に応じて「そのような制約付きソリューションは存在しない」という答えになる可能性があることに注意してください。

[1] cratoによるディナーテーブルアルゴリズム

[2] CS402プリンストンHW SAT

[3] 充足可能性の問題、ウィキペディア


私はtrademaximizerを使用して順列を試しました。従業員を、ユニットXとユニットYを交換するユーザーとして設定します。しかし、ソフトウェアは、同じアイテム(彼のユニット)を取引する複数のユーザーを許可しません。各アイテムは一意である必要があります。これに対応するには、[(ジョーンズ)Unit-C-JamesをUnit-D-LauraまたはUnit-D-SergioまたはUnit-D-Maryと
交換したい
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.