ダイクストラ法による距離の計測

やねうらおさんに書いてもらった擬似コードを元に
ダイクストラ法をやってみました。
確かに、ゴールまで何マスで移動できるかが求まりました
iのループが反復進化で言うdeepnessという感じですが、
再帰を用いずに、距離が求まるので、
スタックが少なそうなActionScriptでは望ましいコードだと思います。
現在mapsizeが8ですが、
64x20=1280回のループ。たいしたことない回数ですね。


ただ、ゴールまでの距離はもとまりますが、上下左右、
どちらに進むほうが良いかは解らないのですが、
上下左右に関して、それぞれゴールまで距離を求めれば、
どの方向に進むのが最短か? は分かりますね。
4回計算するより、なんか良い方法がありそうなので、
また突っ込まれるかもしれない(^^;


まだ動くとこまで行ってないですけど、
けっこう重いかもしれない(^^;
詰将棋的方法のほうがハッシュでの枝刈りが効いて
計算量は少ないかも。
距離が近くなる方向を優先して探すヒューリスティックも入れていたし
実際にゴールに近づくとほとんと計算しないで済みますが、
上記の方法は実際の距離に関係なく計算量一定だし


やねさんからコメント欄で解説を受けました。
ゴールが判明しているなら、ゴールまでの距離が判明した時点で
計算は止められますね。
あと、進む方向についても、checkの更新時にどの方向が
最短化をいっしょに更新すれば、距離と方向は一度に求まります

		for(j=0;j<mapsize;j++) for(k=0;k<mapsize;k++) dij[ j*mapsize+k ] = 99;
		dij[ x+y*mapsize ]=0;

		for(i=0;i<20;i++)
		{
			for(j=0;j<mapsize;j++)
			{
				for(k=0;k<mapsize;k++)
				{
					if( dij[ k+j*mapsize ]==i )
					{
						check( k-1,j  ,i );
						check( k+1,j  ,i );
						check( k,  j-1,i );
						check( k,  j+1,i );
					}
				}
			}
		}