web-dev-qa-db-ja.com

グラフ理論の応用を学ぶ場所

グラフを使ったアルゴリズムの設計はまったく初めてです。特にIIT/MITから、CLRSおよびその他のYouTubeのビデオ講義をフォローしています。それらはかなり良いです、そして私は現在、グラフデータ構造、検索、スパニングツリーなどについてまともな考えを持っています。それにはグラフベースのアプローチが必要です。どの問題で、最小のスパニングツリーを使用する必要がありますか?プリムのアルゴリズムはどこで使用する必要がありますか?

グラフ上の多くの問題をカバーし、この問題がグラフベースのソリューションを必要とすることを特定する方法(そして、スプーンフィーディングの一種)を説明し、最後にその方法を説明する本/リソースはありますか?

7
SexyBeast

非常に良い質問ですが、答えるのは非常に難しいです。グラフは単なる別の形式であり、問​​題に適用するかどうかは2つのことの問題であるため、そのような本が存在することを私は強く疑います。

  1. その存在についての知識。非常に奇妙な理由でグラフとそれに対応するアルゴリズムについて知らない人は、問題のグラフベースのソリューションを思いつくことはありません。

  2. あなたの問題に最も適した形式であること。

1.についてはすでに順調です。ポイント2は、グラフの汎用性により、はるかに困難です。極端な場合は、すべてのリストまたは配列が変装したグラフにすぎないことを忘れないでください。ここでcould有向非巡回グラフの深さ優先検索として特定の要素を見つけるためにリンクリストをループすることを検討しますが、メンタルオナニー以外に意味はありません。

一方、グラフベースのソリューションに自然に役立つ無数の問題があります。グラフを使用する経験が多いほど、どこにいてもグラフが表示されますが、本格的なグラフライブラリを引き出すタイミングを決定したり、独自のアルゴリズムを実行したりするタイミングを判断するには、さらに多くの経験が必要です。

必須グラフベースのソリューションである問題を探している場合、おそらく別の方法で解決できるため、問題を見つけることができないと思います。しかし、グラフベースのソリューションが適している問題を探している場合は、問題の抽象化を検討するのが最善の方法です。

抽象化は、グラフのデータ構造を最もよく引き出すものの1つです。問題のドメインをノードに変換し、これらのノード間のエッジの意味を理解してみてください。それを簡単に行うことができない場合は、グラフを使用しないほうがよい場合があります。ただし、ほとんどの場合、すべてが自然に収まります。

以下にいくつかの例と、抽象化によって対応するグラフアルゴリズムがどのように導かれるかを示します。

  • ビルドシステム:相互に依存する多くのプロジェクト/ライブラリがあります。 1つを別の前にビルドすることを確認する必要があります。もちろん、可能であれば、それらを並行してビルドする必要があります。ここで抽象化を行います。ライブラリ=ノードとエッジ=依存関係と出来上がり。グラフがあります。次の質問:このグラフにはどのような構造がありますか?指示されているか、指示されていないか? 1つのライブラリを他のライブラリより先に構築する必要があるという直接的な関係があるため、指示する必要があります。それは非循環ですか?実際、循環的な依存関係を作成することはできません。または、ビルドを開始する場所がありません。しかし、誰かが何か間違った設定をしたために、ツールがサイクルの検出を停止できるようにする必要があるかもしれません。 Ops、サイクル検出アルゴリズム...はツールボックスにあるはずです。次は、ビルドの実行順序を決定します。つまり、入力エッジからのすべてのノードにアクセスした後でのみノードにアクセスするトラバーサルをグラフで見つけます。これはトポロジカルソートアルゴリズムであるため、ツールボックスを確認してください。などなど...

  • 電力網:都市/国と、電力をリダイレクトできるいくつかの発電所と場所があり、もちろん全員に電力を供給する必要があります。ノードは住宅と発電所であり、エッジは電力線です。構築する必要のある最小の長さの電力線を見つけたい場合は、すべてのノードを接続するために必要な最小量のエッジになります。またはtoolbox-speech:最小全域木。

  • 配管システム:水を流すための複雑な配管の設定があります。いくつかの時点で、バルブを開閉して、水がシステムをさまざまな方法で通過できるようにするオプションがあります。ただし、パイプは直径が異なるため、スループットは異なり、疑問に思っています。このシステムには、(指定された時間単位で)最大でどれだけの量の水を送り込むことができますか?抽象化により、タップ、シンク、バルブをノードとして、パイプをエッジとしてモデル化できます。直径がスループットに影響するため、エッジの重みが関係し、文字通り最大フローを見つけたいと思います。幸いなことに、グラフツールボックスにはそれだけのアルゴリズムがあります。

  • チップ上のワイヤのルーティング(@jkによって提案された例):配線を行う必要がある場合、電荷のためにワイヤが交差してはならないという制限があります。抽象化は、コンポーネントとそれらの間の配線、つまりノードとエッジがあるため、最初は簡単です。次のステップは、グラフベースの用語で問題を特定することです。つまり、この場合は、エッジを平面上に配置する必要があります。エッジと交差せずに平面上にグラフを描画できるかどうかは、グラフツールボックスのアルゴリズム-キーワード:平面グラフから再度確認できます。

スプーンフィーディングの本に関しては、これは実際には良い考えではありません。もう一度強調しておきますが、グラフcanは、問題に集中すると、ほとんどすべての問題に適用されます。問題とグラフアルゴリズムを使用してそれらを解決する方法を示す本は、日常の作業で他の問題に対処する必要があるため、ほとんど役に立ちません。あなたが現在の状況にすべてを適応させなければならないので、それが下に来るすべてはこの種の抽象化の経験です。

9
Frank