11


3

私はいくつかのことで遊んでいて、http://en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon [Kevin Bacon]の数字を見つけ出すことを試みるというアイデアを思いつきました。 この目的のためにソーシャルネットワークと見なすことができるサイトのデータがあります。 (議論を簡単にするために)Facebookだとしましょう。 私には人がいます、そして私は彼らの友人のリストを持っています、それで私はそれらの間の関係を持っています。 一人の人から他の人までの距離(基本的に、ケビンベーコンの数)を計算するにはどうすればいいですか?

私の一番のアイデアは Bidirectional searchであり、深さに制限があります。しかし、これはかなり強引な力だと私は認識しています。

小さなサブグラフを作成し(Facebookのグループと同等のものを言う)、それらの間の最短距離を(おそらく事前に)計算してから、THOSEを使用してリンクを見つけようとするとよいでしょうか。 これは事前計算を必要としますが、それはより少ないノードを検索することを可能にするかもしれません(ノードは個人の代わりにグループであるかもしれず、グラフをずっと小さくする)。 これはまだ双方向検索です。

また、個人が接続している人の数を事前に計算して、最初に「人気のある」人をノードで検索することもできます。 私は、これが最短経路の可能性と速度のトレードオフになることを理解しています。 他の場合に使用する予定の幅優先検索ではなく、深さ優先検索も使用したいと思います。

誰かがこれを行うより簡単な/より速い方法を考えることができますか? 私は二人の間の最短の長さを見つけることができるようにしたいので、それはいつも同じ終点を持つことほど簡単ではありません(Kevin Bacon問題のように)。

私は200人の人々の連鎖を得ることができるというような問題があることを認識していますが、それは私が検索しても構わないと思っている深さに制限を設けることによって解決できます。

4 Answer


17


これは標準の shortest path problemです。 Dijkstraのアルゴリズムやhttp://en.wikipedia.org/wiki/Bellman-Ford_algorithm[Bellman-Ford]を含む多くの解決策があります。 あなたは特に A* algorithmを見て、それが特定のノードの次数の逆数に対するコスト関数でどのように機能するかを見ることに興味があるかもしれません。 アイデアは、より人気のあるノード(より高度なノード)を最初に訪問することです。


4


http://en.wikipedia.org/wiki/Dijkstras_algorithm[Dijkstraのアルゴリズム]の仕事のように思えます。

ED:ええと、私はそれほど早く引き金を引いてはいけませんでした。 Dijkstra(およびBellman-Ford)は、重みが1のときは幅優先探索になるので、これはあまり役に立ちません。 しかたがない。

tvanfossonによって言及された A* algorithmはこれに理想的かもしれません。 考え方は、要素がツリーの各レベル(開始点または終了点を起点とする)にある順序で検索して再帰するのではなく、最初に試す要素を判断するためにヒューリスティックを使用するというものです。 あなたのケースではおそらく良い賭けはノードの程度( "友達"の数)でしょうが、あなたはおそらく与えられた人(すなわち、持っている人)のある任意の数の程度の範囲内の人数を使うことができます。それぞれが100人の友人を持つ3人の友人が、部外者を排除するクリークで20人の友人を持つ男よりも優れたノードになる可能性があります。 ヒューリスティックとして使用できるものは他にもあります(友達は2ポイントを獲得し、友達同士は1ポイントを獲得します;実験は何でも)。

これを深度制限(6度の分離後にカットオフなど)と組み合わせると、平均的なケースを大幅に改善できます(最悪のケースは基本的なBFSと同じです)。


0


両方向で(各エンドポイントから)幅優先検索を実行し、接続が確立されたとき、または深さ制限に達したときに停止する


0


これはすべてのペアの最短距離のほうが全体的に良いかもしれませんhttp://en.wikipedia.org/wiki/Floyd-Warshall_algorithm