国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

十年經(jīng)驗(yàn)網(wǎng)站開(kāi)發(fā)企業(yè)百度地圖人工電話

十年經(jīng)驗(yàn)網(wǎng)站開(kāi)發(fā)企業(yè),百度地圖人工電話,wordpress后臺(tái)框架,廣東省住房城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站A星尋路算法簡(jiǎn)介 A星尋路算法(A* Search Algorithm)是一種啟發(fā)式搜索算法,它在圖形平面上進(jìn)行搜索,尋找從起始點(diǎn)到終點(diǎn)的最短路徑。A星算法結(jié)合了廣度優(yōu)先搜索(BFS)和最佳優(yōu)先搜索(Best-First S…

A星尋路算法簡(jiǎn)介
A星尋路算法(A* Search Algorithm)是一種啟發(fā)式搜索算法,它在圖形平面上進(jìn)行搜索,尋找從起始點(diǎn)到終點(diǎn)的最短路徑。A星算法結(jié)合了廣度優(yōu)先搜索(BFS)和最佳優(yōu)先搜索(Best-First Search)的特點(diǎn),通過(guò)使用啟發(fā)式函數(shù)評(píng)估節(jié)點(diǎn)的重要性,優(yōu)先選擇最有希望達(dá)到目標(biāo)節(jié)點(diǎn)的節(jié)點(diǎn)進(jìn)行擴(kuò)展,從而有效地縮小搜索范圍。
A星尋路算法的核心概念

  1. 節(jié)點(diǎn)(Node):在圖形平面上,每個(gè)可移動(dòng)的點(diǎn)都可以被視為一個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)可以是地圖上的障礙物、可移動(dòng)的實(shí)體等。
  2. 邊(Edge):節(jié)點(diǎn)之間的連接稱為邊。在路徑搜索中,邊通常表示可移動(dòng)的路徑或移動(dòng)方向。
  3. 代價(jià)函數(shù)(Cost Function):F=G+H,用于評(píng)估從起始節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的代價(jià)。在A星算法中,代價(jià)函數(shù)通常由兩個(gè)部分組成:實(shí)際代價(jià)(Actual Cost)和啟發(fā)式代價(jià)(Heuristic Cost)。
  4. 父節(jié)點(diǎn)(Parent Node):在搜索過(guò)程中,每個(gè)節(jié)點(diǎn)都有一個(gè)指向其父節(jié)點(diǎn)的指針,表示該節(jié)點(diǎn)是如何從父節(jié)點(diǎn)擴(kuò)展而來(lái)的。
  5. 開(kāi)放列表(Open List):包含所有正在被考慮的節(jié)點(diǎn)。這些節(jié)點(diǎn)尚未被擴(kuò)展,且具有最小的實(shí)際代價(jià)+啟發(fā)式代價(jià)。
  6. 關(guān)閉列表(Closed List):包含所有已經(jīng)擴(kuò)展過(guò)的節(jié)點(diǎn)。這些節(jié)點(diǎn)不再被考慮。

A星尋路算法的步驟

  1. 初始化:設(shè)置起始節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn),將起始節(jié)點(diǎn)添加到開(kāi)放列表中。
  2. 循環(huán)執(zhí)行以下步驟,直到開(kāi)放列表為空或找到目標(biāo)點(diǎn):
    a. 從開(kāi)放列表中選擇具有最小代價(jià)的節(jié)點(diǎn)n,并將其從開(kāi)放列表中移除。
    b. 將節(jié)點(diǎn)n添加到關(guān)閉列表中,并遍歷其所有相鄰節(jié)點(diǎn)。對(duì)于每個(gè)相鄰節(jié)點(diǎn)m:
  • 如果m不在關(guān)閉列表中,計(jì)算從起始節(jié)點(diǎn)到m的實(shí)際代價(jià)g(m)(g(m) = g(n)+n到m的代價(jià))和啟發(fā)式代價(jià)h(m)。如果m的代價(jià)小于其之前的代價(jià),或者m尚未設(shè)置父節(jié)點(diǎn),則將m的父節(jié)點(diǎn)設(shè)置為n,并更新m的代價(jià)g(m)。將m添加到開(kāi)放列表中。如果節(jié)點(diǎn)m是目標(biāo)節(jié)點(diǎn),則找到了最短路徑,結(jié)束算法。
  1. 如果開(kāi)放列表為空而未找到最短路徑,則說(shuō)明存在無(wú)法達(dá)到目標(biāo)的路徑或目標(biāo)不可達(dá),結(jié)束算法。
  2. 輸出最短路徑:從目標(biāo)節(jié)點(diǎn)回溯到起始節(jié)點(diǎn),按照父節(jié)點(diǎn)指針依次訪問(wèn)節(jié)點(diǎn),得到最短路徑。

代碼實(shí)現(xiàn)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;//節(jié)點(diǎn)
public class AstarNode:IComparable<AstarNode> //繼承接口實(shí)現(xiàn)重載排序方式
{public int x;//x坐標(biāo)public int y;//y坐標(biāo)public Vector2Int pos;//x,y坐標(biāo)public int G;//起點(diǎn)到該點(diǎn)的距離public int H;//該點(diǎn)到終點(diǎn)的曼哈頓距離public int F;//F = G + Fpublic AstarNode()   //無(wú)參構(gòu)造函數(shù){}public AstarNode(Vector2Int pos) //有參構(gòu)造函數(shù){this.pos = pos;this.x = pos.x;this.y = pos.y;}public int CompareTo(AstarNode other) //排序方式{return this.F-other.F; //F小排在前}
}//A星
public class AStar 
{bool result =false;//單例模式public static AStar instance;public static AStar Instance{get{if(instance==null){instance = new AStar();}return instance;}}//上右下左四個(gè)方向private Vector2Int[] directions = new Vector2Int[]{new Vector2Int(1,0),new Vector2Int(0,1),new Vector2Int(-1,0),new Vector2Int(0,-1)};//上右下左//開(kāi)放表private List<AstarNode> openList = new List<AstarNode>();//關(guān)閉表,但這里沒(méi)用到,用cameFrom代替了它的作用//private HashSet<Vector2Int> closeList = new HashSet<Vector2Int>();//路徑字典,用來(lái)存儲(chǔ)路徑以及作為關(guān)閉表來(lái)判斷該點(diǎn)是否已經(jīng)走過(guò)private Dictionary<Vector2Int,Vector2Int> cameFrom = new Dictionary<Vector2Int, Vector2Int>();//記錄最終路徑,作為返回值private List<Vector2Int> path = new List<Vector2Int>();//尋路方法public List<Vector2Int> FindPath(List<List<Transform>> map,Vector2Int startP,Vector2Int targetP)//地圖,起點(diǎn),終點(diǎn){Debug.Log("開(kāi)始尋路");//計(jì)算起點(diǎn)G,H,F,將起點(diǎn)加入開(kāi)放表,AstarNode rNode = new AstarNode(startP);rNode.G = 0;rNode.H = Manhattan(rNode.pos,targetP);rNode.F = rNode.G+rNode.H;openList.Add(rNode);cameFrom[startP] = new Vector2Int(-1,-1); //記錄路徑,當(dāng)前點(diǎn)坐標(biāo)作為key,上一個(gè)點(diǎn)的坐標(biāo)作為value,表示從上一個(gè)點(diǎn)坐標(biāo)到達(dá)該點(diǎn)//循環(huán)直到找到路徑,或者開(kāi)放表沒(méi)有節(jié)點(diǎn)while(openList.Count>0&&!result){//開(kāi)放表以F為標(biāo)準(zhǔn)排序,F小在前openList.Sort(); //取出開(kāi)放表中F最小的節(jié)點(diǎn)AstarNode curNode = openList[0];//取出的節(jié)點(diǎn)要從開(kāi)放表中移除,加入到關(guān)閉表openList.RemoveAt(0);//遍歷這個(gè)點(diǎn)周圍的四個(gè)方向foreach(Vector2Int dir in directions){Vector2Int newP = curNode.pos+dir;//判斷邊界,有沒(méi)有超出地圖范圍if(newP.x<0||newP.x>=map.Count||newP.y<0||newP.y>=map[0].Count) //邊界點(diǎn)判斷{continue;}//判斷是否在關(guān)閉表if(cameFrom.ContainsValue(newP)){continue;}//判斷該點(diǎn)是否是障礙物if(!map[newP.x][newP.y].gameObject.GetComponent<Tile>().CheckObstacle()){continue;}//查看是否在開(kāi)放表AstarNode node = openList.FirstOrDefault(p => p.pos == newP);//linq查詢openlist中是否有該點(diǎn)的節(jié)點(diǎn)//不在開(kāi)放表就計(jì)算G,H,F,加入開(kāi)放表,邊的代價(jià)默認(rèn)為1if(node==null){//Debug.Log("添加");AstarNode newNode = new AstarNode();newNode.pos = newP;newNode.G = curNode.G+1;newNode.H = Manhattan(newNode.pos,targetP);newNode.F = newNode.G+newNode.H;cameFrom[newNode.pos] = curNode.pos; //記錄路徑openList.Add(newNode);}else    //在開(kāi)放表,判斷當(dāng)前路徑代價(jià)是否更小,是否要更新代價(jià){//如果當(dāng)前路徑代價(jià)更小,更新代價(jià)和路徑if(node.G > curNode.G+1) {node.G = curNode.G+1;node.F = node.G+node.H;cameFrom[node.pos] = curNode.pos;}}//如果當(dāng)前點(diǎn)就是目標(biāo)點(diǎn),則停止尋路if(curNode.pos == targetP){result = true;break;}}}//如果找到路徑,通過(guò)終點(diǎn)與cameFrom,從后往前找到整條路徑。if(result){//通過(guò)棧把路徑節(jié)點(diǎn)轉(zhuǎn)成從起點(diǎn)到終點(diǎn)Stack<Vector2Int> path_stack = new Stack<Vector2Int>();Vector2Int pos = targetP;path_stack.Push(targetP);//將節(jié)點(diǎn)壓入棧內(nèi)while(pos!=startP){Vector2Int newP = cameFrom[pos];pos = newP;path_stack.Push(pos);}//將棧內(nèi)節(jié)點(diǎn)彈出while(path_stack.Count>0){pos = path_stack.Pop();path.Add(pos);//Debug.Log(pos);}}else{Debug.Log("沒(méi)找到");}return path;}public int Manhattan(Vector2Int a,Vector2Int b) //獲取兩點(diǎn)曼哈頓距離{return Mathf.Abs(a.x -b.x)+Mathf.Abs(a.y-b.y);}}

這段代碼通過(guò)傳遞地圖網(wǎng)格,地點(diǎn)和終點(diǎn),實(shí)現(xiàn)了簡(jiǎn)單的A星尋路算法。首先構(gòu)建一個(gè)新的Astar節(jié)點(diǎn),設(shè)置為起點(diǎn)節(jié)點(diǎn)。起點(diǎn)的G為0,H采用曼哈頓距離,F = G + H。將起點(diǎn)節(jié)點(diǎn)加入到開(kāi)放表。要取到開(kāi)放表中F最小的節(jié)點(diǎn),因?yàn)閿?shù)據(jù)量較小,這里在每次從開(kāi)放表取節(jié)點(diǎn)前都以F進(jìn)行一次排序得到F最小節(jié)點(diǎn)(用優(yōu)先隊(duì)列會(huì)更好)。通過(guò)該節(jié)點(diǎn)訪問(wèn)其上右下左的四個(gè)點(diǎn),并判斷這些點(diǎn)是否能夠加入開(kāi)放表(坐標(biāo)超出網(wǎng)格范圍,節(jié)點(diǎn)在關(guān)閉表,節(jié)點(diǎn)是障礙點(diǎn)。都不能加入開(kāi)放表)關(guān)閉表使用字典存儲(chǔ),在實(shí)現(xiàn)關(guān)閉表的同時(shí)還記錄了節(jié)點(diǎn)之間的路徑信息。最后判斷坐標(biāo)點(diǎn)是否在開(kāi)放表,不在開(kāi)放表的點(diǎn)構(gòu)建節(jié)點(diǎn)并加入開(kāi)放表,這里默認(rèn)兩點(diǎn)間的代價(jià)為1;在開(kāi)放表中的則判斷新的路徑中代價(jià)是否更小,更小則更新代價(jià)和路徑信息,否則不做處理。最后判斷坐標(biāo)點(diǎn)是否為目標(biāo)坐標(biāo),如果是目標(biāo)坐標(biāo)即停止尋路。最后通過(guò)存儲(chǔ)的路徑信息找到完整路徑。
A星尋路算法的優(yōu)化技巧

  1. 合理選擇啟發(fā)式函數(shù):啟發(fā)式函數(shù)用于估計(jì)從當(dāng)前節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的代價(jià)。選擇合適的啟發(fā)式函數(shù)能夠提高算法的性能和準(zhǔn)確性。常見(jiàn)的啟發(fā)式函數(shù)有曼哈頓距離、歐幾里得距離等。
  2. 權(quán)重調(diào)整:根據(jù)實(shí)際應(yīng)用場(chǎng)景和需求,可以對(duì)邊的權(quán)重進(jìn)行調(diào)整,以優(yōu)化搜索效率和找到更符合特定要求的路徑。
  3. 動(dòng)態(tài)調(diào)整開(kāi)放列表的大小:在搜索過(guò)程中,可以根據(jù)需要?jiǎng)討B(tài)調(diào)整開(kāi)放列表的大小,以平衡搜索效率和內(nèi)存消耗。
  4. 利用優(yōu)先隊(duì)列進(jìn)行節(jié)點(diǎn)排序:將開(kāi)放列表中的節(jié)點(diǎn)按照代價(jià)從小到大排序,可以利用優(yōu)先隊(duì)列數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)高效的排序操作,從而提高算法性能。
  5. 預(yù)處理和緩存:在某些情況下,可以對(duì)地圖進(jìn)行預(yù)處理或使用緩存機(jī)制來(lái)提高搜索效率。例如,可以將一些已知的信息存儲(chǔ)起來(lái)以便快速訪問(wèn),或者預(yù)先計(jì)算某些節(jié)點(diǎn)的代價(jià)等。
  6. 多線程并行處理:在多核處理器環(huán)境下,可以利用多線程技術(shù)對(duì)不同區(qū)域或方向的搜索進(jìn)行并行處理,以提高算法的整體性能。
  7. 局部搜索和回溯策略:在搜索過(guò)程中,可以結(jié)合局部搜索和回溯策略來(lái)優(yōu)化路徑選擇和調(diào)整方向。當(dāng)遇到局部最優(yōu)解時(shí),可以通過(guò)回溯或嘗試其他方向來(lái)尋找更好的解。
  8. 增量式更新地圖:對(duì)于動(dòng)態(tài)變化的地圖環(huán)境,可以采用增量式更新地圖的方法來(lái)提高算法的適應(yīng)性。當(dāng)?shù)貓D發(fā)生變化時(shí),只對(duì)變化區(qū)域進(jìn)行重新搜索和處理,而保持其他區(qū)域的搜索

A星尋路算法的應(yīng)用
A星尋路算法廣泛應(yīng)用于游戲開(kāi)發(fā)、機(jī)器人導(dǎo)航、路徑規(guī)劃等領(lǐng)域。以下是一些具體的應(yīng)用場(chǎng)景:

  1. 游戲開(kāi)發(fā):在角色扮演游戲、策略游戲等類型中,A星算法常被用于實(shí)現(xiàn)智能角色的尋路和移動(dòng)。通過(guò)找到最短路徑,玩家可以更流暢地控制角色,提高游戲的可玩性和體驗(yàn)。
  2. 機(jī)器人導(dǎo)航:在機(jī)器人領(lǐng)域,A星算法用于指導(dǎo)機(jī)器人從起點(diǎn)到目標(biāo)點(diǎn)的路徑規(guī)劃。這種算法能夠幫助機(jī)器人避開(kāi)障礙物,選擇最佳路徑,從而實(shí)現(xiàn)高效、安全的導(dǎo)航。
  3. 路徑規(guī)劃:在交通、物流等領(lǐng)域,A星算法用于規(guī)劃最短或最優(yōu)路徑。例如,在物流配送中,通過(guò)使用A星算法,可以找到從起點(diǎn)到目的地的最短路徑,從而提高配送效率。
  4. 圖形編輯和可視化:在處理復(fù)雜的圖形數(shù)據(jù)時(shí),A星算法可以幫助找到從一個(gè)節(jié)點(diǎn)到另一個(gè)節(jié)點(diǎn)的最短路徑,從而進(jìn)行高效的編輯和可視化操作。

總結(jié)
A星尋路算法是一種高效、實(shí)用的路徑搜索算法,它結(jié)合了廣度優(yōu)先搜索和最佳優(yōu)先搜索的特點(diǎn),通過(guò)啟發(fā)式函數(shù)評(píng)估節(jié)點(diǎn)的重要性,從而快速找到最短路徑。通過(guò)合理的優(yōu)化技巧,A星算法能夠適多種應(yīng)用場(chǎng)景,提高性能和準(zhǔn)確性。

http://m.aloenet.com.cn/news/43928.html

相關(guān)文章:

  • 建設(shè)網(wǎng)站 教學(xué)反思seo網(wǎng)站優(yōu)化收藏
  • 南京專業(yè)網(wǎng)站營(yíng)銷小程序推廣平臺(tái)
  • dw做旅游網(wǎng)站教程怎么聯(lián)系百度人工服務(wù)
  • 做國(guó)際貿(mào)易的網(wǎng)站產(chǎn)品品牌策劃方案
  • 電子商務(wù)公司網(wǎng)站建立前期準(zhǔn)備網(wǎng)絡(luò)營(yíng)銷管理名詞解釋
  • 可以做視頻推廣的網(wǎng)站有哪些免費(fèi)注冊(cè)個(gè)人網(wǎng)站不花錢
  • 上海龍象建設(shè)集團(tuán)公司網(wǎng)站網(wǎng)絡(luò)平臺(tái)營(yíng)銷
  • wordpress上傳swf網(wǎng)站優(yōu)化排名公司哪家好
  • 鄭州上海做網(wǎng)站的公司有哪些熊貓關(guān)鍵詞工具
  • 張家口手機(jī)臺(tái)app下載武漢百度推廣優(yōu)化
  • 公司網(wǎng)站維護(hù)費(fèi)大概需要多少seo綜合查詢 站長(zhǎng)工具
  • 東莞萬(wàn)江網(wǎng)站制作網(wǎng)絡(luò)營(yíng)銷產(chǎn)品的特點(diǎn)
  • 如何做網(wǎng)站的需求分析系統(tǒng)清理優(yōu)化工具
  • 閔行區(qū)做網(wǎng)站公司百度指數(shù)工具
  • 我們網(wǎng)站的優(yōu)勢(shì)北京seo報(bào)價(jià)
  • wordpress 獨(dú)立站營(yíng)銷網(wǎng)站建設(shè)規(guī)劃
  • 純css做的響應(yīng)式網(wǎng)站一鍵優(yōu)化
  • 設(shè)計(jì)網(wǎng)站什么叫空間不穩(wěn)定seo關(guān)鍵詞排名優(yōu)化銷售
  • 大型購(gòu)物網(wǎng)站開(kāi)發(fā)網(wǎng)絡(luò)推廣軟文范文
  • 樂(lè)山網(wǎng)站建設(shè)培訓(xùn)學(xué)校網(wǎng)站seo優(yōu)化發(fā)布高質(zhì)量外鏈
  • ps網(wǎng)站設(shè)計(jì)怎么做快速收錄網(wǎng)
  • 如何讓人幫忙做網(wǎng)站網(wǎng)站檢測(cè)
  • 怎么做跳轉(zhuǎn)流量網(wǎng)站搜索引擎調(diào)詞軟件
  • 怎樣做網(wǎng)頁(yè)游戲網(wǎng)站線上推廣是什么意思
  • 網(wǎng)站如何做導(dǎo)航軟文營(yíng)銷文章案例
  • 免費(fèi)做頭像網(wǎng)站色盲圖
  • 百度網(wǎng)站是怎么做的營(yíng)銷案例最新
  • 深圳建站公司專業(yè)公司最近熱點(diǎn)新聞事件2023
  • 焦作企業(yè)網(wǎng)站建設(shè)網(wǎng)站提交
  • 站長(zhǎng)工具綜合查詢ip怎樣在百度答題賺錢