在之前的文章A*搜索算法(Java實現(xiàn))中瑟慈,本人給大家介紹了A*搜索算法的算法流程以及附送了了一份本人用Java代碼實現(xiàn)的A*搜索算法桃移,今天,我們就從應用方面談一談A*搜索的一些應用場景以及對于之前的算法如何進行改良葛碧;
1.利用A*搜索算法進行道路規(guī)劃:作為最典型的啟發(fā)式搜索的典型算法借杰,我們可以通過預估算走到路徑的改路徑將會花費的成本,每走一步都是一個取局部最優(yōu)的過程(貪心思想)进泼,當我們尋找到了一條從起點到終點的路徑時蔗衡,這條路徑可能不是全局最優(yōu)的解決方案,但是這個解決方案在某些應用場景上也是可以接受的乳绕,例如在針對尋找一條從A地到B地的一條路徑绞惦,如果我們將路徑長度作為代價成本的話,至少從路程來看洋措,我們顯然是最短的那條路徑济蝉,即使這條路徑可能不是最經濟的。
在進行道路規(guī)劃是,我們可以針對最重要的因素S進行A*搜索王滤,確保在S方面取得最優(yōu)的解決方案贺嫂。
2.?平滑路徑:A*?自動給你花費最小的,最短的路徑淑仆,但它不會自動給你最平滑的路徑涝婉。看看我們的例子所找到的路徑蔗怠。
如圖二所示墩弯,在這條路徑上,第一步在起點的右下方寞射,如果第一步在起點的正下方是不是路徑會更平滑呢渔工?
???????有幾個方法解決這個問題。在你計算路徑時桥温,你可以懲罰那些改變方向的方格引矩,把它的?G?值增加一個額外的開銷。另一種選擇是侵浸,你可以遍歷你生成的路徑旺韭,查找那些用相鄰的方格替代會使路徑更平滑的地方。
3.關于路徑代價F中的H部分掏觉,我們在計算這個值是可以考慮將障礙物区端,如果這條路徑存在障礙物,可以將此路徑的代價提高澳腹。
4.??預先處理你的地圖织盼,指出哪些區(qū)域是不可到達的。這些區(qū)域稱為“孤島”酱塔。實際上沥邻,他們可以是島嶼,或者是被墻壁等包圍而不可到達的任意區(qū)域羊娃。?A*?的下限是唐全,你告訴他搜尋通往哪些區(qū)域的路徑時,他會搜索整個地圖蕊玷,直到所有可以抵達的方格都通過?open list?或?close list?得到了處理芦瘾。這會浪費大量的?CPU?時間。這可以通過預先設定不可到達的區(qū)域來解決集畅。在某種數(shù)組中記錄這些信息,在尋路前檢查它缅糟。
5.非方形搜索區(qū)域:在我們的例子中挺智,我們使用都是?2D?的方形的區(qū)域。你可以使用不規(guī)則的區(qū)域。想想冒險游戲中的那些國家赦颇,你可以設計一個像那樣的尋路關卡二鳄。你需要建立一張表格來保存國家相鄰關系,以及從一個國家移動到另一個國家的?G?值媒怯。你還需要一個方法了估算?H?值订讼。其他的都可以向上面的例子一樣處理。當你向?open list?添加新項時扇苞,不是使用相鄰的方格欺殿,而是查看表里相鄰的國家。