• 締切済み

最短距離を求める問題(ダイクストラ法)の原理

グラフ(経路)の情報があり、それを用いて最短距離を探索するアルゴリズムにダイクストラ法というものがあります。 このアルゴリズムでは常に正しい解を導けるということなのでしょうか。調べてみると負の距離があったらダメというのがありましたが、これは除外しての話ですが。 また、このアルゴリズムがなぜ正しいだろうと思えるのかについて理解できればなんとなくわかるような気がします。そこで、wikipediaを読んでみたのですが、さっぱり分かりませんでした。ちょっと引用します。 ”最短経路問題は、ビー玉と紐を用いて解くことが出来る。 まずビー玉を頂点、紐を辺にするグラフを工作する。 グラフを板の上に置き、スタートの頂点にあたるビー玉だけをつまむ。 グラフが置かれている板を取り除くと、グラフは自由落下を始めるが、 スタートにあたるビー玉を持っているので、スタート地点から近いビー玉から順に落下が止まる。 ゴールにあたるビー玉が止まったとき、ゴールにあたるビー玉はスタートにあたるビー玉まで紐で一直線で結ばれている。 この直線が最短経路である。” ビー玉が経路の構成点で紐が経路なのかなということはわかりますが、それを板の上にのせて板がを取り除く、あたりから何が何だかさっぱりわかりません。板は水平に置かれているなら板が消えたら全部落下するだけのように思えますし。でもこれが理解できるとアルゴリズムの思想が理解でき、その妥当性とか限界について予想がつくのだろうと思います。 他に何かイメージがつかみやすい説明があるでしょうか。 また、ダイクストラ法は情報処理としては初等的なものなのでしょうか。それとも結構アドバンスドなものなのでしょうか。 サンプルプログラムを調べてみたらC・C++が多いようなのでこちらにお尋ねしてみました。 よろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ちなみにダイクストラ法そのものは「ちょう基本」です. というか, これが分からないようだと他のグラフ理論的なアルゴリズムはきついんじゃないかな.

skmsk1941093
質問者

お礼

回答ありがとうございます。 例えば、2次方程式の解の公式(中高数学)を用いて解を示すという問題がプログラムの第一歩だと思います(ハローワールドの次ぐらい)。アルゴリズム的には例外処理ぐらいのものですね。決定論的プログラムとも言えると思います。(プログラミングですらないとも言えそうです。)ダイクストラ法は基本的と言ってもさすがにそこまではいかないと思いますが。 ダイクストラ法は動的プログラミングに含まれるのでしょうか。名前入りアルゴリズムだったり適用が限定されていたりするから即刻理解できるようなものではないのではないかと思うのですが。 今一度じっくり見てみます。

回答No.3

なんか屁理屈で議論をしたいだけなのかなぁ? > 板と重力の向きに対する説明が文章中にないのでイメージができないのです。 惑星(地球)上では重力は下向きです。常識でしょう。 板の上に載っているとしているのだから、きっと水平でしょう。 ただし水平かどうかは余り関係なくて、板の上に載っているのだからそれぞれのビー玉の間の紐が直線になっていなくてたるんでいるということが重要。 > ビー玉は真ん中が繰り抜かれて紐(経路の相当)が通っているという感じでしょうか。 ビー玉と紐のつなぎかたなど本質とは全く関係ない(だから、「グラフを工作する」としか書いていない)。紐を通そうが、接着剤でつけようがどうでもいい話。 でもそのイメージで考えると数珠みたいなものを考えればいいかもしれない。 > ぶどうの房のような振り子がブラブラ揺れているということでしょうか。 そう考えていいでしょう。ただし、ビー玉の大きさは無視して考えることが重要。 そうしないと途中のビー玉が邪魔になって最短経路が直線にならない、などというよけな心配が出てくる。 スタートからゴールまでの紐が一直線になる経路が最短経路なんだけど、その一直線にするために両端(スタート、ゴール)から引っ張ることをやりたい。 その方法(力のかけ方)に重力を使っているんです。もっと単純に両端から引っ張ると書いてあったほうが分かったのかな? そう考えれば、板を取り除くかなくても、ビー玉が自由に転がるように傾けるだけでもよい。 単純に考えてみればいいのに。 ABC3点があり、それぞれの間の距離が A-B:3cm B-C:5cm A-C:7cm であった時、スタートをA、ゴールをBとすると最短経路はA-BでありA-C-Bの経路でないことはすぐにわかる。 これをビー玉と紐の考え方で、AをもってB,Cを落下させるとA-B,A-Cが直線になるがゴールがBなので、最短経路がA-Bの経路になる。 ABCD4点(A-B:3cm, B-C:5cm, C-D:7cm, D-A:2cm),スタート:A、ゴール:C という条件ならA-B-Cは一直線になるけど、A-D-Cは紐がたるんでいる。 従って、A-B-Cが最短経路になる。 ここで、B-Dが0.5cmでつながっているとすると、A-B間はA-D-Bのほうが短くなりA-Bを直接結ぶ紐はたるんで、最短経路はA-D-B-Cになる。 さら、A-C間が6cmの紐で直接つながっていれば、一直線になるのはA-Cが直接つながっている経路になるので、最短経路はA-Cになる(逆にA-Cが7.5cmより長ければ、A-D-B-C)。

skmsk1941093
質問者

お礼

大変詳細なご説明をありがとうございます。 紐が弛む・弛まないという議論は距離の長短と完全にリンクするので理解できます。アルゴリズム化するには探し方の順序というところがポイントになると思います。 四角形の例で、AC=6を除外してBD=0.5が成立している場合を考えます。 AD(2)+DC(7)=9 AB(3)+BC(5)=8 AD(2)+DB(0.5)+BC(5)=7.5 3番目が最短であることを見破っていくにはどうするのだろうかということですね。 スタートをつまんで重力に従ってぶら下げたらわかるというのが趣旨だと思います。ゴールの玉のぶら下がり具合をみたらわかるということですが、最短コースがわかるからぶら下がり方がわかるという風に思えるわけで、ぶら下がり方から最短コースがわかるというところがどうも理解しにくいのですが。今一度見てみます。

回答No.2

> 板は水平に置かれているなら板が消えたら全部落下するだけのように思えますし。 逆に、なぜこのように思うのか理解できません。 「スタートの頂点にあたるビー玉だけをつまむ。」のだからその「スタートの頂点にあたるビー玉」は落下しません。 つまり全部ではないです。 スタートからゴールまでが一直線になれは、その経路以外の紐はどこかでたるんでいるはず。 たるんでいるということは、経路が長くなっているのでそのたるんでいる経路は最短ではない。 ここまでは結構単純だと思うんだけど。

skmsk1941093
質問者

お礼

回答有難うございます。  先の引用文の中で板とか落下とか書いてあります。落下なので重力の向きが規定されているはずで、とすると板と重力の向きに対する説明が文章中にないのでイメージができないのです。その辺りはどうでしょうか。ビー玉が乗っているというのだから板は水平なのだろうと思いますが。 ビー玉は真ん中が繰り抜かれて紐(経路の相当)が通っているという感じでしょうか。そしてそれがすべらないとか。そのあと落下するからブランコあるいは振り子のようになるということでしょうか。で、スタートだけが落ちないようになっているとしたらぶどうの房のような振り子がブラブラ揺れているということでしょうか。たぶん意図するところがずれていくのではないかと思うのですが。イメージがあっているでしょうか。

  • f272
  • ベストアンサー率46% (8012/17125)
回答No.1

Wikiの説明には紐の長さが辺の重みに対応すると言うことがかかれていないように思う。これはあたり前だから省略しているのかな? > 板は水平に置かれているなら板が消えたら全部落下するだけのように思えますし。 全部,落下するけど紐で結ばれているのだから途中で止まるよね。そしてどのビー玉が先に止まるのかは紐の長さに関係していることは明らかだろう。 ここに書かれている説明でアルゴリズムが理解できないのなら,実際のプログラムをステップ実行してループが回るごとに最短経路上の次のノードが決定されていくことを確認してください。

skmsk1941093
質問者

お礼

回答有難うございます。 イメージですが、スタートの点だけが固定されている複雑な数珠のようなものが振り子のように揺れるイメージになります。 どこから先に止まるかというのは単純ではないように思うのですが。全体として剛体のように揺れているから。そういうイメージではないようですね。  ロッククライミングのハーケンの打ち込みのようなイメージに近くなってきました。1つだけ固定されてあと全部抜けたみたいな。それがぶらりと振り子のように揺れているイメージです。どうでしょうか。

関連するQ&A

  • ダイクストラ法

    ふと思ったのですが、 最短経路問題を解くときに使用されるダイクストラ法ってありますが。 このダイクストラ法で解けない問題ってありますか?

  • 最短経路問題のアルゴリズム

    最短経路問題のアルゴリズムにはどのようなものがありますか? ダイクストラくらいしか知りません。教えてください。 カテゴリー違いだったら書き直します。

  • 最短路問題について

    はじめまして。 「データ構造とアルゴリズム」を独学で勉強中の学生です。 当方、周りより指導していただける環境が無く どうにも行き詰まってしまったのでここに書き込みをさせていただきました。 お聞きしたい問題なのですが 「最短路問題について問題の定義と解法(アルゴリズム)を説明せよ。次に図1においてpから全ての頂点への最短路を求めよ。」 というものです。 * 図1はhttp://www.geocities.co.jp/Hollywood-Stage/3151/g/g.gifにupしてあります。 最短路問題を解く方法としてダイクストラのアルゴリズムやFloydのアルゴリズムがありますが、これらは書籍などを参考にして理解しているつもりです。 しかし実際、問題を解く手順といいますか、解答を書くことができないのでどなたかおわかりになる方がいらっしゃいましたらご指導をいただきたいと思い書き込みをさせていただきました。 学習不足で怠慢な学生の質問で大変申し訳ありませんが ご指導のほどよろしくお願いいたします。

  • 最短経路を計算するプログラム

    下の図のようなものを用いて、スタート(S)からゴール(G)までいく最短経路を計算するプログラムをVisual Studio 2005のC++で作ったアルゴリズムが知りたいです。

  • 任意の2地点間の全経路探索について

    ネットワーク上においてダイクストラ法を使うと任意の2地点間の最短経路が求められますが、最短経路だけでなく最長経路など任意の2地点間における全ての経路を求めたいと考えていますが、なかなか良いアルゴリズムができません。詳しい方御教授お願いいたします。

  • ベルマンフォードのアルゴリズム

    このカテゴリーであってる・・・かな・・。 とりあえず、ネットワークのアルゴリズムなので。 最短経路を求めるアルゴリズムは、 ダイクストラしか知らなかったのですが、 ベルマンフォードというアルゴリズムがあると知りました。 どのようなアルゴリズムなのでしょうか? ダイクストラと比較してどうなのでしょうか?

  • グラフ理論について

    最短経路選択手法としてダイクストラ法があります。 エッジに重みを与え、始点から終点までの最短経路を算出する手法ですが、この時ノードの重みは考慮されません。 ここで質問です。 ノードの重みも考慮するアルゴリズムはあるのでしょうか? 詳しい方、ご教授お願いします。

  • グラフ構造のアルゴリズムの問題です。

    グラフ構造のアルゴリズムの問題です。 頂点間の最短距離を求める問題ですが、どうすれば良いかわかりません......。ダイクストラ法などを使うのでしょうか? 何のアルゴリズムを利用するのかという点と、解法の手順を解説していただけると幸いです。 以下、問題文です。 v1,v2,v3,..., v9,v10 の 10 個の頂点からなる重みつき無向グラフ G の全頂点間の最短距離を計算したい。こ こで dk(i,j) を頂点 vi から頂点 vj への「経由してよい頂点を v1,...,vk に限定した」最短距離とする。例えば, d3(i,j)は「経由してよい頂点が v1,v2,v3 に限定された」vi から vj への最短距離となる。 ただし,v1,...,vk までの頂点のみを経由するような vi から vj への経路がない場合は dk(i,j)を∞とする。 いま,「経由してよい頂点を v1~v6 に限定した」全頂点間の最短距離がそれぞれ d6(1,2)=3 d6(1,3)=12 d6(1,4)=∞ d6(1,5)=4 d6(1,6)=6 d6(1,7)=∞ d6(1,8)=4 d6(1,9)=8 d6(1,10)=9 d6(2,3)=5 d6(2,4)=∞ d6(2,5)=2 d6(2,6)=3 d6(2,7)=∞ d6(2,8)=1 d6(2,9)=6 d6(2,10)=3 d6(3,4)=∞ d6(3,5)=5 d6(3,6)=2 d6(3,7)=∞ d6(3,8)=6 d6(3,9)=9 d6(3,10)=5 d6(4,5)=∞ d6(4,6)=∞ d6(4,7)=2 d6(4,8)=∞ d6(4,9)=∞ d6(4,10)=4 d6(5,6)=5 d6(5,7)=∞ d6(5,8)=3 d6(5,9)=4 d6(5,10)=8 d6(6,7)=∞ d6(6,8)=4 d6(6,9)=9 d6(6,10)=3 d6(7,8)=3 d6(7,9)=∞ d6(7,10)=1 d6(8,9)=4 d6(8,10)=7 d6(9,10)=12 であった。この情報をもとに以下のそれぞれの値を求めよ。 (1)d7(1,10) (2)d7(4,8) (3)d7(4,10) (4)d8(1,10) (5)d8(4,5) お手数お欠けしますが、どうかよろしくお願い致します。

  • 最長経路探索

    グラフの最長経路(クリティカルパス)を求めたいのですが、 ・閉路無し有向グラフ ・重み付きグラフ(辺ではなくノードの方に重みがある) ・スタートとゴールのノードが各々1つ与えられている ・スタートからどの経路を辿ってもゴールには辿り着く 以上のような条件の時に、どのようなアルゴリズムを用いれば良いのでしょうか? 幅優先探索で求められそうな気がしたのですが、どうも上手くいきません。 言語はVBAで、そもそも詳しくないのですが、 考え方など教えて頂けないでしょうか。 お願い致します。

  • ルーティングプロトコルの実装

    アドホックネットワークのルーティングプロトコルのプログラムをCで作成し、 ダイクストラの経路選択法を用いてサーバまでの最短経路を求めています。     /[端末A]-・・\ [サーバ]         [クライアント]     \[端末B]-・・/ 最短経路以外の予備経路も保持したいのですが、ダイクストラ法では 最短経路しか保持しないので困っています。第一経路+第二経路 を作りたいのですが・・ よい案がないか、どなたかご指南いただけないでしょうか。

専門家に質問してみよう