面試中算法(A星尋路算法)

一、問題需求:

? ? ?迷宮尋路游戲中,有一些小怪物要攻擊主角,現在希望你給這些小怪物加上聰 明的AI (Artificial Intelligence,人工智能),讓它們可以自動繞過迷宮中的障礙物,尋找到主角的所在。

A星尋路算法 (A*search algorithm),是一種用于尋找有效路徑的算法。

迷宮游戲的場景通常都是由小方格組成的。假設我們有一個6x7大小的迷宮

綠色的格子是起點紅色的格子是終點,中間的3個紫色格子是一堵墻

A星尋路算法通過計算和量化行走的各個方向的代價,來選擇最優路徑。
公式:F = G + H
G:從起點走到當前格子的成本,也就是已經花費了多少步。

H:在不考慮障礙的情況下,從當前格子走到目標格子的距離,也就是離目標還有多遠。

F:G和H的綜合評估,也就是從起點到達當前格子,再從當前格子到達目標格子的總步數。

每個方格都標上了?F?,?G?,?H?的值,就像起點右邊的方格那樣,左上角是?F?,左下角是?G?,右下角是?H?。

二、操作步驟:

兩個集合如下:

?open_list――可到達的格子

?close_list—―已到達的格子

第1輪尋路歷程?

第1步:把起點放入open_list可到達格子的集合。?

open_list:grid(2,1)

close_list:

第2步:找出open_list中F值最小的方格作為當前方格。雖然我們沒有直接計算起點方格的F值,但此時open_list中只有唯一的方格grid (2,1),把當前格子移出open_list,放入close_list。代表這個格子已到達并檢查過了。

open_list:

close_list:grid(2,1)

?

第3步:找出當前方格(剛剛檢查過的格子)上、下、左、右所有可到達的格子,看它們是否在open_list或close_list當中。如果不在,則將它們加入open_list,計算出相應的G、H、F值,并把當前格子作為它們的“父節點”。

我們需要一次又一次重復剛才的第 2步和第3步,直到找到終點為止。

第2輪尋路歷程

第1步,找出open_list中F值最小的方格,即方格grid (2,2),將它作為當前方格,并把當前方格移出open_list,放入close_list。代表這個格子已到達并檢查過了。

第2步,找出當前方格上、下、左、右所有可到達的格子,看它們是否在open_list或 close_list當中。如果不在,則將它們加入open_list,計算出相應的G、H、F值,并把當前格子作為它們的“父節點”。 為什么這一次open_list只增加了2個新格子呢?因為grid (2,3)是墻壁,自然不用考慮,而grid (2,1)在close_list中,說明已經檢查過了,也不用考慮。

第3輪尋路歷程

第1步,找出open_list中F值最小的方格。由于此時有多個方格的F值相等,任意選擇一個即可,如將grid (2,3)作為當前方格,并把當前方格移出open_list,放入close_list。代表這個格子已到達并檢查過了。

第2步,找出當前方格上、下、左、右所有可到達的格子,看它們是否在open_list當中。如果不在,則將它們加入open_list,計算出相應的G、H、F值,并把當前格子作為它們的“父節點”。

剩下的操作就是以前面的方式繼續迭代,直到open_list中出現終點方格為止。

''''pip install colorama'''
from colorama import init, Fore, Back, Styledef a_star_search(start, end):# 初始化# 待訪問的格子open_list = []# 已訪問的格子close_list = []# 把起點加入open_listopen_list.append(start)# 主循環,每一輪檢查一個當前方格節點while len(open_list) > 0:# 在open_list中查找 F值最小的節點作為當前方格節點current_grid = find_min_gird(open_list)# 當前方格節點從openList中移除open_list.remove(current_grid)# 當前方格節點進入 closeListclose_list.append(current_grid)# 找到所有鄰近節點neighbors = find_neighbors(current_grid, open_list, close_list)for grid in neighbors:# 鄰近節點不在openList中,標記父親、G、H、F,并放入openListgrid.init_grid(current_grid, end)open_list.append(grid)# 如果終點在openList中,直接返回終點格子for grid in open_list:if (grid.x == end.x) and (grid.y == end.y):return grid# openList用盡,仍然找不到終點,說明終點不可到達,返回空return Nonedef find_min_gird(open_list=[]):# 找到openList中F值最小的節點return min(open_list, key=lambda x: x.f)def find_neighbors(grid, open_list=[], close_list=[]):grid_list = []# 上下左右四個方向if is_valid_grid(grid.x, grid.y-1, open_list, close_list):grid_list.append(Grid(grid.x, grid.y-1))if is_valid_grid(grid.x, grid.y+1, open_list, close_list):grid_list.append(Grid(grid.x, grid.y+1))if is_valid_grid(grid.x-1, grid.y, open_list, close_list):grid_list.append(Grid(grid.x-1, grid.y))if is_valid_grid(grid.x+1, grid.y, open_list, close_list):grid_list.append(Grid(grid.x+1, grid.y))return grid_listdef is_valid_grid(x, y, open_list=[], close_list=[]):# 是否超過邊界if x < 0 or x >= len(MAZE) or y < 0 or y >= len(MAZE[0]):return False# 是否有障礙物if MAZE[x][y] == 1:return False# 是否已經在open_list中if contain_grid(open_list, x, y):return False# 是否已經在closeList中if contain_grid(close_list, x, y):return Falsereturn Truedef contain_grid(grids, x, y):for grid in grids:if (grid.x == x) and (grid.y == y):return Truereturn Falseclass Grid:def __init__(self, x, y):self.x = xself.y = yself.f = 0self.g = 0self.h = 0self.parent = Nonedef init_grid(self, parent, end):self.parent = parentself.g = parent.g + 1self.h = abs(self.x - end.x) + abs(self.y - end.y)self.f = self.g + self.h# 迷宮地圖
MAZE = [[0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0]
]if __name__ == '__main__':# 設置起點和終點start_grid = Grid(2, 1)# end_grid = Grid(2, 5)end_grid = Grid(3, 4)# 搜索迷宮終點result_grid = a_star_search(start_grid, end_grid)# 回溯迷宮路徑path = []while result_grid is not None:path.append(Grid(result_grid.x, result_grid.y))result_grid = result_grid.parent# 輸出迷宮和路徑,路徑用星號表示for i in range(0, len(MAZE)):for j in range(0, len(MAZE[0])):if contain_grid(path, i, j):print(Fore.RED + "*, "+Fore.RESET, end='')else:print(str(MAZE[i][j]) + ", ", end='')print()

? ? ??

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

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

相關文章

json web token及JWT學習與探索

JSON Web Token&#xff08;縮寫 JWT&#xff09;是目前最流行的跨域認證解決方案 作用&#xff1a; 主要是做鑒權用的登錄之后存儲用戶信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

Django使用fetch實現登錄

Django使用session管理&#xff08;cookie&#xff09;實現了一個用戶登錄和會話保持功能。如果需求不太復雜可以使用Django默認的登錄功能。 1 安裝django-cors-headers 首先需要安裝django-cors-headers pip install django-cors-headers2 在settings中配置 需要按照djan…

用Dockerfile和Shell腳本來部署一個Go項目

如何使用Dockerfile和Shell腳本來部署一個Go項目。這種方法能夠幫助我們自動化構建、測試和部署流程&#xff0c;提高開發效率。 **一、項目結構和代碼** 首先&#xff0c;我們需要準備一個Go項目。假設我們的項目結構如下&#xff1a; my-go-app/ ├── main.go ├── D…

1107 老鼠愛大米

solution 記錄每組的最大值&#xff0c;并比較組間的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

【C/C++】Makefile文件的介紹與基本用法

創作不易&#xff0c;本篇文章如果幫助到了你&#xff0c;還請點贊 關注支持一下?>&#x16966;<)!! 主頁專欄有更多知識&#xff0c;如有疑問歡迎大家指正討論&#xff0c;共同進步&#xff01; &#x1f525;c系列專欄&#xff1a;C/C零基礎到精通 &#x1f525; 給大…

第三周:從錯誤中認識到管理

1. 約定兩周時間&#xff0c;完成這個功能 在管理者分配好項目任務后&#xff0c;只是口頭約定兩周的時間&#xff0c;沒有形成需求文檔。對于需求&#xff0c;人與人的理解是不一樣的&#xff0c;有些太過于抽象的東西&#xff0c;太難以描繪&#xff0c;只能一而再再而三的確…

【論文復現】LSTM長短記憶網絡

LSTM 前言網絡架構總線遺忘門記憶門記憶細胞輸出門 模型定義單個LSTM神經元的定義LSTM層內結構的定義 模型訓練模型評估代碼細節LSTM層單元的首尾的處理配置Tensorflow的GPU版本 前言 LSTM作為經典模型&#xff0c;可以用來做語言模型&#xff0c;實現類似于語言模型的功能&am…

vue3的proxy如何取代object和defineproperty

在 Vue 2.x 中&#xff0c;為了響應式地追蹤對象屬性的變化&#xff0c;Vue 使用了 Object.defineProperty 方法。但是&#xff0c;Object.defineProperty 有一些限制&#xff0c;比如它不能追蹤屬性的添加或刪除&#xff0c;也不能直接用于數組或對象原型鏈上的屬性。 Vue 3.…

【Torch學習筆記】

作者&#xff1a;zjk 和 的區別是逐元素相乘&#xff0c;是矩陣相乘 cat stack 的區別 cat stack 是用于沿新維度將多個張量堆疊在一起的函數。它要求所有輸入張量具有相同的形狀&#xff0c;并在指定的新維度上進行堆疊。

【NumPy】關于numpy.mean()函數,看這一篇文章就夠了

&#x1f9d1; 博主簡介&#xff1a;阿里巴巴嵌入式技術專家&#xff0c;深耕嵌入式人工智能領域&#xff0c;具備多年的嵌入式硬件產品研發管理經驗。 &#x1f4d2; 博客介紹&#xff1a;分享嵌入式開發領域的相關知識、經驗、思考和感悟&#xff0c;歡迎關注。提供嵌入式方向…

Android11熱點啟動和關閉

Android官方關于Wi-Fi Hotspot (Soft AP) 的文章&#xff1a;https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager類中有一套系統 API 可以控制熱點的開和關&#xff0c;代碼如下&#xff1a; 開啟熱點&#xff1a; // SoftApC…

Vue 父組件使用refs來直接訪問和修改子組件的屬性或調用子組件的方法

步驟 1: 在子組件中定義要被修改的屬性或方法 首先&#xff0c;在子組件中定義你想要父組件能夠修改或調用的屬性或方法。例如&#xff0c;我們有一個名為MyChildComponent的子組件&#xff0c;它有一個名為childData的數據屬性和一個名為updateData的方法。 // 子組件 MyChi…

國際版Tiktok抖音運營流量實戰班:賬號定位/作品發布/熱門推送/等等-13節

課程目錄 1-tiktok賬號定位 1.mp4 2-tiktok作品發布技巧 1.mp4 3-tiktok數據功能如何開通 1.mp4 4-tiktok熱門視頻推送機制 1.mp4 5-如何發現熱門視頻 1.mp4 6-如何發現熱門音樂 1.mp4 7-如何尋找熱門標簽 1.mp4 8-如何尋找垂直熱門視頻 1.mp4 9-如何發現熱門挑戰賽 1…

【Python特征工程系列】一文教你使用PCA進行特征分析與降維(案例+源碼)

這是我的第287篇原創文章。 一、引言 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;是一種常用的降維技術&#xff0c;它通過線性變換將原始特征轉換為一組線性不相關的新特征&#xff0c;稱為主成分&#xff0c;以便更好地表達數據的方差。 在特征重要…

DAMA數據管理知識體系必背18張框圖

近期對數據管理知識體系中比較重要的框圖進行了梳理總結,總共有18張框圖,供大家參考。主要涉及數據管理、數據治理階段模式、數據安全需求、主數據管理關鍵步驟,主數據架構、DW架構、數據科學的7個階段、數據倉庫建設活動、信息收斂三角、大數據分析架構圖、數據管理成熟度等…

QGIS開發筆記(二):Windows安裝版二次開發環境搭建(上):安裝OSGeo4W運行依賴其Qt的基礎環境Demo

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139136356 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…

如果返回的json 中有 ‘///’ 轉換

// 將返回數據的三條/和替換空 rowData.Jsonobj rowData.Jsonobj .replace(/^\s*\/\/\/.*$/gm, //); // 將返回的替換成" 并且外面加個"" rowData.Jsonobj "${rowData.Jsonobj .replace(//g, ")}"; // 轉換回來數據用兩個 JSON.parse(JSON.par…

Charles抓包App_https_夜神模擬器

Openssl安裝 下載安裝 下載地址&#xff1a; http://slproweb.com/products/Win32OpenSSL.html 我已經下載好了64位的&#xff0c;也放出來&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1Nkur475YK48_Ayq_vEm99w?pwdf4d7 提取碼&#xff1a;f4d7 --來自百度網…

地下城游戲(leetcode)

個人主頁&#xff1a;Lei寶啊 愿所有美好如期而遇 地下城游戲https://leetcode.cn/problems/dungeon-game/description/ 圖解分析&#xff1a; 代碼 class Solution { public:int calculateMinimumHP(vector<vector<int>>& vv) {int row vv.size(), col …

Zookeeper 安裝教程和使用指南

一、Zookeeper介紹 ZooKeeper 是 Apache 軟件基金會的一個開源項目&#xff0c;主要基于 Java 語言實現。 Apache ZooKeeper 是一個開源的分布式應用程序協調服務&#xff0c;提供可靠的數據管理通知、數據同步、命名服務、分布式配置服務、分布式協調等服務。 關鍵特性 分布…