【人工智能】 知識表示與推理(八數碼 + 傳教士與野人渡河)

目錄

一、八數碼難題

1. 需求分析

2. 數據結構、功能模塊設計與說明

2.1 算法思路

2.2 數據結構

3. 核心代碼與測試結果說明

3.1 核心代碼

3.2 測試結果說明

4.?存在的問題與體會

4.1 存在的問題

4.2 體會

二、傳教士與野人渡河

1. 需求分析

2. 數據結構、功能模塊設計與說明

2.1 算法思路

2.2 數據結構

3. 核心代碼與測試結果說明

3.1 核心代碼

3.2 運行結果


引言:借助產生式系統和狀態空間法,選擇一種編程語言(我用的是java),完成題目要求。

一、八數碼難題

在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有一個空格,空格可用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:給出一種初始布局(初始狀態)和目標布局,找到一種移動方法,實現從初始布局到目標布局的轉變。

1. 需求分析

在一個3×3的棋盤格中,擺有1-8數字的八個棋子,剩余的空格用0表示。給出一種初始布局和目標布局,找到一種移動方法,實現從初始布局到目標布局的轉變,規則是移動空格,并且空格不能移出棋盤外。

2. 數據結構、功能模塊設計與說明

2.1 算法思路

采用廣度優先搜索算法,從初始狀態開始,每次進行可行操作(與0所在位置相鄰數字交換),得到新的狀態,并將其加入隊列中,直到找到目標狀態為止。

搜索之前需要判斷一下目標狀態是否可達,根據八數碼問題的特性,合法的移動操作只涉及兩個數字的交換,空格左右移動不會改變任何兩對數字之間的逆序對數量,因為整個序列的相對順序保持不變。空格上下移動會改變兩對數字之間的逆序對數量。當初始狀態的空白格和目標狀態的空白格在不同行時,只有通過上下移動才有可能改變逆序對的數量,從而實現初始狀態到目標狀態的轉換。故當初始狀態和結果狀態逆序數奇偶性相同的時候才可達,否則不進行搜索。

當目標狀態可達的時候,又因為有很多狀態會重復出現,所以判斷移動之后的狀態是否出現過?這里用哈希表來去重,如果出現過則丟棄;否則,將它加入隊列,并將它對應的步數設為前一個狀態的步數+1,直到找到目標狀態為止。

2.2 數據結構

(1)Scanner:用于從控制臺讀取輸入。

(2)HashMap:用于存儲狀態路徑信息和去重,其中鍵是狀態的字符串表示,值是一個 State 對象,包含了上一個狀態的字符串、到達當前狀態的操作和已經移動的步數。

(3)隊列:用于實現廣度優先搜索算法,使用 LinkedList 類作為隊列的實現。

(4)StringBuffer:創建一個 StringBuffer 對象,調用其 setCharAt() 方法進行字符交換。

3. 核心代碼與測試結果說明

3.1 核心代碼

(1)初始化狀態

(2)判斷可達性

①求逆序對

②判斷初始布局和結束布局奇偶性是否相同

(3)哈希表

(4)隊列實現bfs

3.2 測試結果說明

(1)測試數據

(2)控制臺打印每一步的狀態和操作

4.?存在的問題與體會

4.1 存在的問題

這種解法空間復雜度較高。使用廣度優先搜索算法時,需要存儲所有的狀態和路徑信息。通過哈希表來存儲狀態路徑信息,可能會占用較大內存空間,特別是當搜索空間非常龐大時。所以可以考慮使用其他數據結構或優化算法,以減少空間復雜度。

4.2 體會

雖然代碼存在一些問題和可以改進的地方,但我深入理解了廣度優先搜索算法,并在實踐中獲得了關于數據結構和代碼設計的經驗。

二、傳教士與野人渡河

設有3個傳教士和3個野人來到河邊,打算乘一只船從右岸渡到左岸去。該船每一次只能裝載2人。在任何時候,如果野人人數超過傳教士人數,那么野人就會把傳教士吃掉。請你設計一個方案怎樣才能用這條船安全地把所有人都渡過河去?編程實現你的方案。

1. 需求分析

3個傳教士和3個野人從河右岸乘一只船到左岸,且該船每次只能裝載2人。必須保證在任何時候,野人人數不能超過傳教士人數,否則野人就會把傳教士吃掉。設計一個方案怎樣才能用這條船安全地把所有人都渡過河去?并且推廣到有n個傳教士和n個野人,河邊的船每次至多可供k個人渡河的解決方案。

2. 數據結構、功能模塊設計與說明

2.1 算法思路

使用深度優先搜索算法,尋找所有可能的移動方案。其中,每個狀態包括左岸傳教士和野人的數量,以及船的位置(左岸或右岸)。通過不斷嘗試不同的移動方案,最終找到一種能夠使所有人都安全到達右岸的方法。

2.2 數據結構

(1)自定義屬性如下

(2)設計State類,屬性如下

(3)用list記錄路徑

(4)存儲可枚舉的方法

3. 核心代碼與測試結果說明

3.1 核心代碼

(1)初始化數據

(2)列出可枚舉的方法,即不同人數的乘客在船上的組合方式。

(3)過河問題的狀態

(4)dfs算法

3.2 運行結果

4. 存在的問題與體會

更加深刻的理解了dfs算法,以及它在實際情況中的應用。

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

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

相關文章

基于EMQX+Flask+InfluxDB+Grafana打造多協議物聯網云平臺:MQTT/HTTP設備接入與數據可視化流程(附代碼示例)

摘要: 本文深入淺出地介紹了物聯網、云平臺、MQTT、HTTP、數據可視化等核心概念,并結合 EMQX、Flask、InfluxDB、Grafana 等主流工具,手把手教你搭建一個支持多協議的物聯網云平臺。文章結構清晰,圖文并茂,代碼翔實易懂&#xff0…

2024-07-14 Unity插件 Odin Inspector1 —— 插件介紹

文章目錄 1 介紹2 模塊3 學習目的 1 介紹 ? Odin Inspector 是 Unity 的一個插件,擁有強大、自定義和用戶友好的編輯器,而無需編寫任何自定義編輯器代碼,使得編程過程中的數據可視化更容易實現。 ? 具體功能包括: 更舒適美觀…

軟件設計師(中級)備考視頻教程

一、視頻介紹 本視頻主要包括軟件設計師系統學習教程,通過學習本視頻,可以幫助考生高效且深入地掌握軟件設計師資格考試核心知識,全方位覆蓋考試要點,從而輕松備戰考試。視頻不僅涵蓋了考試所需的全面知識體系,還通過直…

Linux--USB驅動開發(二)插入USB后的內核執行程序

一、USB總線驅動程序的作用 a)識別USB設備 1.1 分配地址 1.2 并告訴USB設備(set address) 1.3 發出命令獲取描述符 b)查找并安裝對應的設備驅動程序 c)提供USB讀寫函數 二、USB設備工作流程 由于內核自帶了USB驅動,所以我們先插入一個U…

Google Colab 云端硬盤路徑讀取

加載云端硬盤 需要在左上角點擊這個文件圖標; from google.colab import drive drive.mount("/content/drive") # 掛載云端硬盤import os path"/content/drive/MyDrive/TextClassificationCustom" os.chdir(path) # 以路徑path作為當前工作目…

在 SwiftUI 中的作用域動畫

文章目錄 前言簡單示例動畫視圖修飾符使用多個可動畫屬性使用 ViewBuilder總結 前言 從一開始,動畫就是 SwiftUI 最強大的功能之一。你可以在 SwiftUI 中快速構建流暢的動畫。唯一的缺點是每當我們需要運行多步動畫或將動畫范圍限定到視圖層次結構的特定部分時&…

docker emqx 配置密碼和禁用匿名連接

mqtt版本emqx/emqx:4.4.3 1.首先把鏡像內目錄/opt/emqx/etc拷貝到本地 2.做映射 3.allow_anonymous, false改成true 4. 5.MQTTX連不上的話看看下圖的有沒有打開

【nginx】nginx的優點

目錄 一、高性能1.1 高并發處理1.2 低內存消耗1.3 快速響應 二、高擴展性2.1 模塊化設計2.2 動態模塊擴展 三、高可靠性3.1 核心框架穩定3.2 進程管理3.3 負載均衡與健康檢查3.4 熱部署 四、功能豐富4.1 反向代理4.2 HTTP緩存4.3 安全功能 五、易于配置和管理5.1 配置文件簡單5…

windows下環境變量開啟方式

第一種方法: 使用快捷鍵打開“運行”對話框:按下 Win R 組合鍵,這將打開“運行”窗口。 輸入系統屬性命令:在“運行”窗口中輸入 sysdm.cpl 然后按回車鍵。這將打開“系統屬性”對話框。【sysdm.cpl是"System Data Manager…

【Go系列】Go的指針

承上啟下 我們在前面的文章中,首先介紹了GO的基礎語法,然后介紹了Goroutine和channel這個最具有特色的東西,同時介紹了Sync和context,以及在上篇文章中詳細距離說明了Go里面用于高并發的多種寫法。基礎的使用方法也告一段落了&…

Linux多線程編程-哲學家就餐問題詳解與實現(C語言)

在哲學家就餐問題中,假設有五位哲學家圍坐在圓桌前,每位哲學家需要進行思考和進餐兩種活動。他們的思考不需要任何資源,但進餐需要使用兩根筷子(左右兩側各一根)。筷子是共享資源,哲學家們在進行進餐時需要…

Qt qml詳細介紹

一.基本類型 QML的基本類型包括了很多不同的類型,這些類型可以用于定義用戶界面元素、屬性和信號。以下是一些常用的QML基本類型及其詳細介紹: 數值類型:包括整數類型(int、uint、short、ushort等)和浮點數類型&#…

c++ :運算符重載函數中的細節

賦值運算符重載與拷貝構造函數 (1)區分初始化時的賦值(一般就叫初始化),和非初始化時的賦值(一般就叫賦值) (2)實驗驗證初始化和賦值時各自對應 避免賦值運算符中的自賦值 (1)自賦值就是Person a; a a; (2)自賦值如…

鞭炮插畫:成都亞恒豐創教育科技有限公司

鞭炮插畫:年味里的絢爛記憶 在歲末年初的溫柔時光里,總有一抹色彩,能瞬間喚醒沉睡的年味——那便是鞭炮插畫中躍動的紅與金,成都亞恒豐創教育科技有限公司 它們不僅僅是紙與墨的交織,更是情感與記憶的橋梁&#xff0c…

自適應手機版大學職業技術學院網站模版源碼系統 帶完整的安裝代碼包以及搭建部署教程

系統概述 隨著智能手機的普及和移動互聯網技術的飛速發展,用戶越來越傾向于通過移動設備訪問網站。對于大學職業技術學院而言,一個能夠自適應各種屏幕尺寸、操作流暢、內容豐富的移動端網站,不僅能夠提升用戶體驗,還能有效擴大學…

最短路之樸素版的dij板子

模板&#xff1a; 注意這個只是單向的雙向的需要在更新一次 #include<bits/stdc.h>using namespace std;typedef long long ll; typedef pair<int, int>PII; const int N2e510; const int MOD 998244353; const int INF0X3F3F3F3F; const int dx[]{-1,1,0,0,-1,…

【Python Tips】將一個列表List元素添加進另一個列表List

一、引言 在處理Python列表數據類型時&#xff0c;有時需要合并兩個列表&#xff0c;下面是幾種列表合并的操作代碼&#xff0c;尤其是對于長列表的高效合并方式&#xff0c;記錄在此。 二、列表合并方式 1. 使用extend方法 extend方法將一個列表中的所有元素添加到另一個列表…

mysql快速精通(三)表關系

主打一個實用 一. 一對多&#xff08;多對一&#xff09;關系 例如班級和學生&#xff0c;這種類型我們一般建兩個表,一方為主表&#xff0c;多方為從表 二. 多對多 例如課程與學生&#xff0c;這種類型我們一般需要建三張表&#xff0c;兩張一方主表&#xff0c;與一張多方從表…

初識影刀:EXCEL根據部門篩選低值易耗品

第一次知道這個辦公自動化的軟件還是在招聘網站上&#xff0c;了解之后發現對于辦公中重復性的工作還是挺有幫助的&#xff0c;特別是那些操作非EXCEL的重復性工作&#xff0c;當然用在EXCEL上更加方便&#xff0c;有些操作比寫VBA便捷。 下面就是一個了解基本操作后&#xff…

[Linux]CentOS軟件的安裝

一、Linux 軟件包管理器 yum 1.Linux安裝軟件的方式 在linux中安裝軟件常用的有三種方式&#xff1a; 源代碼安裝&#xff08;我們還需要進行編譯運行后才可以&#xff0c;很麻煩&#xff09; rpm安裝&#xff08;Linux的安裝包&#xff0c;需要下載一些rpm包&#xff0c;但是…