實驗3 知識表示與推理

實驗3 知識表示與推理

一、實驗目的
(1)掌握知識和知識表示的基本概念,理解其在AI中的深刻含義與意義;
(2)熟悉AI中常用的知識表示方法的優缺點及其應用場景;
(3)掌握產生式系統知識表示的方法及其構成要素;
(4)掌握狀態空間法的基本構成及其特點,能用其表示實際AI問題;
(5)深入理解圖的深度、寬度搜索方法,并能應用于實際問題;
(6)根據自身情況,能選擇合適的編程語言,解決實際AI問題。
二、實驗內容
借助產生式系統和狀態空間法,選擇一種編程語言(最好為python或java),完成題目要求。
1、八數碼難題
在3×3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有一個空格,空格可用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是:給出一種初始布局(初始狀態)和目標布局,找到一種移動方法,實現從初始布局到目標布局的轉變。
在這里插入圖片描述

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

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

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

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

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

# 在 A* 算法 中的一個節點。代表了搜索空間中的一個狀態
class Node:def __init__(self, state, parent=None, move=0, depth=0):self.state = stateself.parent = parentself.move = moveself.depth = depthself.cost = 0  # g(n) + h(n)def __lt__(self, other):return self.cost < other.cost# A* 算法
# 結合實際成本(g(n))和估計成本(h(n))來選擇最有希望的路徑
# g(n) 是從起始節點到當前節點的移動次數(或稱為深度),
# 而 h(n) 是當前狀態與目標狀態之間的曼哈頓距離
def a_star(initial, goal):open_list = []closed_set = set()root = Node(initial)heapq.heappush(open_list, (manhattan_distance(initial, goal), root))while open_list:_, current = heapq.heappop(open_list)closed_set.add(tuple(current.state))if current.state == goal:path = []while current:path.append(current.state)current = current.parentreturn path[::-1]zero_pos = current.state.index(0)x, y = divmod(zero_pos, 3)moves = [(-1, 0), (1, 0), (0, -1), (0, 1)]for dx, dy in moves:new_x, new_y = x + dx, y + dyif 0 <= new_x < 3 and 0 <= new_y < 3:new_state = current.state[:]new_pos = new_x * 3 + new_ynew_state[zero_pos], new_state[new_pos] = new_state[new_pos], new_state[zero_pos]if tuple(new_state) not in closed_set:new_node = Node(new_state, current, move=current.move + 1, depth=current.depth + 1)new_node.cost = new_node.depth + manhattan_distance(new_state, goal)heapq.heappush(open_list, (new_node.cost, new_node))return None

結果:
在這里插入圖片描述

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

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

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

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

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

3.核心代碼:

# 檢查一組傳教士和野人的數量是否符合規則
def is_valid_state(left_missionaries, left_cannibals):if left_missionaries < 0 or left_cannibals < 0:return Falseif (3 - left_missionaries) < 0 or (3 - left_cannibals) < 0:return Falseif (left_missionaries > 0 and left_cannibals > left_missionaries) or ((3 - left_missionaries) > 0 and (3 - left_cannibals) > (3 - left_missionaries)):return False
return True# 接收一個狀態state作為輸入,并返回可能的下一個狀態列表
def next_states(state):left_missionaries, left_cannibals, right_missionaries, right_cannibals, boat_position = statenext_states_list = []if boat_position == 'left':for i in range(3):for j in range(3):if i + j > 0 and i + j <= 2:new_left_missionaries = left_missionaries - inew_left_cannibals = left_cannibals - jnew_right_missionaries = right_missionaries + inew_right_cannibals = right_cannibals + jif is_valid_state(new_left_missionaries, new_left_cannibals):def bfs():initial_state = (3, 3, 0, 0, 'left')goal_state = (0, 0, 3, 3, 'right')visited = set()queue = deque([(initial_state, [])])while queue:state, path = queue.popleft()if state == goal_state:return path + [state]if state not in visited:visited.add(state)for next_state in next_states(state):queue.append((next_state, path + [state]))
return None

結果:
在這里插入圖片描述

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

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

相關文章

在 M1 Mac 上解鎖 TensorFlow GPU 加速:從環境搭建到實戰驗證

在 M1 Mac 上解鎖 TensorFlow GPU 加速&#xff1a;從環境搭建到實戰驗證 前言&#xff1a;蘋果芯片的深度學習新紀元 隨著 Apple Silicon 芯片的普及&#xff0c;M1/M2/M3 系列 Mac 已成為移動端深度學習開發的新選擇。本文將以 TensorFlow 2.x 為例&#xff0c;手把手教你如…

Python 數據分析概述 ①

一文讀懂Python數據分析&#xff1a;從基礎到實踐全攻略 在當今數字化浪潮中&#xff0c;數據分析已然成為解鎖海量數據價值的關鍵鑰匙&#xff0c;而Python憑借其獨特優勢&#xff0c;在數據分析領域大放異彩。今天&#xff0c;咱們就結合教學PPT內容&#xff0c;深入探索Pyt…

【Gin-Web】Bluebell社區項目梳理6:限流策略-漏桶與令牌桶

本文目錄 一、限流二、漏桶三、令牌桶算法四、Gin框架中實現令牌桶限流 一、限流 限流又稱為流量控制&#xff0c;也就是流控&#xff0c;通常是指限制到達系統的并發請求數。 限流雖然會影響部分用戶的使用體驗&#xff0c;但是能一定程度上保證系統的穩定性&#xff0c;不至…

Linux高并發服務器開發 第十九天(線程 進程)

目錄 1.進程組和會話 2.守護進程 2.1守護進程daemon概念 2.2創建守護進程 3.線程 3.1線程的概念 3.2線程內核三級映射 3.3線程共享 3.4線程優缺點 4.線程控制原語 4.1獲取線程id 4.2創建線程 4.3循環創建N個子線 4.4子線程傳參地址&#xff0c;錯誤示例 4.5線程…

軟件工程和系統分析與設計

軟件工程 1、軟件危機 2、軟件過程模型 2.1 瀑布模型 2.2原型模型 2.3螺旋模型 2.4敏捷模型 2.5軟件統一過程 3、軟件能力成熟度模型 CMM 4、軟件能力成熟度模型集成 CMMI 系統分析與設計 1、結構化方法SASD 1.1結構化分析 DFD 1.2結構化設計 SD-是一種面向數據流的設計…

Qt/C++面試【速通筆記一】

Qt 信號與槽機制 什么是信號&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;&#xff1f; 在Qt中&#xff0c;信號&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;是實現對象之間通信的一種機制。信號是對象在某些事件發生時發出的通知&…

LangChain大模型應用開發:構建Agent智能體

介紹 大家好&#xff0c;博主又來給大家分享知識了。今天要給大家分享的內容是使用LangChain進行大模型應用開發中的構建Agent智能體。 在LangChain中&#xff0c;Agent智能體是一種能夠根據輸入的任務或問題&#xff0c;動態地決定使用哪些工具(如搜索引擎、數據庫查詢等)來…

微服務架構概述及創建父子項目

目錄 一&#xff0c;什么是單體架構 二&#xff0c;什么是集群和分布式架構 三&#xff0c;什么是微服務架構 四&#xff0c;解決微服務難題的方案Spring-cloud Spring Cloud Alibaba是阿里巴實現的方案&#xff0c;基于SpringCloud的規范。如果說Spring Cloud Netflix 是…

C/C++跳動的愛心

系列文章 序號直達鏈接1C/C李峋同款跳動的愛心2C/C跳動的愛心3C/C經典愛心4C/C滿屏飄字5C/C大雪紛飛6C/C炫酷煙花7C/C黑客帝國同款字母雨8C/C櫻花樹9C/C奧特曼10C/C精美圣誕樹11C/C俄羅斯方塊小游戲12C/C貪吃蛇小游戲13C/C孤單又燦爛的神14C/C閃爍的愛心15C/C哆啦A夢16C/C簡單…

量子計算的威脅,以及企業可以采取的措施

當谷歌、IBM、Honeywell和微軟等科技巨頭紛紛投身量子計算領域時&#xff0c;一場技術軍備競賽已然拉開帷幕。 量子計算雖能為全球數字經濟帶來巨大價值&#xff0c;但也有可能對相互關聯的系統、設備和數據造成損害。這一潛在影響在全球網絡安全領域引起了強烈關注。也正因如…

Unity制作游戲——前期準備:Unity2023和VS2022下載和安裝配置——附安裝包

1.Unity2023的下載和安裝配置 &#xff08;1&#xff09;Unity官網下載地址&#xff08;國際如果進不去&#xff0c;進國內的官網&#xff0c;下面以國內官網流程為例子&#xff09; unity中國官網&#xff1a;Unity中國官網 - 實時內容開發平臺 | 3D、2D、VR & AR可視化 …

23貪心算法

分發餅干 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {int i0,j0;int count0;sort(s.begin(),s.end());sort(g.begin(),g.end());while(i<g.size()&&j<s.size()){if(g[i]<s[j]){i;j;count;}else…

Spark 和 Flink

Spark 和 Flink 都是目前流行的大數據處理引擎&#xff0c;但它們在架構設計、應用場景、性能和生態方面有較大區別。以下是詳細對比&#xff1a; 1. 架構與核心概念 方面Apache SparkApache Flink計算模型微批&#xff08;Micro-Batch&#xff09;為主&#xff0c;但支持結構…

Android 串口通信

引言 在iot項目中&#xff0c;Android 端總會有和硬件通信。 通信這里&#xff1a;串口通信&#xff0c;藍牙通信或者局域網通信。 這里講一下串口通信。 什么是串口&#xff1f; “串口”&#xff08;Serial Port&#xff09;通常是指一種用于與外部設備進行串行通信的接口。…

【計算機網絡】OSI模型、TCP/IP模型、路由器、集線器、交換機

一、計算機網絡分層結構 計算機網絡分層結構 指將計算機網絡的功能劃分為多個層次&#xff0c;每個層次都有其特定的功能和協議&#xff0c;并且層次之間通過接口進行通信。 分層設計的優勢&#xff1a; 模塊化&#xff1a;各層獨立發展&#xff08;如IPv4→IPv6&#xff0c…

從人機環境系統智能角度看傳統IP的全球化二次創作法則

從人機環境系統智能的視角看&#xff0c;傳統IP的全球化二次創作法則需結合技術、文化、倫理與環境的復雜協同。這一過程不僅是內容的本土化改編&#xff0c;更是人、機器與環境在動態交互中實現價值共創的體現。 一、人機環境系統智能的底層邏輯與IP二次創作的融合 1、感知層&…

實現 INFINI Console 與 GitHub 的單點登錄集成:一站式身份驗證解決方案

本文將為您詳細解析如何通過 GitHub OAuth 2.0 協議&#xff0c;為 INFINI Console 實現高效、安全的單點登錄&#xff08;Single Sign-On, SSO&#xff09;集成。通過此方案&#xff0c;用戶可直接使用 GitHub 賬戶無縫登錄 INFINI Console&#xff0c;簡化身份驗證流程&#…

記一次復雜分頁查詢的優化歷程:從臨時表到普通表的架構演進

1. 問題背景 在項目開發中&#xff0c;我們需要實現一個復雜的分頁查詢功能&#xff0c;涉及大量 IP 地址數據的處理和多表關聯。在我接手這個項目的時候,代碼是這樣的 要知道代碼里面的 ipsList 數據可能幾萬條甚至更多,這樣拼接的sql,必然是要內存溢出的,一味地擴大jvm參數不…

C++關鍵字之mutable

1.介紹 在C中&#xff0c;mutable是一個關鍵字&#xff0c;用于修飾類的成員變量。它的主要作用是允許在常量成員函數或常量對象中修改被標記為mutable的成員變量。通常情況下&#xff0c;常量成員函數不能修改類的成員變量&#xff0c;但有些情況下&#xff0c;某些成員變量的…

云計算中的API網關是什么?為什么它很重要?

在云計算架構中&#xff0c;API網關&#xff08;API Gateway&#xff09;是一個重要的組件&#xff0c;主要用于管理、保護和優化不同服務之間的接口&#xff08;API&#xff09;通信。簡單來說&#xff0c;API網關就像是一個中介&#xff0c;它充當客戶端和后端服務之間的“橋…