web-dev-qa-db-ja.com

N人のグループがあり、各人がM個のアイテムの1つを販売または購入したい場合、交換のためにそれらの間で閉じたパスを見つける方法を教えてください。

N人とM個のアイテムがあるとします(人が特定のアイテムを持っている場合、通常は1個しか持っていません)。例えば、

  • 人1はアイテムA、C、Dを持っていて、アイテムFを望んでいます
  • 人2はアイテムB、Cを持っていて、Eを望んでいます
  • 人3はアイテムEを持っていて、Gを望んでいます

    .。

あなたはその考えを理解します。つまり、これは基本的に需要と供給のマッチングの問題であり、これを人とアイテムのマトリックスとして表すと、非常にまばらなものになります。

だから私の質問は次のようになります:

  1. 一部の人々の間で一致する需給の可能な限り長いシリーズ(またはパス)を見つけて、交換を促進するにはどうすればよいですか?
  2. 2人以上が関与する最短のシリーズ(またはパス)を見つけるにはどうすればよいですか(したがって、1対1の交換は、いくつかの行列演算を使用してどのように理解したと思いますか)?
  3. 最長/最短パスを見つけるための複雑さは何でしょうか?

何かアドバイスをいただければ幸いです。

3
Shuai

スパース行列の代わりに、 有向グラフ を使用します。ここで、各ノードは人であり、各リンクは潜在的なトランザクションです。

グラフの各サイクルは潜在的な取引です。詳細については、 有向グラフでサイクルを検出するための最良のアルゴリズム を参照してください。

3
Dan Pichelman

問題を表す良い方法は、 2部有向 グラフとして表現することだと思います。

グラフを作成するには、次のようにします。

  • 各人のノードを描画します。
  • また、各アイテムのノードを描画します。
  • がアイテムを持っているときはいつでも、そのから矢印を描きますそのitem。 (アイデアは:人が幸せなら、私たちはアイテムを手に入れることができます。)
  • がアイテムを欲しいときはいつでも、そのアイテムから矢印を描きますその。 (アイデアは、アイテムがあれば、その人を幸せにすることができるということです。)

あなたの目標は、単にこのグラフで回路を見つけることです。

これは、あなたの質問を「2部有向グラフで回路を見つけるにはどうすればよいですか?」と言い換えることができることを意味します。これらの質問と回答で説明されているアルゴリズムが役立つ場合があります。

回路サイクルの違いは、回路が同じノードに複数回アクセスします(ただし、同じarrowを複数回使用することはできません)が、サイクルは各ノードに1回しかアクセスできません。問題のコンテキストでは、サイクルとは、各人が1つの取引にのみ参加し、各アイテムが1つの取引にのみ参加することを意味します。)

2
Tanner Swett