人工智能-A*算法-八数码问题

一,A*算法设计思想

A*算法(A-star)是一种寻路算法,主要用于游戏、机器人等领域。

它的设计思想是将最短路径搜索问题转化为一个优化问题,通过计算每个节点的评分(f(n) = g(n) + h(n))来寻找最优路径。

以下是 A*算法的设计思想:

1. 引入启发式函数(h(n)):

A*算法使用一个启发式函数来估计从当前节点到目标节点的距离。

启发式函数越好,搜索速度越快。

通常情况下,启发式函数为曼哈顿距离(曼哈顿距离是指两点在网格上沿着网格线走的距离之和)。

2. 优先级队列

A*算法使用一个优先级队列(开启列表)来存储待处理的节点。

队列中的节点按照评分(f(n))从高到低排列。

这样,每次迭代都可以优先处理评分最高的节点,从而保证搜索的速度和效率。

3. 扩展节点

A*算法从当前节点开始,遍历其所有相邻节点。

对于每个相邻节点,检查它是否在关闭列表中(表示已经访问过),如果不在关闭列表中,则将其加入开启列表,并更新其父节点和评分。

4. 关闭列表

A*算法使用一个关闭列表来记录已访问过的节点。

每次扩展节点时,都需要检查新节点是否在关闭列表中。

如果在,则忽略该节点,继续处理其他相邻节点。

5. 停止条件

A*算法在找到目标节点或开启列表为空时停止搜索。

找到目标节点时,意味着找到了一条从起始节点到目标节点的最短路径。

6. 回溯法

当开启列表为空时,搜索失败。

此时,可以使用回溯法(如 Dijkstra 算法)从起始节点开始,重新寻找一条路径。

这种情况下,A*算法退化为 Dijkstra 算法。

二,题目需求

应用启发式搜索算法A 解决以下八数码问题:

初始状态:

目标状态:

 

三,代码实现

完整代码,需要下载pygame库,直接使用,运行可以查看动画演示效果。

import heapq
from copy import deepcopy
import time
import pygame# 定义启发式函数,使用当前状态与目标状态,棋子的错位数作为估价值
def heuristic(move_state, goal_state):err_num = 0for i in range(3):for j in range(3):if move_state[i][j] != goal_state[i][j]:err_num += 1return err_num# 根据当前状态,获取可移动方向
def get_moves(state, g):# 获取空缺位(或0值)坐标x, y = None, Nonefor i in range(3):for j in range(3):if state[i][j] == 0:x, y = i, jbreakmoves = []if x > 0:new_state = deepcopy(state)# 空位与它左侧1位交换,左侧数字右移new_state[x][y], new_state[x - 1][y] = new_state[x - 1][y], new_state[x][y]moves.append((new_state, g + 1))if x < 2:new_state = deepcopy(state)# 空位与它右侧1位交换,右侧数字左移new_state[x][y], new_state[x + 1][y] = new_state[x + 1][y], new_state[x][y]moves.append((new_state, g + 1))if y > 0:new_state = deepcopy(state)# 空位与它下面1位交换,下面数字上移new_state[x][y], new_state[x][y - 1] = new_state[x][y - 1], new_state[x][y]moves.append((new_state, g + 1))if y < 2:new_state = deepcopy(state)# 空位与它上面1位交换,上面数字下移new_state[x][y], new_state[x][y + 1] = new_state[x][y + 1], new_state[x][y]moves.append((new_state, g + 1))return moves# A星算法搜索
def a_star_search(initial_state, goal_state):f, g, h = 0, 0, 0open_set = [(f, initial_state)]close_set = set()# 从哪里来字典,记录节点来源,当成父节点come_from = {}while open_set:f, current_state = heapq.heappop(open_set)if current_state == goal_state:data = []current_state = tuple(map(tuple, current_state))# 从目标点向起点遍历路径while current_state in come_from:# 将当前点的位置加入路径data.append(current_state)# 将当前点设为从哪里来的节点,继续向上遍历current_state = come_from[current_state]# 将起始点的位置也加入路径data.append(tuple(map(tuple, initial_state)))# 将路径反转,因为我们是从目标向起点遍历的,所以需要反转得到真正的路径return data[::-1]close_set.add(tuple(map(tuple, current_state)))for move, g in get_moves(current_state, g):if tuple(map(tuple, move)) not in close_set:come_from[tuple(map(tuple, move))] = tuple(map(tuple, current_state))h = heuristic(move, goal_state)f = g + hheapq.heappush(open_set, (f, move))return None# 打印网格地图
def grid_print(grid):for line in grid:print(line)# 定义网格矩阵长宽
map_size = (3, 3)
# 定义屏幕一个格子大小
CELL_SIZE = 200
# 定义屏幕宽高大小
WIDTH, HEIGHT = map_size[0] * CELL_SIZE, map_size[1] * CELL_SIZE# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)# 绘制主地图,棋盘数字
def draw_grid(pygame, screen, num_states):# 填充屏幕背景为白色screen.fill(WHITE)for i in range(0, WIDTH, CELL_SIZE):pygame.draw.line(screen, BLACK, (i, 0), (i, HEIGHT))for i in range(0, HEIGHT, CELL_SIZE):pygame.draw.line(screen, BLACK, (0, i), (WIDTH, i))# 字体font = pygame.font.Font(None, 48)for i in range(3):for j in range(3):# 数字值num_text = str(num_states[j][i])if num_text == '0':# 写数字text = font.render(num_text, True, RED)else:# 写数字text = font.render(num_text, True, BLUE)screen.blit(text, (i * CELL_SIZE + CELL_SIZE / 2, j * CELL_SIZE + CELL_SIZE / 2))# 绘制A*算法找到的路径,动画演示
def draw_a_star_path(initial_state, goal_state):# 执行A*算法,寻找最优路径path_states = a_star_search(initial_state, goal_state)print("绘制网格地图和最优路径:")# 返回搜索路径和Open、Close表的内容i = 0for path in path_states:grid_print(path)print(f"======={i}=======")i += 1print("绘制A*算法找到的路径地图:")# 初始化 Pygamepygame.init()# 创建一个窗口(屏幕)对象screen = pygame.display.set_mode((WIDTH, HEIGHT))# 窗口描述pygame.display.set_caption("A星算法-8数码问题-动画演示")# 循环刷新地图,显示最优路径for num_states in path_states:# 绘制主地图,棋盘数字draw_grid(pygame, screen, num_states)# 更新显示屏幕pygame.display.flip()time.sleep(1)# 退出 Pygamepygame.quit()if __name__ == "__main__":# 八数码初始状态initial_state = [[2, 8, 3],[1, 6, 0],[7, 5, 4]]# 八数码最终状态goal_state = [[1, 2, 3],[8, 0, 4],[7, 6, 5]]# 绘制A*算法找到的路径,动画演示draw_a_star_path(initial_state, goal_state)

四,运行动画效果

 ==========结束==========

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll

环境: Win7 旗舰版 64位 Rustdesk1.19自编译客户端 问题描述: Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll "api-ms-win-shcore-scaling-|1-1-1.dll" 是一个系统动态链接库文件,它是Windows操作系统的一…

Ubuntu20.04/Linux中常用软件的安装

文章目录 一、安裝与卸载微信二、安裝与卸载QQ三、安装Chrome浏览器并加入apt更新四、安裝VScode4.1 安装常用插件4.2 减小Ipch缓存&#xff1a; 五、安装代码对比工具Meld六、安裝WPS七、安装PDF阅读器Foxit Reader八、安装文献管理软件Zotero九、安装有道云笔记十、安装远程控…

python pyaudio对音频进行端点检测,检测出说话区间

python pyaudio对音频进行端点检测&#xff0c;检测出说话区间 主要采用过零率和语音能量来进行检测&#xff0c;并设置双阈值。 代码如下&#xff1a; # -*- coding: utf-8 -*- import wave import os import matplotlib.pyplot as plt import numpy as np# 判断是否变号 de…

MysqlCluster集群部署

1.引言 1.1目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1. 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群…

layui+ssm实现数据表格双击编辑更新数据

layui实现数据表格双击编辑数据更新 在使用layui加载后端数据请求时&#xff0c;对数据选项框进行双击即可实现数据的输入编辑更改 代码块 var form layui.form, table layui.table,layer parent.layer undefined ? layui.layer : parent.layer,laypage layui.laypag…

ElasticSearch学习笔记(一)

计算机软件的学习&#xff0c;最重要的是举一反三&#xff0c;只要大胆尝试&#xff0c;认真验证自己的想法就能收到事办功倍的效果。在开始之前可以看看别人的教程做个快速的入门&#xff0c;然后去官方网站看看官方的教程&#xff0c;有中文教程固然是好&#xff0c;没有中文…

备忘录不小心删了怎么办?如何找回我的备忘录?

如果你的记性不太好&#xff0c;或者每天需要记住、完成的事情很多&#xff0c;那么养成随手记事的好习惯是非常有必要的。因为手机是每个成年人都会随身携带的电子设备&#xff0c;所以直接在手机上记录事情比较简单、便捷。而手机备忘录、便签、笔记等工具类软件&#xff0c;…

简单的界面与数据分离的架构

草图绘制于2021年2月19日 当时用到了&#xff1a;qt的子项目、delegate、view和widget的关系&#xff0c;有感而写的小备忘&#xff0c;2022年底考的软件设计师里面的设计模式虽然可能早已包含&#xff0c;但自己也得有自己啊&#xff0c;要把自己哪怕不成熟的东西也记录下来&…

HDFS客户端及API操作实验

实验二 HDFS客户端及API操作 实验目的&#xff1a; 1.掌握HDFS的客户端操作&#xff0c;包括上传文件、下载文件、重命名、查看目录等&#xff1b; 2.掌握HDFS的Java API使用&#xff0c;能够利用Java API实现上传、下载等常用操作&#xff1b; 实验内容&#xff1a; HDF…

fastadmin权限树。树形下拉框

fastadmin 笔记 权限树 在构造方法中编写相应的代码 值得一提的是&#xff0c;你的表必须有 id 字段以及 pid 字段。 // 必须将结果集转换为数组$ruleList \think\Db::name("state_list")->field(createtime,updatetime, true)->order(id ASC)->select();…

FTP服务文件上传失败,错误码553的排故过程

本文主要记录文件上传失败&#xff0c;错误码553的排故过程。 1 背景 树莓派通过FTP给嵌入式板卡传输文件&#xff0c;好几套设备&#xff0c;发现有的能传输成功&#xff0c;有的传输不成功。树莓派和嵌入式板卡都一样的&#xff0c;出现问题时感觉很懵。 2 逐项对比 2.1 自…

AF自动登录应用--实现无源码系统单点登录

在企业信息化的进程中&#xff0c;许多组织拥有一系列的老应用系统&#xff0c;这些系统在多年的运行中积累了大量的业务数据和流程。然而&#xff0c;这些老应用系统往往没有设计或实现单点登录&#xff08;SSO&#xff09;功能&#xff0c;用户需要在不同系统之间频繁输入账号…

C语言--每日选择题--Day35

第一题 1. 有如下定义&#xff1a;(x y) % 2 (int) a / (int) b 的值是&#xff08;&#xff09; int x 3; int y 2;float a 2.5; float b 3.5; A&#xff1a;0 B&#xff1a;2 C&#xff1a;1.5 D&#xff1a;1 答案及解析 D 本题是考查强制类型转换和操作符优先级 操作…

Figma安装指南:新手入门必看!

如果您想下载Figma客户端&#xff0c;可以直接在Figma官网Products>Downloads页面下载。 如果你不能访问Figma的官方网站&#xff0c;即使下载到客户端&#xff0c;你的网络环境也不能正常使用。 因为Figma的服务器在国外&#xff0c;在国内访问时经常会遇到网络不稳定的情…

SAP 生产订单状态控制

对于生产订单状态&#xff0c;我们经常会对状态进行控制&#xff0c;比如说已领料报工的生产订单就不允许做重读主数据 或者是部分入库不允许做TECO等等 可以通过一个标准的事物代码进行对生产订单状态的一个控制 Tcode&#xff1a;BS22 选择你需要你控制的订单的状态编号双击…

西南科技大学模拟电子技术实验六(BJT电压串联负反馈放大电路)预习报告

一、计算/设计过程 BJT电压串联负反馈放大电路图1-1-1-1为BJT电压串联负反馈放大实验电路,若需稳定输出电压,减小从信号源所取电流,可引入电压串联负反馈闭合开关。 图1-1-1-1 理论算法公式(1)闭环电压放大倍数 (2)反馈系数 (3)输入电阻 (4)输出电阻 计算过程。开环…

51综合程序03-DS1302时钟

文章目录 DS1302时钟芯片一、DS1302时钟芯片的工作原理1. 芯片特点2. 引脚说明3. 寄存器地址4. 读数据的时序图5. 写数据的时序图 二、综合实例LCD1602显示 DS1302时钟芯片 一、DS1302时钟芯片的工作原理 1. 芯片特点 实时计算年、月、日、时、分、秒、星期&#xff0c;直到2…

FacetWP Hierarchy Select网站内容层次结构选择插件

点击阅读FacetWP Hierarchy Select网站内容层次结构选择插件原文 FacetWP Hierarchy Select网站内容层次结构选择插件可让您基于分层分类法创建引导下拉菜单。 FacetWP Hierarchy Select网站内容层次结构选择插件功能 通过引导式下拉菜单过滤结果&#xff0c;一次一个深度级…

【从零开始学习Redis | 第六篇】爆改Setnx实现分布式锁

前言&#xff1a; 在Java后端业务中&#xff0c; 如果我们开启了均衡负载模式&#xff0c;也就是多台服务器处理前端的请求&#xff0c;就会产生一个问题&#xff1a;多台服务器就会有多个JVM&#xff0c;多个JVM就会导致服务器集群下的并发问题。我们在这里提出的解决思路是把…

卷积神经网络(CNN):艺术作品识别

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xf…