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

这篇具有很好参考价值的文章主要介绍了人工智能-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 解决以下八数码问题:

初始状态:

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

目标状态:

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

 

三,代码实现

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

import heapq
from copy import deepcopy
import time
import pygame


# 定义启发式函数,使用当前状态与目标状态,棋子的错位数作为估价值
def heuristic(move_state, goal_state):
    err_num = 0
    for i in range(3):
        for j in range(3):
            if move_state[i][j] != goal_state[i][j]:
                err_num += 1
    return err_num


# 根据当前状态,获取可移动方向
def get_moves(state, g):
    # 获取空缺位(或0值)坐标
    x, y = None, None
    for i in range(3):
        for j in range(3):
            if state[i][j] == 0:
                x, y = i, j
                break
    moves = []
    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, 0
    open_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 + h
                heapq.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 = 0
    for path in path_states:
        grid_print(path)
        print(f"======={i}=======")
        i += 1

    print("绘制A*算法找到的路径地图:")
    # 初始化 Pygame
    pygame.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)
    # 退出 Pygame
    pygame.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)

四,运行动画效果

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

a*算法解决八数码问题,人工智能,算法,Python,算法,人工智能,python

 ==========结束==========文章来源地址https://www.toymoban.com/news/detail-851800.html

到了这里,关于人工智能-A*算法-八数码问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能实验——八数码难题

    八数码问题指的是定义一个3$times$3的格子,然后把1-8八个数字随机放入这些格子中,然后排列成规则的格子。就像下面图所示: 而本文所要解决的是,如何设计一个程序解决八数码问题。解决八数码问题其实算是一个搜索问题。 BFS广度优先搜索算法 以接近起始节点的程度依

    2023年04月13日
    浏览(112)
  • python&anconda 系列:Pycharm在debug问题的N种解决方案(一般程序、web方向、人工智能方向)

    前言 Pycharm在debug时总是出现一些恼人的问题,以下是博主在训练中遇到的问题及在网上找到的可用解决方案: 一、Frames are not available 在代码处多设置几个断点即可。 好像还有另一种原因,博主自己没遇到(希望之后也别遇到),先把解决方案贴在这里(详情见 二. Pycharm在

    2024年02月01日
    浏览(44)
  • 人工智能导论——遗传算法求解TSP问题实验

    一、实验目的: 熟悉和掌握遗传算法的原理、流程和编码策略,并利用遗传算法求解组合优化问题,理解求解TSP问题的流程并测试主要参数对结果的影响。 二、实验原理: 旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。假设有一个旅行商人要拜

    2023年04月13日
    浏览(43)
  • 人工智能与人类智能的解决问题能力在人工智能应用领域的实践

    人工智能(Artificial Intelligence, AI)是一门研究如何让计算机模拟人类智能行为的科学。人类智能包括学习、理解语言、认知、决策等多种能力。人工智能的目标是让计算机具备类似于人类智能的能力,以解决复杂的问题。 在过去的几十年里,人工智能技术已经取得了显著的进展

    2024年02月20日
    浏览(54)
  • 人工智能原理实验4(1)——遗传算法、蚁群算法求解TSP问题

    TSP问题是组合数学中一个古老而又困难的问题,也是一个典型的组合优化问题,现已归入NP完备问题类。NP问题用穷举法不能在有效时间内求解,所以只能使用启发式搜索。遗传算法是求解此类问题比较实用、有效的方法之一。下面给出30个城市的位置信息: 应用遗传算法和蚁

    2024年01月24日
    浏览(56)
  • 人工智能与创新:如何解决实际问题

    人工智能(Artificial Intelligence, AI)是一种计算机科学的分支,旨在让计算机具有人类般的智能。人工智能的目标是让计算机能够理解自然语言、识别图像、解决问题、学习和自主决策等。人工智能技术的应用范围广泛,包括机器学习、深度学习、自然语言处理、计算机视觉、语

    2024年02月19日
    浏览(44)
  • 人工智能技能的融合:实现高效问题解决

    随着人工智能技术的不断发展,人工智能技能的融合成为了实现高效问题解决的关键。人工智能技能的融合是指在人工智能系统中,将多种人工智能技术相互结合,共同完成某个任务的过程。这种融合可以让人工智能系统具备更强大的问题解决能力,更高效地处理复杂问题。

    2024年02月22日
    浏览(69)
  • 人工智能算法|K均值聚类算法Python实现

    K 均值聚类算法是一种简单的迭代型聚类算法,采用距离作为相似性指标,从而发现给定数据集中的 K 个类,且每个类有一个聚类中心,即质心,每个类的质心是根据类中所有值的均值得到。对于给定的一个包含n个d维数据点的数据集X以及要分得的类别 K ,选取欧式距离作为

    2024年02月05日
    浏览(56)
  • 认知科学与人工智能:解决复杂问题的关键

    人工智能(Artificial Intelligence, AI)是一门研究如何让计算机模拟人类智能的学科。人类智能可以分为两类:一类是通过学习和经验而获得的,称为“泛化”(generalization);另一类是通过直接学习而获得的,称为“特定”(specific)。人工智能的目标是让计算机具有这两种智能

    2024年01月17日
    浏览(42)
  • 人工智能在未知问题解决领域的挑战与机遇

    人工智能(Artificial Intelligence, AI)是一门研究如何让计算机模拟人类智能的科学。在过去的几十年里,人工智能已经取得了很大的进展,例如自然语言处理、计算机视觉、机器学习等领域。然而,在未知问题解决领域,人工智能仍然面临着很大的挑战。 未知问题(Unkown Problems)是

    2024年02月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包