人工智能(Educoder)-- 搜索技术 -- 盲目式搜索

第1关:盲目搜索之宽度优先搜索算法

任务描述

本关任务:给定迷宫地图以及在迷宫中的起始位置,利用宽度优先搜索算法求解走出迷宫的最短路径长度,走出迷宫意味着达到迷宫地图的边界(所有位置下标0开始)。

例如以下4×4地图中,0表示墙,1表示可行走的路,起始位置为(2,1),则走出迷宫的一条最短路径为(2,1)→(2,0),步长为1。

  1. 0 1 0 1
  2. 0 1 1 1
  3. 1 1 0 0
  4. 0 1 0 1

相关知识

为了完成本关任务,你需要掌握:1.宽度优先搜索,2.一致代价搜索,3.求解思路。

宽度优先搜索

宽度优先搜索 Breadth-First-Search 是一种简单的搜索策略,首先扩展根结点,接着扩展根结点的所有后继结点,然后再扩展它们的后继,以此类推。一般地,在下一层的任何结点扩展之前,搜索树上本层深度的所有节点都应该被扩展过。示例如下:

宽度优先搜索每次总是扩展深度最浅的结点,这可以通过先进先出队列 FIFO, First In First Out 来实现,也就是将新结点添加到队列尾部,这也意味着浅层的老结点会在深层结点之前被扩展。算法伪代码如下:

一致代价搜索

宽度优先搜索是每一步的行动代价一致的搜索策略,因为它总是扩展深度最浅的未扩展节点。当单步代价不一致时,宽度优先搜索则不是最优的搜索策略。一致代价搜索 Uniform-Cost-Search 扩展的是路径消耗g(n)最小的节点n,通过将边缘结点按g值排序的优先队列实现,因此可以很好的解决单步代价不一致的问题。算法伪代码如下:

求解思路

设迷宫地图中的起点为(x,y),并以该点为根结点,上下左右四个相连的点为后继结点,由此构建一棵4叉树,然后从根结点开始层次遍历,最先达到边界的合法路径的步长即为答案。

编程要求

本关的编程任务是补全右侧代码片段 solveMaze 中 Begin 至 End 中间的代码,具体要求如下:

  • 在 solveMaze 中,利用宽度优先搜索算法,求解走出迷宫的最短步数,并返回结果(无解返回 0 )。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入: 4 4 0 1 0 1 0 1 1 1 1 1 0 0 0 1 0 1 2 1

预期输出: 1

输入格式: 第 1 行:n 行 m 列,1<=n,m<=10 第 2~n+1 行:迷宫地图 第 n+2 行:起点(x,y),地图左上是(0,0),右下是(n-1,m-1) 输出格式: 最短步数(无解输出 0 )

代码
 

# -*- coding:utf-8 -*-class Maze:def __init__(self, map, n, m, x, y):self.ans = 0            #最短步长结果self.map = map          #迷宫地图map[0,n-1][0,m-1](下标0开始)self.n = n              #迷宫地图行数nself.m = m              #迷宫地图列数mself.x = x              #起点,行坐标(下标0开始)self.y = y              #起点,列坐标(下标0开始)class Solution:def solveMaze(self, maze):"""求解迷宫问题:type: maze: class Maze #迷宫的数据结构类:rtype: maze.ans: int   #返回最短路径长度"""minpath=[]  # 存储最短路径长度的列表dir=[[1,0],[-1,0],[0,-1],[0,1]]  # 上下左右四个方向row=maze.n  # 迷宫的行数clm=maze.m  # 迷宫的列数sx=maze.x  # 起点的行坐标sy=maze.y  # 起点的列坐标vis=[[False for i in range(clm+1)] for i in range(row+1)]  # 记录每个位置是否已经访问过queue=[(sx,sy,0)]  # 初始化队列,存储当前位置和步数vis[sx][sy]=True  # 标记起点已访问while  queue:  # 当队列不为空时循环t=queue.pop()  # 弹出队首元素tx=t[0]  # 当前位置的行坐标ty=t[1]  # 当前位置的列坐标ans=t[2]  # 当前步数for i in range(4):  # 遍历上下左右四个方向if 0<=tx+dir[i][0]<row and 0<=ty+dir[i][1]<clm:  # 如果新位置在迷宫内dx,dy=tx+dir[i][0],ty+dir[i][1]  # 计算新位置的坐标if not vis[dx][dy] and maze.map[dx][dy]:  # 如果新位置未访问且可通行queue.append((dx,dy,ans+1))  # 将新位置和步数加入队列vis[dx][dy]=True  # 标记新位置已访问if dx==0 or dx==row-1 or dy==0 or dy==clm-1:  # 如果新位置在迷宫边界上minpath.append(ans+1)  # 将当前步数加入最短路径列表if minpath:return min(minpath)  # 如果最短路径列表不为空,返回最小值else:  return 0  # 如果最短路径列表为空,返回0

第2关:盲目搜索之深度优先搜索算法

任务描述

本关任务:利用深度优先搜索算法的核心思想,求解N皇后问题的方案总数,其中N∈[1,10]。

N皇后问题是国际象棋的扩展,在N×N的棋盘上放置N个皇后,使得每一个皇后都不会攻击到其余的任一皇后(皇后可以攻击和它在同一行、同一列或同一对角线上的任何棋子)。

相关知识

为了完成本关任务,你需要掌握:1.深度优先搜索算法,2.深度受限搜索,3.迭代加深的深度优先搜索,4.求解思路。

深度优先搜索算法

深度优先搜索 Depth-First-Search 总是扩展搜索树的当前边缘结点中最深的节点。搜索很快的推进到搜索树的最深处的结点,该结点称之为叶子结点,它没有后继,当这些结点扩展完之后,就从边缘结点中去掉,然后回溯到下一个未扩展后继的深度稍浅的结点,搜索过程如下图所示。

与宽度优先搜索使用 FIFO 队列不同,深度优先搜索使用 LIFO, Last In First Out 的队列结构,即最新生成的结点最早被选择扩展,因此,为了实现方便,深度优先搜索算法一般抛弃 LIFO 队列而采用递归式结构实现。

深度受限搜索

在无限状态空间里,深度优先搜索可能会陷入无解的分支里跳不出来。深度受限搜索 Depth-Limited-Search 通过设置一个深度界限l来避免此问题,即深度为l的结点被当做为没有后继的叶子结点。

虽然深度界限解决了无穷路径的问题,但是该算法是不完备的。假设正确解在深度为d的结点,若设置的l小于d,则目标结点的深度超过了深度限制,那么该算法无法得到目标解,若设置的l大于d,深度受限搜索则不是最优的。深度优先搜索可以看作是特殊的深度受限搜索,其受限深度l=∞。

迭代加深的深度优先搜索

迭代加深的深度优先搜索 Iterative-Deepening-Search 结合了深度受限搜索,它不断的增大深度限制,首先是l=0,接着为1,然后为2,以此类推,直到找到目标解,即当深度界限达到d时,最浅的目标结点被找到。迭代加深的深度优先搜索结合了深度优先搜索和宽度优先搜索的优点。

求解思路

N皇后问题是一个典型的有限的树搜索空间求解问题。用增量形式化方法描述为:

  • 状态:棋盘上 0-N 个皇后的任一摆放都是一个状态;
  • 初始状态:NxN 的棋盘上没有皇后;
  • 行动:在棋盘上的任一空格摆放一个皇后;
  • 转移模型:将增加了一个皇后的棋盘返回;
  • 目标测试:N 个皇后都在棋盘上,并且无法互相攻击。

以 8 皇后为例,这种形式化方法需要验证64×63×⋯×57个棋盘状态序列,即使在行动中增加皇后摆放的限制,棋盘状态序列的数量仍然是巨大的。

设棋盘某一位置为(i,j),将第i+1行的N个空格位置都作为(i,j)的后继结点,那么N×N的棋盘则可以通过一个根结点连接为一棵N叉搜索树,棋盘第i行对应搜索树深度为i的结点层,树的根结点到叶子节点的路径序列就是一个棋盘的状态序列,应用深度优先搜索算法可以非常方便的求解。

考虑到皇后的属性,可以增加一些限制条件来加快深度优先搜索的过程,剪掉一些无解的搜索路径。对问题具体分析如下:

  • 每一行只能放置一个皇后,那么对这一行其余的结点就不需要放置皇后了,也就是上面的建树过程,只以下一行棋盘空格作为后继结点,忽略本行其余空格;

  • 每一列只能放置一个皇后,下次搜索时就不要搜索已经放置过皇后的列了;

  • 每一斜对角线只能放置一个皇后。

棋盘的行可以用树的深度来表达,因此每一行只有一个皇后,她们不会同行。棋盘的列可以用一个长度为N的一维数组来记录是否放置过皇后。观察棋盘的行和列的特点,可以发现如下规律:

  1. 列的索引减去行的索引: 列的索引加上行的索引:
  2. 0 1 2 3 4 ... 0 1 2 3 4 ...
  3. -1 0 1 2 3 ... 1 2 3 4 5 ...
  4. -2 -1 0 1 2 ... 2 3 4 5 6 ...
  5. -3 -2 -1 0 1 ... 3 4 5 6 7 ...
  6. -4 -3 -2 -1 0 ... 4 5 6 7 8 ...
  7. ... ... ... ... ... ... ... ... ...

棋盘的左斜线\可以用一个数字表达,因此所有的左斜线可以用一个长度为2N−1的一维数组来记录是否放置过皇后,同理,右斜线/也可以用一个长度为2N−1的一维数组来记录是否放置过皇后。

编程要求

本关的编程任务是补全右侧代码片段 solveNQueens 和 DFS 中 Begin 至 End 中间的代码,具体要求如下:

  • 在 solveNQueens 中,利用 DFS 函数实现N皇后问题求解,并返回方案总数;

  • 在 DFS 中,利用深度优先搜索算法的思想,递归求解N皇后问题。

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:1

预期输出:1

输入格式:整数,表示皇后数量。

输出格式:整数,表示N皇后放置方案总数。

代码

# -*- coding:utf-8 -*-class Solution:def __init__(self, n=0):self.vis = [[]]             #用于标记是否存在皇后的二维列表(初始值全为0)self.ans = 0                #用于存储答案(N皇后方案数,初始值0)self.n = n                  #用于存储皇后数量ndef solveNQueens(self):"""求解N皇后问题(调用self.DFS函数):rtype: self.ans: int    #返回N皇后放置方案数"""#请在这里补充代码,完成本关任务#********** Begin **********## 产生一个3行50列的数组,第一行代表左斜线,第二行代表所在的列,第三行代表有索引,初始值都为0self.vis = [[0 for j in range(50)] for i in range(3)]self.DFS(1,self.n)  # 递归return self.ans#********** End **********#def DFS(self, row, n):"""深度优先搜索N皇后问题的解空间:type: row: int      #NxN棋盘的第row行:type: n: int        #皇后数量n:rtype: None         #无返回值"""#请在这里补充代码,完成本关任务#********** Begin **********#if row == n+1:   # 行数大于皇后的个数,说明这个方案可行,方案数加1,递归结束(递归结束条件),self.ans += 1returnfor i in range(1,n+1,1):# vis[0][row-i+n] == 0 row-i即行的索引减去列的索引,左斜线等于0,左斜线没有放置皇后,+n是为了防止产生负数# vis[1][i] == 0 第i列为0# vis[2][row+i] == 0  即所在的右斜线上并没有存放皇后,row+i即行索引加上列索引,同一右斜线的行索引加列索引所得的值相等。if self.vis[0][row-i+n] == 0 and self.vis[1][i] == 0 and self.vis[2][row+i] == 0: # 第row行第i列可以存放皇后self.vis[0][row-i+n] = self.vis[1][i] = self.vis[2][row+i] = 1  # 将对应的列,左斜线、右斜线都置为1self.DFS(row+1,n)  # 存放下一个皇后# 如果下一个皇后的位置无法正确放置,则调整当前皇后的放置位置self.vis[0][row-i+n] = self.vis[1][i] = self.vis[2][row+i] = 0# 继续本次循环,知道找到本行的列中有合适的存放位置为止,如果本行无合适位置,则继续返回上一层#********** End **********#

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

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

相关文章

水电站泄洪预警广播系统方案

一、行业背景 近年来由于危险河道管理措施不到位&#xff0c;调峰电站泄水风险长期存在&#xff0c;信息通报制度缺失以及民众安全警觉性不高等因素导致的水电站在泄洪时冲走下游河道游客以及人民财产的事故频发。 我司通过物联网、云计算、大数据、人工智能等技术手段&#x…

不能从所选图层建立3d模型--模大狮模型网

在Revit中&#xff0c;从所选图层直接创建3D模型并不是一个常规的操作方式。通常情况下&#xff0c;你需要手动创建文字或者图形&#xff0c;然后将其转换为3D模型。 如果你有一个平面上的文字或图形&#xff0c;想要将其转换为3D模型&#xff0c;你可以使用以下步骤&#xff1…

什么是虚拟线程?

1、典型回答 Java 中的虚拟线程&#xff0c;也叫做协程或“轻量级线程”&#xff0c;它诞生于JDK 19(预览 API)&#xff0c;正式发布于 JDK 21&#xff0c;它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程&#xff0c;不直接和操作系统的物理线程一一对应&#xff0c;因此它可…

文献速递:基于SAM的医学图像分割---SAM-Med2D

Title 题目 SAM-Med2D 01 文献速递介绍 医学图像分割在通过识别和勾画各种组织、器官或感兴趣区域来分析医学图像中发挥着至关重要的作用。准确的分割可以帮助医生精确识别和定位病理区域&#xff0c;从而实现更准确的诊断和治疗。此外&#xff0c;对医学图像进行定量和定性…

Node.js之沙盒专题

​ Node.js一直是薄弱项&#xff0c;今天特意整理一下&#xff0c;基本上是各个大佬写的大杂烩&#xff0c;仅用于学习记录~~~ 1. child_process 首先介绍一下nodejs中用来执行系统命令的模块child_process。Nodejs通过使用child_process模块来生成多个子进程来处理其他事物…

简化业务流程,AppLink连接一定签

APPlink是什么 APPlink是RestCloud打造的一款简单易用的零代码自动化集成平台&#xff0c;为业务流程提供自动化的解决方案&#xff0c;将企业内部的核心系统以及第三方应用程序和云服务等进行集成。无论是开发人员还是业务人员&#xff0c;都可以使用APPlink轻松构建出高效、…

【触想智能】工业触摸一体机九大常见故障检测方法分享

工业触摸一体机目前在社会生产中应用非常广泛&#xff0c;比如智能化的生产车间、城市智慧安防监控中心都经常用到工业触摸一体机。 电子产品在使用中难免会出现一些故障&#xff0c;工业触摸一体机也不例外。那么我们在使用工业触摸一体机的时遇到问题怎么办呢?下面小编给大家…

第十九章 linux部署scrapyd

文章目录 1. linux部署python环境1. 部署python源文件环境2. 下载python3. 解压安装包4. 安装5. 配置环境变量6. 检查是否安装成功7. 准备python使用的包8. 安装scrapyd9. 配置scrapyd10. 开放6800端口 2. 部署gerapy1. 本机下载包2. 初始化3. 进入gerapy同步数据库4. 创建用户…

nginx启停操作

一、nginx启动 方式一&#xff1a; /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf方式二&#xff1a; systemctl start nginx 查看进程启动状态 ps -ef | grep nginx 上图表示nginx进程启动成功&#xff0c;进程号为30034为主进程(负责链接操作)&am…

2024/3/24--爬虫库

1.常用的爬虫库 (1)在setting的project里面点击Python Interpreter (2&#xff09;常用的爬虫库有 import requests //用途&#xff1a;用于发送HTTP请求。from bs4 import BeautifulSoup //用于从HTML或XML文档中提取数据。import scrapy //一个功能强大的爬虫框架&#xf…

基于 C++ STL 的图书管理系统213行

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 一、实践项目名称 二、实践目的 三、实践要求 四、实践内容 五、代码框架参考 六、代码效果展示 七、完整代码主函数展示 一、实践项目名称 基于 C STL 的图书管理系统 二、实践目的 通过设计和实现一个基于…

AI之Suno:Suno V3的简介、安装和使用方法、案例应用之详细攻略

AI之Suno&#xff1a;Suno V3的简介、安装和使用方法、案例应用之详细攻略 目录 Suno AI的简介 1、特点与改进&#xff1a; Suno AI的安装和使用方法 1、第一步&#xff0c;让国产大模型—ChatGLM4帮我写一个提示词 2、第二步&#xff0c;将提示词交给Suno v3&#xff0c;…

优秀学员作品:SpringBoot茶叶商城系统源码+运行教程+开发文档(参考论文)

今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的茶叶商城系统&#xff0c;主要实现了茶叶采购&#xff0c;出售茶叶的流程&#xff0c;除基础脚手架外&#xff0c;实现的功能有&#xff1a; 前台 &#xff1a; 首页、商品列表、新闻列表、个人中心、…

【算法】双指针的应用

文章目录 前言1. 移动零&#xff08;easy&#xff09;2. 复写零&#xff08;easy&#xff09;3. 快乐数&#xff08;medium&#xff09;4. 盛水最多的容器&#xff08;medium&#xff09;5. 有效三角形的个数&#xff08;medium&#xff09;6.和为 s 的两个数字&#xff08;eas…

计算机网络:传输控制协议(Transmission Control Protocol-TCP协议

计算机网络&#xff1a;传输控制协议&#xff08;Transmission Control Protocol-TCP协议&#xff09; 本文目的前置知识点TCP协议简介主要特性通信流程1. 建立连接的过程(三次握手&#xff0c;243)1.1 为什么要三次握手&#xff0c;两次不行吗&#xff1f; 2. 释放连接的过程(…

msvcp110.dll丢失修复办法

在计算机使用过程中&#xff0c;我们经常会遇到一些扩展名为.dll的文件&#xff0c;这些文件是动态链接库文件&#xff0c;用于提供程序运行时所需的函数和资源。其中&#xff0c;msvcp110.dll文件是一个非常重要的动态链接库文件&#xff0c;它属于Microsoft Visual C 2012 Re…

Elastic 线下 Meetup 将于 2024 年 3 月 30 号在武汉举办

2024 Elastic Meetup 武汉站活动&#xff0c;由 Elastic、腾讯、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 活动时间 2024年3月30日 13:30-18:00 活动地点 中国武汉 武汉市江夏区腾讯大道1号腾讯武汉研发中心一楼多功能厅 13:30-14:00 入场 活动流程…

【C++从练气到飞升】06---重识类和对象

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、再谈构造函数 1. 构造函数体赋值 2. 初始化列表 每个成员变量在初始化列表中只能出现一次--初始化只能初始…

修复JeeSite vue 2.x视图滑动到顶部间距问题:Less文件修改实践

在前端开发中&#xff0c;样式调整是常见且必不可少的任务之一。最近&#xff0c;我在处理JeeSite项目时&#xff0c;遇到了一个视图滑动到顶部时顶部Tabs与页面顶部存在间距的问题。经过深入调查&#xff0c;发现这个问题可以通过修改相应的Less文件来解决。下面&#xff0c;我…

15、Spring Cloud Alibaba Sentinel实现熔断与限流

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、Sentinel 1.1、官网 https://sentinelguard.io/zh-cn/ 等价对标 Spring Cloud Circuit Breaker 1.2、是什么 https://github.com/alibaba/Sentinel/wiki 1.3、去哪下 https://github.com/alibab…