a* 尋路演算法
的講解,這裡有介紹比較清晰的文章:
首先引入兩個集合,乙個公式:
演算法執行的大致步驟如下:
下面是a*演算法的完整實現,並帶有測試用例:
/**
* a*演算法(啟發式搜尋):
* 首先引入兩個集合,乙個公式:
* openlist:可到達的格仔
* closelist:已到達的格仔
* f = g + h
* * 每乙個格仔都有三個屬性值:f,g,h
* g:從起點走到當前格仔的成本, **已經花費了多少步**
* h:不考慮障礙的情況下,從當前格仔走到目標格仔的距離,**離目標還有多遠**
* f:g和h的綜合評估,也就是從起點到達當前格仔,**再從當前格仔到達目標格仔的總步數**
* */
public
class
astarpathsearching,,
,,};
private
static
class
grid
void
initgrid
(grid parent, grid end)
}/**
* 尋路演算法主方法
** @param start
* @param end
* @return
*/public
static grid search
(grid start, grid end)
}// 如果openlist中存在終點,那麼直接返回
grid endgrid = null;if(
(endgrid =
containgrid
(openlist, end.x, end.y)
)!= null)
}return null;
}/**
* 在openlist中尋找f值最小的grid
** @param openlist
* @return
*/private
static grid findmingrid
(list
openlist)
}return mingrid;
}private
static list
findneighbors
(grid curgrid, list
openlist, list
closelist)if(
isvalidgrid
(curgrid.x+
1, curgrid.y, openlist, closelist))if
(isvalidgrid
(curgrid.x, curgrid.y-
1, openlist, closelist))if
(isvalidgrid
(curgrid.x-
1, curgrid.y, openlist, closelist)
)return gridlist;
}private
static
boolean
isvalidgrid
(int x,
int y, list
openlist, list
closelist)
// 圍牆
if(maze[x]
[y]==1)
if(containgrid
(openlist, x, y)
!= null ||
containgrid
(closelist, x, y)
!= null)
return
true;}
/** * 判斷gridlist中是否存在 grid(x, y),
* 如果存在則直接返回
* 否則返回 null
* @param gridlist
* @param x
* @param y
* @return
*/private
static grid containgrid
(list
gridlist,
int x,
int y)
}return null;
}public
static
void
main
(string[
] args)
for(
int i =
0; i < maze.length ; i++
)elseif(
containgrid
(path, i, j)
!= null)
else
} system.out.
println()
;}}}
實際上,這個演算法有個地方可以優化;我們看到findmingrid
函式,它是找到集合中f值最小
的方格,我們每次呼叫它都得遍歷整個集合,演算法是線性增加的,並且隨著路徑的擴大,這個集合的大小不斷擴大,演算法效率會很低,搜尋時間很令人擔憂
。
既然我們每次都取f值最小的元素,那麼,可以想到,使用乙個最小堆
來儲存這些元素。這樣,演算法時間複雜度呈2的指數級下降;
讀書筆記 漫畫演算法 8 LRU快取的實現
lru,least recently used,最近最少使用 一種資源管理演算法 按照字面的意思,也可以理解為快取淘汰演算法 最近最少訪問的資源,我們就從快取中淘汰出去,以免長時間占用記憶體且不經常訪問 首先,我們定義基礎的資料結構 public class lrucache 用於高效訪問的hash...
A star 筆記 A星尋路演算法基礎
基礎應用 基礎應用一般為三部分 建立地圖 或者說網格 例項化出 n m的網格,一般使用二維陣列node nodes 每個格仔都是乙個節點node例項,每個節點都有自身基礎資訊和下乙個節點的引用資訊,可以先對不能通過的地方進行標記,也可以在尋路過程中動態標記。位置對映 節點座標通常只會使用整數索引,如...
排序演算法讀書筆記
按關鍵字相等的記錄順序是否變化,分為穩定和不穩定 按儲存器不同分為內部排序和外部排序,外部是指數量很大,記憶體一次不能容納全部記錄,要訪問外存 按複雜度分簡單排序 普通排序和基數排序 按依據的原則不同分為插入排序 交換排序 選擇排序 歸併排序和計數排序。排序通常需要兩種操作 比較 移動記錄。1 平均...