天神降臨,大家過來膜拜吧! FLASH AS 3.0 A星(A*, A star) 尋路演算法--史上最快,極限優化挑戰!
天神降臨,大家過來膜拜吧!
oh yeah!
轉載請宣告出處,例子程式碼可以免費隨意使用,但請保留或註明作者資訊.
這裡的演算法說是終極優化, 我挑戰了一下,
最終結果比較他快三倍, 我站在高高處,藐視了 一下作者.
優化思路:
a.開包(open list)演算法優化:
線性查詢-->
二叉堆(binary heap 容器:Array->Vector)->
二分排序插入/刪除(容器:Array)
b. 障礙點容器優化:
dictionary(1維) ->dictionary(2維)-- array(1維)->array(2維)->bitmapdata->bytearray(8位對齊)->byteArrayarray(32位對齊)->vector. <int>
c. 閉包(close list)容器優化:
dictionary(1維) -> array(1維)->bitmapdata->vector. <int>
d. 過程生成的路點物件記憶體管理優化:
AS動態物件(Object)->非動態物件(自定義PathNode物件)->使用bytearray自己管理記憶體分配物件-->使用Vector自已管理記憶體分配物件.
e. 評估函式:
標準(F = G+H, G=Parent.G+DIR_G, H = (ABS(X1-X)+ABS(Y1-Y) )*10 )
上述優化基本上是 左->右 == 慢->快
測試結果部分
單位:毫秒
地圖大小:500x500地圖:
從41條測試線路的平均值結果, 足足快3倍, 比較未優化但是快了25倍以上
未優化 10886 ms
所謂終極優化 1361.414634 ms
二分插入排序 ByteArray做記憶體管理 (32bit對齊 ) 479.195122 ms
二分插入排序Vector做記憶體管理 447.2439024 ms
startX |
startY |
endX |
endY |
距離 |
未優化 |
所謂 終極 優化 |
二分插入排序ByteArray做記憶體管理(32bit對齊) |
二分插入排序 Vector做記憶體管理 |
36 |
32 |
113 |
125 |
120.7394 |
17 |
8 |
10 |
11 |
113 |
125 |
34 |
29 |
124.3262 |
16 |
7 |
11 |
11 |
34 |
29 |
469 |
463 |
614.4762 |
9133 |
1338 |
544 |
493 |
469 |
463 |
152 |
155 |
441.9876 |
超時 |
8536 |
2810 |
2560 |
152 |
155 |
169 |
165 |
19.72308 |
17763 |
2743 |
957 |
894 |
169 |
165 |
465 |
463 |
420.0238 |
1159 |
219 |
101 |
97 |
465 |
463 |
165 |
143 |
438.6342 |
超時 |
8385 |
2594 |
2470 |
165 |
143 |
220 |
146 |
55.08176 |
19685 |
2958 |
1031 |
965 |
220 |
146 |
229 |
139 |
11.40175 |
725 |
234 |
124 |
116 |
229 |
139 |
111 |
477 |
358.0056 |
827 |
168 |
72 |
70 |
111 |
477 |
327 |
350 |
250.5694 |
1705 |
364 |
164 |
158 |
327 |
350 |
319 |
340 |
12.80625 |
210 |
71 |
38 |
38 |
319 |
340 |
464 |
477 |
199.4843 |
51 |
20 |
18 |
17 |
464 |
477 |
71 |
26 |
598.2057 |
20912 |
2370 |