1. 程式人生 > >天神降臨,大家過來膜拜吧! FLASH AS 3.0 A星(A*, A star) 尋路演算法--史上最快,極限優化挑戰!

天神降臨,大家過來膜拜吧! 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