Stats

Popular Posts

Followers

Mathematica 教學 Floyd-Warshall演算法求任意兩點間最短距離

戴忠淵 於 2010年8月31日星期二 下午4:59 發表


定義距離矩陣

dist1=Normal@SparseArray[Flatten[{{1,2}->3,{1,3}->6,{2,3}->2,{2,4}->4,{3,4}->-1,{4,1}->-2,{#,#}->temp&/@Range[4]},1]]//.0->999/.temp->0

定義距離函數

d[i_Integer,j_Integer]:=If[i==j,0,Min[dist[[i,#]]+dist[[#,j]]&/@Range[Length@dist]]]

利用NestList求解

k=0;Row[
Labeled[MatrixForm[#],k++;"Step-"<>ToString@k]&/@
NestWhileList[(dist=#;Table[d[i,j],{i,Length@dist},{j,Length@dist}])&,dist1,
Unequal,All]
]



floyd[x_]:=Module[{n,i,j,k,d},n=Length[x];
d=x;
Do[If[d[[i,j]]>d[[i,k]]+d[[k,j]],
d[[i,j]]=d[[i,k]]+d[[k,j]]],{k,1,n},{i,1,n},{j,1,n}];
d];

floyd[dist1] Tags: ,

讀者回應 ( 0 意見 )

發佈留言

Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.

如果這篇文章對你有幫助,那請留個訊息給我~