智能駕駛規劃控制理論學習02-基于搜索的路徑規劃方法

目錄

一、路徑搜索問題

二、圖論基礎

三、圖搜索方法

1、廣度優先搜索(BFS)

bfs與dfs的區別

bfs的搜索過程????????

bfs的算法實現

2、迪杰斯特拉算法(Dijkstra)

核心思想

優先級隊列

Dijkstra搜索過程

Dijkstra優缺點分析

3、A*算法

核心思想

A*搜索過程????????

啟發式函數

總結

動態規劃


一、路徑搜索問題

? ? ? ? 當我們要搜索一個從起到到終點的最優路徑時,要思考何為最優?是從距離角度、時間角度還是其他方面。為了找到一條這樣的路徑,我們通常會使用一種圖像搜索算法,這樣地圖就可以作為一個圖表進行使用。

? ? ? ? 對于這種路徑搜索問題,將圖表上的一系列位置作為節點、它們之間的連線以及起點終點(拓撲地圖信息)作為輸入,得到的輸出是由節點和邊構成的網格地圖。

二、圖論基礎

? ? ? ? 在圖論中可以將圖簡單分為無向圖(Undirected Graph)、有向圖(Directed Graph)和權重圖(Weighted Graph)。

?????????在圖論中,圖由頂點(vertices)和邊(edges)組成。頂點代表圖中的個體或實體,而邊表示頂點之間的關系或連接。這種連接可以是有向的或無向的,具體取決于圖的類型和定義。

????????在圖論中,圖的權(Weight)指的是在圖的邊上賦予的一個數值或度量,用于表示頂點之間的關系或連接的強度、距離、成本等信息。

三、圖搜索方法

? ? ? ? 本節主要介紹圖搜索中常用的算法:廣度優先算法(BFS)、迪杰斯特拉算法和A*算法。

1、廣度優先搜索(BFS)

bfs與dfs的區別
  • bfs是先把本節點所連接的所有節點遍歷一遍,走到下一個節點的時候,再把連接節點的所有節點遍歷一遍,搜索方向更像是四面八方的搜索過程。
  • 深度優先搜索是向一個方向去搜,不到黃河不回頭,直到遇到絕境了,搜不下去了,再換方向(換方向的過程就涉及到了回溯)。

? ? ? ? 相比較而言,廣搜的搜索方式就適合于解決兩個點之間的最短路徑問題。

bfs的搜索過程????????

? ? ? ? 這里利用隊列的方式對bfs算法的搜索過程進行介紹,一開始先將起始節點入隊,利用隊列先進先出的特點在起始節點出隊時將與起始節點相連的其他節點以此入隊,然后繼續重復上述的過程,再將隊首元素彈出,將與之相鄰的未訪問過的節點依次添加入隊,循環直到遇到目標節點或隊列為空。

bfs的算法實現

? ? ? ? 在代碼隨想錄(新更新篇)中有介紹過bfs蘇娜發的C++實現,這里就直接引用了。

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四個方向
// grid 是地圖,也就是一個二維數組
// visited標記訪問過的節點,不要重復訪問
// x,y 表示開始搜索節點的下標
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定義隊列que.push({x, y}); // 起始節點加入隊列visited[x][y] = true; // 只要加入隊列,立刻標記為訪問過的節點while(!que.empty()) { // 開始遍歷隊列里的元素pair<int ,int> cur = que.front(); que.pop(); // 從隊列取元素int curx = cur.first;int cury = cur.second; // 當前節點坐標for (int i = 0; i < 4; i++) { // 開始想當前節點的四個方向左右上下去遍歷int nextx = curx + dir[i][0];int nexty = cury + dir[i][1]; // 獲取周邊四個方向的坐標if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐標越界了,直接跳過if (!visited[nextx][nexty]) { // 如果節點沒被訪問過que.push({nextx, nexty});  // 隊列添加該節點為下一輪要遍歷的節點visited[nextx][nexty] = true; // 只要加入隊列立刻標記,避免重復訪問}}}}

? ? ? ? bfs向各個方向搜索的可能性都相同,如果各邊的權重都為1,那么使用BFS算法進行搜索就是最優的。但是在大多數情況下,往往各個方向的運動都會有不同的代價值(權重),如何對這些具有不同權重的圖進行處理就就要引出下面的算法了。

2、迪杰斯特拉算法(Dijkstra)

核心思想

? ? ? ? 與BFS直接將隊列中彈出元素相連的所有元素都存入隊列,Dijkstra利用貪心的思想每次選擇都是累計代價值最小的節點進行相加。

? ? ? ? 具體來說,Dijkstra創建了一個先變量g(n),以此來代替從起始節點到達當前節點所消耗的代價值,每次從開放集openset中尋找累計大價值最小的節點進行相加,而不是訪問隊列中的第一個元素。

優先級隊列

? ? ? ? 優先級隊列中每一個元素都有著與之對應的優先級。在優先級隊列中,優先級高的元素會比優先級低的元素先訪問。

Dijkstra搜索過程

? ? ? ? 輸入:一個圖表(包含節點和路徑的集合)和一個起始節點;

? ? ? ? 輸出:到任意節點的最短路徑。

? ? ? ? 用偽代碼進行簡潔描述:????????

Algorithm Dijkstra(G, start):let open_list be pirority queueopen_list.push(start, 0)g[start] := 0while (open_list is not empty):current := open_list.pop()mark current as visitedif current is the goal:return currentfor all unvisited neighbours next of current in Graph G:next_code := g[current] + cost(current, next)if next is not in open_list:open_list.push(next, next_cost)else:if g[next] > next_cost:g[next] := next_cost

? ? ? ? 先創建一個優先級隊列open_list,將起始節點存入優先級隊列,并設置累計代價函數的初值為0,然后進行循環(循環終止條件設為優先級隊列非空),在循環中每次彈出優先級隊列中的節點就要判斷是否是目標節點,如果是目標節點就直接返回,若不是就要將彈出節點設為已訪問節點,并對圖表中當前彈出節點周圍的其余鄰居節點進行判斷,若是未訪問節點則直接存入優先級隊列,若已訪問則進行累計代價函數更新。

Dijkstra優缺點分析

? ? ? ? 優點:

  • Dijkstra算法可以尋找到起始節點到圖表上其他所有節點的最短路徑;
  • Dijkstra孫發滿足最優原則。

? ? ? ? 缺點:

  • 該算法始終在優先級隊列中尋找最短路徑,而不考慮方向或距離目標的遠近。因此,若使用它來搜索一個特定目標的最短路徑時,并不高效。

3、A*算法

核心思想

? ? ? ? A*算法在Dijkstra算法的基礎上引入啟發式函數作為對目標節點的引導,從而提高了搜索的效率。

????????啟發式函數h(n)表示從節點n到目標的估計代價。使用f-score來評估每個節點的代價:f(n) = g(n) + h(n),然后在優先級隊列中選取f-score最小的節點,而不是Dijkstra中的g-score。

A*搜索過程????????
Algorithm Astar(G, start):let open_list be priority queueg[start] := 0f[start] = g[start] + h[start]open_list.push(start, f[start])while (open_list is not empty):current := open_list.pop()mark current as visitedif current is the goal:return currentfor all unvisited neighbours next of current in Graph G:next_cost := g[current] + cost(current, next)if next is not in open_list:open_list.push(next, next_cost + h[next]else:if g[next] > next_costg[next] = next_costf[next] = next_cost + h[next]

? ? ? ? 依然是創建一個優先級隊列,并對g(n)和f(n)賦初值(假設啟發式函數h(n))已知,再將初始節點和其對應的f-socre存入優先級隊列,然后開始進入循環(循環的終止條件式隊列非空),彈出隊列中的節點,將其標志為已訪問,若該節點為目標節點直接返回,否則要對其在圖表中的鄰居節點進行判斷,若鄰居節點未被訪問則存入優先級隊列中,存放時對應的代價函數還要加上h-score,若已訪問則進行代價值更新。

啟發式函數

? ? ? ? A*算法有別于Dijkstra的最大之處就在于啟發算法的加入,但是在路徑搜索問題中沒有特定的啟發式函數,因為每一種情況都是不同的。

? ? ? ? 要注意啟發式函數不能過高的估計代價值,只要啟發式函數提供的估計值小于真實值,那么A*總會找到一條最優的路徑并且通常比Dijkstra效率高

? ? ? ? 如果啟發式函數的代價值估計過高了,會產生什么影響呢,以下圖為例:

? ? ? ? ?圖中所示的B節點對應的啟發式函數估計的代價值高于其真實值,因此C節點的f-score高于B節點的f-score,因此會錯誤地優先選擇C節點通過,但實際上B節點才是更優的選擇。

? ? ? ? A*搜索的效率與精度也取決于啟發式函數的選擇,主要有以下四種情況:

  • h(n) = 0:此時f-socre = g-score A*算法退化為Dijkstra算法;
  • h(n) < cost(n, goal):A*滿足最優性,搜索效率上高于Dijkstra算法;
  • h(n) = cost(n, goal):A*滿足最優性,并且達到最高搜索效率;
  • h(n) > cost(n, goal):啟發式函數高估了實際代價,不具有最優性。

總結

  • BFS在各個方向上的搜索可能性相同,并且如果各邊權重為1,bfs搜索得到的路徑滿足最優性;
  • Dijkstra算法利用貪心的思想選擇累計代價值最低的節點,并且能夠在有權圖中表現出最優性,如果各邊權重為1,那么Dijkstra搜索得到的路徑和BFS搜索得到的相同。
  • A*是Dijkstra的改進,通過加入啟發式函數提高搜索的效率,啟發式函數的設計會直接影響到搜索的效率和精度。

動態規劃

? ? ? ? 基于搜索的路徑規劃問題除了上面的圖搜索方法外,動態規劃也是比較常用的方法。

????????關于動態規劃的理論和例子我在前面的代碼隨想錄算法訓練營Day38|動態規劃理論基礎中有過詳細介紹,該節就僅僅介紹動態規劃的適用場景。

  • 最優子結構

? ? ? ? 我們可以把一個較大的問題分解成相似的子問題,如果我們能最優地解決子問題,我們就可以用它們來解決原來較大的問題;

  • 重疊子問題

? ? ? ? 問題的遞歸解包含了許多重復多次的子問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712493.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【.NET Core】深入理解IO - FileSteam流

【.NET Core】深入理解IO - FileSteam流 文章目錄 【.NET Core】深入理解IO - FileSteam流一、IO流概述二、文件流FileStream2.1 FileStream概述2.2 FileStream檢測流位置更改2.3 FileStream構造函數2.4 FileStream常用屬性2.5 FileStream.Read方法2.6 FileStream.Write方法2.7…

插混、油混、增程式、輕混、強混,啥區別

這里寫自定義目錄標題 隨著我國新能源汽車的大力推進&#xff0c;電車可以說是世界未來的主流&#xff0c;只不過現在是處在一個過渡時代 這是個好時代&#xff0c;因為我們見證并體驗著歷史過渡的細節 這是個不好的時代&#xff0c;因為我們可能只是未來新新人類的試驗品 幫他…

MyBatis 學習(三)之 MyBatis 全局配置文件

目錄 1 MyBatis 全局配置文件 2 properties 元素 3 setting 設置 4 typeAlianses 別名處理器 5 typeHandler 類型處理器 6 objectFacotry 對象工廠&#xff08;了解&#xff09; 7 plugins 插件&#xff08;了解&#xff09; 8 environments 運行環境 9 databaseIdPro…

今日arXiv最熱大模型論文:點擊即可播放!港中文發布大模型寫歌神器!

一首歌&#xff0c;包含作詞作曲兩個部分。擅長作詞or作曲就已經很牛了。比如方文山是周杰倫的御用作詞人&#xff0c;而周杰倫寫過很多耳熟能詳的曲子。而兼具作詞作曲才華的全能創作人卻是難得一見。 最近港中文發布了一款歌曲創作大模型SongComposer&#xff0c;作詞作曲都…

自測-1 打印沙漏

文章預覽&#xff1a; 題目算法代碼 題目 算法 以前做過這個&#xff0c;那次是c語言寫的&#xff0c;一點一點處理一層一層完成&#xff0c;這次我換了一種語言用了另一種思想使用遞歸去寫&#xff0c;還是我們要先求出應該有多少層這個很容易&#xff0c;中間輸出部分我們算…

常見查找算法Java實現

順序&#xff08;線性&#xff09;查找二分查找/折半查找插值查找斐波那契查找 線性查找 判斷數列是否包含要求&#xff0c;如果找到了&#xff0c;就提示找到了&#xff0c;并給出下標值 // 線性查找 public static ArrayList<Integer> seqSearch(int[] arr, int value…

解決 npm install 報錯的問題

在使用 npm 安裝依賴包時&#xff0c;有時候會遇到各種報錯問題&#xff0c;以下是一些常見的報錯及解決方法&#xff1a; 1. ENOENT: no such file or directory 如果出現類似 ENOENT: no such file or directory 的報錯&#xff0c;可能是因為某些文件或目錄缺失或路徑錯誤…

動態規劃課堂3-----簡單多狀態問題(買賣股票最佳時機)

目錄 引入&#xff1a; 例題1&#xff1a;按摩師&#xff08;打家劫舍I&#xff09; 例題2&#xff1a;打家劫舍II 例題3&#xff1a;刪除并獲得點數 例題4&#xff1a;粉刷房子 例題5&#xff1a;買賣股票的最佳時機含冷凍 結語&#xff1a; 引入&#xff1a; 相信看到…

深度學習 精選筆記(8)梯度消失和梯度爆炸

學習參考&#xff1a; 動手學深度學習2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、請聯系侵刪。 ②已寫完的筆記文章會不定時一直修訂修改(刪、改、增)&#xff0c;以達到集多方教程的精華于一文的目的。 ③非常推薦上面&#xff08;學習參考&#x…

帶你快速初步了解Python列表

1.列表 列表主要是用來存儲多個數據&#xff0c;是有序的集合 2.創建列表 """ 語法&#xff1a;變量名 [數據1,數據2,數據3......] 注意&#xff1a;列表中的數據類型可以是各種不同的數據類型 """ 創建空列表 list1 [] print(list1) …

Gitlab: 私有化部署

目錄 1. 說明 2. 資源要求 3. 安裝 4. 配置實踐 4.1 服務器 4.2 人員與項目 4.2 部署準備 4.2.1 訪問變量及用戶賬號設置 4.2.2 Runner設置 4.2.3 要點 5. 應用項目 CI/CD 6. 參考 1. 說明 gitlab是一個強大且免費的代碼管理/部署工具&#xff0c;能統一集成代碼倉…

AngularJS入門

1. AngularJS簡介 AngularJS是一個JavaScript框架,用js編寫的庫 <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script> <!-- 放在<body> 元素的底部。提高網頁加載速度 -->1.1. AngularJS 擴展了 HTML …

Freesia項目目錄結構

目錄結構 前端目錄&#xff1a; &#xff08;目錄結構來自layui-vue-admin&#xff09; src文件下 api&#xff08;前端請求后端服務的路由&#xff09;assert&#xff08;一些內置或必要的資源文件&#xff09;layouts&#xff08;全局框架樣式組件&#xff09;router&…

Unity(第十九部)射線

在Unity中&#xff0c;射線檢測通常用于碰撞檢測&#xff0c;比如&#xff1a;在游戲中&#xff0c;開槍射擊時&#xff0c;需要判斷擊中的物體、子彈擊中的位置&#xff1b;用鼠標來控制物體的移動&#xff1b;用鼠標拾取某個物體。 射線&#xff0c;顧名思義&#xff0c;在數…

【轉載】深度學習筆記——詳解損失函數

原文鏈接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN賬號: Purepisces github賬號: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 損失函數 根據您使用的神經網絡類型和數…

第四十七回 一丈青單捉王矮虎 宋公明二打祝家莊-強大而靈活的python裝飾器

四面全是埋伏&#xff0c;宋江和眾人一直繞圈跑不出去。正在慌亂之時&#xff0c;石秀及時趕到&#xff0c;教大家碰到白楊樹就轉彎走。走了一段時間&#xff0c;發現圍的人越來越多&#xff0c;原來祝家莊以燈籠指揮號令。花榮一箭射下來紅燈龍&#xff0c;伏兵自己就亂起來了…

Northwestern University-844計算機科學與技術/軟件工程-復試注意事項【考研復習】

本文提到的西北大學是位于密歇根湖泊畔的西北大學。西北大學&#xff08;英語&#xff1a;Northwestern University&#xff0c;簡稱&#xff1a;NU&#xff09;是美國的一所著名私立研究型大學。它由九人于1851年創立&#xff0c;目標是建立一所為西北領地地區的人服務的大學。…

【力扣白嫖日記】550.游戲玩法分析IV

前言 練習sql語句&#xff0c;所有題目來自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免費數據庫練習題。 今日題目&#xff1a; 550.游戲玩法分析IV 表&#xff1a;Activity 列名類型player_idintdevice_idintevent_datedategames_played…

從 iOS 設備恢復數據的 20 個iOS 數據恢復工具

作為 iPhone、iPad 或 iPod 用戶&#xff0c;您可能普遍擔心自己可能會丟失存儲在珍貴 iOS 設備中的所有寶貴數據。數據丟失的原因多種多樣&#xff0c;這里列出了一些常見原因&#xff1a; 1. iOS 軟件更新 2. 恢復出廠設置 3. 越獄 4. 誤操作刪除數據 5. iOS 設備崩潰 …

C++筆記(五)--- 虛函數(virtual)

目錄 虛函數介紹 虛函數、覆蓋和重載區別 虛函數介紹 C的虛函數是多態性的表現 1.構造函數不能為虛函數2.子類繼承時虛函數仍為虛函數3.虛函數類外實現時&#xff0c;不需要加virtual4.有虛函數的類&#xff0c;析構函數一定要寫成虛函數&#xff08;否則可能會造成內存泄漏&…