利用深度优先搜索算法解决老鼠吃奶酪问题(python)

简介: 利用深度优先搜索算法解决老鼠吃奶酪问题(python)

问题描述

一只老鼠位于迷宫左下角(0,0),迷宫中的数字9处有块大奶酪。0表示墙,1表示可通过路径。试给出一条可行的吃到奶酪的路径;若没有返回空。

假定迷宫是4连通的,即:老鼠只能上下左右走,不能斜着走。

算法描述

假定当前位于(i,j)处,尝试4个相邻位置,如果相邻位置不是墙,则可以通过。然后递归该过程。

代码如下:

import numpy as np
import matplotlib.pyplot as plt
# 常量
W = 4
H = 6
CHEESE = 9
# 深度优先搜索(迷宫,开始位置,路线存储变量,访问标志变量)
def search(maze, i, j, path, visit):
    # 找到奶酪,返回ture
    if maze[i][j] == CHEESE:
        print(path)
        return True
    # 邻居方向向量
    # 通过该向量,可以确定下一次从哪一个邻居开始搜索(左->右->下->上 或 上->下->右->左 等等),4个方向
    # 向量元素顺序的不同,有可能形成不同的最终路线
    i_next = [0, 0, -1, 1]
    j_next = [-1, 1, 0, 0]
    # i_next = [1, -1, 0, 0]
    # j_next = [0, 0, 1, -1]
    # i_next = [0, 0, -1, 1]
    # j_next = [1, -1, 0, 0]
    # 迷宫高度
    m = len(maze)
    # 迷宫宽度
    n = len(maze[0])
    # 4 连通,只能上下左右步进
    for k in range(4):
        # 从当前位置(i,j)偏移一位
        i_cur = i + i_next[k]
        j_cur = j + j_next[k]
        # 超出边界则搜索其他方向
        if i_cur < 0 or i_cur >= m or j_cur < 0 or j_cur >= n:
            continue
        # 新位置没有被访问过并且不是墙
        if (not visit[i_cur][j_cur]) and (maze[i_cur][j_cur] != 0):
            # 把iCur和jCur放置在路径中
            path.append((i_cur, j_cur))
            # 把iCur和jCur设置为已访问
            visit[i_cur][j_cur] = True
            # 递归搜索
            if search(maze, i_cur, j_cur, path, visit):
                return True
            # 从(iCur,jCur)找不到可行路径,把iCur和jCur弹出,然后回溯,搜索其他方向
            path.pop()
            visit[i_cur][j_cur] = False
    # 所有方向均找不到可行路径,返回False
    return False
# 绘制结果
def draw(maze, path):
    fig = plt.figure()
    plt.axis("off")
    ax = fig.add_subplot(111, aspect='equal')
    ax.set_xlim(0, W * len(maze[0]))
    ax.set_ylim(0, H * len(maze))
    # 迷宫上节点的位置坐标信息,用于绘图
    path_pos = dict()
    y = -H
    # 绘制迷宫和路线
    for r in range(len(maze)):
        row = maze[r]
        y += H
        x = -W
        for s in range(len(row)):
            x += W
            if (r, s) in path:
                print((r, s))
                path_pos[(r, s)] = (x, y)
                ax.add_patch(
                    plt.Rectangle(
                        (x, y),  # 矩形左下角
                        W,  # 长
                        H,  # 宽
                        color='green',
                    )
                )
            else:
                ax.add_patch(
                    plt.Rectangle(
                        (x, y),  # 矩形左下角
                        W,  # 长
                        H,  # 宽
                        edgecolor='black',
                        fill=False,
                        linewidth=1
                    )
                )
            # 绘制0,1标记
            ax.text(x + W / 2 - 0.5, y + H / 2 - 0.5, "{}".format(row[s]), transform=ax.transData)
    # 绘制路径方向箭头
    if len(path) > 2:
        for k in range(len(path) - 1):
            # 箭头开始坐标
            start = path_pos[path[k]]
            # 箭头结束坐标
            end = path_pos[path[k + 1]]
            plt.arrow(start[0] + W / 2 - 0.7, start[1] + W / 2 - 0.7, end[0]-start[0], end[1]-start[1], head_width=1, lw=1, length_includes_head=True)
    plt.show()
    # plt.savefig('mouse_path.png', dpi=800)
# 主算法
def main():
    # 初始化迷宫
    maze = []
    maze.append([1, 1, 0, 0, 0, 0, 0, 1])
    maze.append([1, 1, 1, 1, 1, 1, 1, 1])
    maze.append([1, 0, 0, 0, 1, 0, 0, 1])
    maze.append([1, 1, 1, 0, 1, 0, 0, 1])
    maze.append([0, 1, 0, 0, 1, 1, 1, 1])
    maze.append([0, 1, 0, 0, 0, 0, 0, 1])
    maze.append([0, 1, 0, 9, 1, 1, 1, 1])
    maze.append([0, 1, 1, 1, 0, 0, 1, 0])
    maze = np.array(maze)
    # 初始化路线
    path = [(0, 0)]
    # 初始化访问标记
    visit = np.full_like(maze, False)
    visit[0][0] = True
    # 开始搜索
    search(maze, 0, 0, path, visit)
    # 绘制结果
    draw(maze, path)
if __name__ == "__main__":
    main()

运行结果如下图所示:

算法搜索过程如下:

注意事项

代码中特别要注意的是“邻居方向向量”,通过该向量,可以确定下一次从哪一个邻居开始搜索,是按照左->右->下->上 的顺序还是按 上->下->右->左 或其他顺序对四个方向进行搜索,顺序的不同,有可能形成不同的最终路线,例如若按照 右->左->下->上 的顺序对四个方向进行搜索 ,最终得到的路线如下

本文参考了邹博老师的算法课程

笔者水平有限,若有不对的地方欢迎评论指正

相关文章
|
4天前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
82 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
2天前
|
存储 缓存 算法
Python中常用的数据结构与算法优化技巧指南
Python是一种强大而灵活的编程语言,它提供了丰富的数据结构和算法库,但是在处理大规模数据或者需要高效运行的情况下,需要考虑一些优化技巧。本文将介绍一些Python中常用的数据结构与算法优化技巧,并附带代码实例,帮助你更好地理解和运用。
|
4天前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
113 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
5天前
|
机器学习/深度学习 人工智能 算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
100 7
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
|
1天前
|
算法 数据中心 Python
基于python雪花算法工具类Snowflake-来自chatGPT
基于python雪花算法工具类Snowflake-来自chatGPT
13 4
|
2天前
|
机器学习/深度学习 算法 数据挖掘
Python机器学习10大经典算法的讲解和示例
为了展示10个经典的机器学习算法的最简例子,我将为每个算法编写一个小的示例代码。这些算法将包括线性回归、逻辑回归、K-最近邻(KNN)、支持向量机(SVM)、决策树、随机森林、朴素贝叶斯、K-均值聚类、主成分分析(PCA)、和梯度提升(Gradient Boosting)。我将使用常见的机器学习库,如 scikit-learn,numpy 和 pandas 来实现这些算法。
|
2天前
|
机器学习/深度学习 算法 搜索推荐
Python常用算法详细解释
Python常用算法详细解释
12 0
|
3天前
|
存储 机器学习/深度学习 算法
Python算法基础教程
Python算法基础教程
|
3天前
|
算法 Java
Java数据结构与算法:图算法之深度优先搜索(DFS)
Java数据结构与算法:图算法之深度优先搜索(DFS)
|
2天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
23 8

热门文章

最新文章