ROB 第一篇 DFS BFS (寻迹算法)
ROB 第一篇 DFS & BFS
- DFS & BFS
- 簡單介紹
- 原理
- DFS
- BFS
- 總結(jié)
DFS & BFS
簡單介紹
DFS (depth first search) 和 BFS (breadth first search) 是兩種比較基礎(chǔ)的尋跡算法。何謂尋跡算法呢?限本人語言功底有限(高考語文不及格),不岔開來講,請自行百度或谷歌。反正字面意思,就是找到路徑的算法。
這是DFS跑的圖,感覺走位很蛇皮。有點淡紫色的是尋跡走過的點,藍色開始點,綠色是結(jié)束點。
這是BFS跑的,走位不這么蛇皮了, 算是直直的找到了目標(biāo)點。
原理
DFS
首先申明一下,這里我假設(shè)尋跡只能從四個方向走,上下左右。
直接先PO一下DFS的偽代碼
大致是這么個意思,來解釋一下。
node 在這里中文意思是節(jié)點的意思。
這里visit_stack可以看作一個列表或者數(shù)組,里面存放著已經(jīng)訪問過的點。在循環(huán)的時候,會pop出current_node(pop在此解釋一下是刪掉數(shù)組里最后一個元素,并返回刪除元素的值)。 test_collision 在這里表示檢測是否與障礙物相碰撞,具體怎么檢測按具體情況而定,在這里不岔開來講。
nodes_near_by代表current_node周圍的點,我做的是周圍四個點,8個點講道理也是可以的。
cal_distance 這個是計算兩個點之間的距離,一般來說相鄰點之間的距離就是定值。
整個程序的意思就是:先把所有點初始化,每個點有三個量(struct結(jié)構(gòu)體搞一下哈),每個點初始的distance都為無限大。然后會有一個數(shù)據(jù)集,叫做visit_stack(列表或數(shù)組)。在尋跡前已知起始點(start_node),和目標(biāo)點(goal_node)。第一步會把起始點放到visit_stack里, 然后進入循環(huán)。
每次循環(huán)先pop出來一個點當(dāng)作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也更新一下。當(dāng)周圍點就是目標(biāo)點時,終止循環(huán)。
然后就可以從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唯一的區(qū)別就是就是在while循環(huán)里,一開始的pop變成了shift。
shift 和 pop 比,恰恰相反,是刪掉數(shù)組里第一個元素,并返回刪除元素的值。
看一下,這里 BFS 是像菱形一樣向外擴張的。
總結(jié)
這兩個算法算是比較簡單的尋跡算法,BFS相對于DFS是可以找到比較優(yōu)的路徑的。后面我還會寫A*尋跡算法,和這個比起來,BFS和DFS就是個弟弟,但其實三者框架大致一樣。
總結(jié)
以上是生活随笔為你收集整理的ROB 第一篇 DFS BFS (寻迹算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql语句中select……as的用法
- 下一篇: Fortran中function,sub