こんなカテゴリ作ってたの忘れてたよ。ダイクストラ法出来たよー。


というわけで、どうにか出来ました。
何時間ぶっ通しで考えてたんだ……。
あちこちいじくりまくって、結局1万回ループを2000回ループに削って、更に不細工ではあるけどどうにか形にまとめて、ダイクストラ法による最短経路問題解法プログラムは一応の完成を見ました。
どういうプログラムかというと、10×10の格子があって、各格子をまた10分割した網みたいなものを考えます(画像の中で紺色の格子がそれ)。
その空間を地震波がどう伝わるかというのを計算したものが赤い線です。
上側でとんがってる10点が震源の設定。下側の10個のとんがりが観測地点です。天地が逆転してるのはVBのPictureBoxがy軸下向きなのにそのままプロットしてるからです。直す予定は今のところ無い。
ルールとしては、波が通れるのは紺色のスポットだけ(そこで屈折とかを考える)。
で、今回の場合は、中央の4×4ブロックは波の伝わる速度が速いという設定をしてあります。
自然の摂理として、波は到達時間が一番短くなるルートを選択するということが知られていまして、今回はそれが実践されるようなルートを計算する方法を考えるのが課題でした。
最初は問題だけ。
次は理論。今回使っているのはダイクストラ法というスマートな力業。
ヒントが小出しにされる中でどうにか組んでいこうという、そんな授業です。
授業中にダイクストラ法のプログラム例(課題が若干違う)とか先生の組んだプログラム(FORTRANでコメントが少ないから読みづらい)とかが配られたんですが、結局そっちは殆ど読まずにダイクストラ法の理論解説から力業で組んでしまった結果がコレだよ。
1つの震源を計算するのに20秒、10個全部で約4分掛かるという重たいアルゴリズムが出来ましたとさ☆
多分途中の計算方法が今ひとつスマートじゃないんだろうなと思ってます。でも僕の考え得る方法としては暫定ベスト……。
また何か良い方法を思いついたら改良しようかなと思います。
とりあえず、TAとして最低限の解答例は組めたかな……。
僕はプログラミングで遊ぶ人間ですが、目的が主に大量のデータの形式変換とか、単純計算とか、ルーチンワークをやらせるというベクトルなのです。
なので、アルゴリズム的なものに取り組んだのはぶっちゃけコレが初めて……。まあ、NFやら討論会やらありーので足かけ一ヶ月(実働4,5日)、割と頑張った。
TAなのに出来の良い学生にアイディア教えて貰ったりしてたしね。
いや、うん、そんなもんでも許して下さい。
でも出来たプログラムを走らせて結果を眺めてニヤニヤ出来るのは素敵なことですね。
この楽しみがある限り、サブウェポンとしてプログラミングは続けていく様な気がしますね。
まあ「プログラミングやってます」と他人様に言えるようなレベルではないですが。