日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ROB 第一篇 DFS BFS (寻迹算法)

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROB 第一篇 DFS BFS (寻迹算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ROB 第一篇 DFS & BFS

  • DFS & BFS
    • 簡單介紹
    • 原理
      • DFS
      • BFS
    • 總結

DFS & BFS

簡單介紹

DFS (depth first search) 和 BFS (breadth first search) 是兩種比較基礎的尋跡算法。何謂尋跡算法呢?限本人語言功底有限(高考語文不及格),不岔開來講,請自行百度或谷歌。反正字面意思,就是找到路徑的算法。

這是DFS跑的圖,感覺走位很蛇皮。有點淡紫色的是尋跡走過的點,藍色開始點,綠色是結束點。


這是BFS跑的,走位不這么蛇皮了, 算是直直的找到了目標點。

原理

DFS

首先申明一下,這里我假設尋跡只能從四個方向走,上下左右。
直接先PO一下DFS的偽代碼

all nodes = {distance=infinity, parent=none, visited=False} start_node = {distance=0, parent=none, visited=True} visit_stack.append(start_node) while iterate == True:current_node = pop (visit_stack)for each nodes_near_by:if (test_collision(nodes_near_by)==false) && nodes_near_by.visited = False :visit_stack.append(nodes_near_by)if nodes_near_by.distance>current_node.distance + cal_distance(nodes_near_by, current_node):nodes_near_by.parent = current_nodenodes_near_by.distance = current_node.distance + cal_distance(nodes_near_by, current_node)if nodes_near_by == goal_node:nodes_near_by.parent = current_nodeiterate = Falsebreaknodes_near_by. visited = True

大致是這么個意思,來解釋一下。
node 在這里中文意思是節點的意思。
這里visit_stack可以看作一個列表或者數組,里面存放著已經訪問過的點。在循環的時候,會pop出current_node(pop在此解釋一下是刪掉數組里最后一個元素,并返回刪除元素的值)。 test_collision 在這里表示檢測是否與障礙物相碰撞,具體怎么檢測按具體情況而定,在這里不岔開來講。
nodes_near_by代表current_node周圍的點,我做的是周圍四個點,8個點講道理也是可以的。
cal_distance 這個是計算兩個點之間的距離,一般來說相鄰點之間的距離就是定值。

整個程序的意思就是:先把所有點初始化,每個點有三個量(struct結構體搞一下哈),每個點初始的distance都為無限大。然后會有一個數據集,叫做visit_stack(列表或數組)。在尋跡前已知起始點(start_node),和目標點(goal_node)。第一步會把起始點放到visit_stack里, 然后進入循環。
每次循環先pop出來一個點當作current_node,然后再current_node 周圍找點進行判斷。如果nodes_near_by的distance量大于current_node的distance的量與cal_distance(nodes_near_by, current_node)之和,說明是一條路子,就把nodes_near_by的parent指為 current_node,nodes_near_by的distance也更新一下。當周圍點就是目標點時,終止循環。

然后就可以從goal_node開始溯源,goal_node的爸爸是誰,goal_node的爸爸是誰,goal_node的爸爸的爸爸是誰,直到goal_node的爸爸的爸爸的爸爸。。。爸爸是start_node為止。然后這樣路徑就出來了(偽代碼種沒有包含)。

BFS

BFS的代碼和DFS代碼非常相像。

all nodes = {distance=infinity, parent=none, visited=False} start_node = {distance=0, parent=none, visited=True} visit_stack.append(start_node) while iterate == True:current_node = shift(visit_stack)for each nodes_near_by:if (test_collision(nodes_near_by)==false) && nodes_near_by.visited = False :visit_stack.append(nodes_near_by)if nodes_near_by.distance>current_node.distance + cal_distance(nodes_near_by, current_node):nodes_near_by.parent = current_nodenodes_near_by.distance = current_node.distance + cal_distance(nodes_near_by, current_node)if nodes_near_by == goal_node:nodes_near_by.parent = current_nodeiterate = Falsebreaknodes_near_by. visited = True

來來來,大家來找下不同。
大家的眼睛還是雪亮的。BFS 和 DFS唯一的區別就是就是在while循環里,一開始的pop變成了shift。
shift 和 pop 比,恰恰相反,是刪掉數組里第一個元素,并返回刪除元素的值。


看一下,這里 BFS 是像菱形一樣向外擴張的。

總結

這兩個算法算是比較簡單的尋跡算法,BFS相對于DFS是可以找到比較優的路徑的。后面我還會寫A*尋跡算法,和這個比起來,BFS和DFS就是個弟弟,但其實三者框架大致一樣。

總結

以上是生活随笔為你收集整理的ROB 第一篇 DFS BFS (寻迹算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。