【浅析华容道之二】华容道问题搜索求解策略

2024-03-10 09:58

本文主要是介绍【浅析华容道之二】华容道问题搜索求解策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

求解华容道问题,需要补充人工智能的一些基础知识
举一个例子介绍状态空间表示法及搜索策略

倒水问题

有容积为3和10的瓶子各一个,如何只用这2个瓶子从水龙头里取得4升的水?
答案:10-3-3 =4
用状态空间表示法描述如下:
对于两个瓶子,瓶里的水初始都为0,目标是第二个瓶子有4升水
初始状态(0,0)
目标状态(X,4)
搜索操作:
1. 把A瓶水倒入B:Pour_A_B
2. 把B瓶水倒入A:Pour_B_A
3. 把A注满水:Fill_A
4. 把B注满水: Fill_B
5. 把A倒空:Empty_A
6. 把B倒空:Empty_B
倒水

结果

搜索求解策略

搜索的概念

在搜索中需要解决的基本问题
- 搜索过程中是否一定能找到一个解
- 找到一个解时,是否为最优解
- 时间与空间复杂度如何
- 搜索过程是否终止运行或是会陷入一个死循环

状态空间的搜索策略

状态空间表示法是知识表示的一种基本方法,利用状态变量和操作符号,表示系统或问题的有关知识的符号体系。状态空间可以用一个四元组表示。

基本定义:
1. 状态(State): 描述问题在任一时刻所处状况的一种数据结构
2. 初始状态S0/目标状态集G
3. 操作(Operator): 状态之间的转换函数
4. 状态空间(State Space): 四元组(S,O,S0,G)

搜索的分类
盲目搜索:在特定问题不具有任何相关信息的条件下,按固定的步骤进行搜索,它能快速调用一个操作算子
启发式搜索:考虑特定问题领域可应用的知识,动态地确定调用操作算子的步骤。优先选择较合适的操作算子,尽量减少不必要的搜索,以尽快到达目标状态。
盲目搜索有:深度优先搜索、广度优先搜索
启发式搜索一般优于盲目搜索
《————————————————–我是分割线—————————————————》

求解华容道

搜索策略

盲目搜索: 按预定方向进行搜索
输入:
- 初始状态S0/目标状态集G
- 操作(Operator): 状态之间的转换函数
输出:
- 一组状态序列

算法思路:见流程图,为了防止重复搜索或陷入循环,建立如下两个表
Closed列表: 存储已展开过的状态——避免重复搜索
Open列表: 存储已生成但未展开的状态——实现回溯
流程图
宽度优先搜索: Open表先进先出
深度优先搜索: Open表先进后出
扩展当前节点:找出某个状态的所有相邻状态(即移动一步可到达的状态),未出现的子节点放入Open表

数据结构

  1. 二维数组
    可将棋子编号固定为:0,1,2,3表示四个刘备兵,4,5,6,7,8表示五虎将,9表示曹操,有必要时将两个空格也看作两个棋子,编号为10,11.这样棋盘的布局可用一个5行4列的二维数组来表示.
    二维数组
    判断是否为目标布局:
    仅需判断该数组中的第四,五行中的第二、三列元素的取值是否都等于9.

算法优化

  1. 同质:
    棋盘上任意两个相同形状、相同摆放的棋子是”同质”的,在计算机看来没有任何区别。如图:
    同质
  2. 对称
    如下图,每一种状态下的任一种走法对另一种状态来说只要左右移动与之相反即可得到相应的走法。因此在求解华容道问题时可将下图两个状态视为相同状态。
    对称

程序设计

  • 广度优先搜索
    广度优先搜索表现出来的是一种谨慎,它按照一种同心圆的方式,首先访问所有和初始节点邻接的节
    点,然后是离它的节点最近的所有未访问节点,依此类推,直到所有与初始节点在一个连通分量中的节点
    都访问过了为止。

  • 最优解
    对华容道问题,棋子每走一步是对当前节点生成它的一个子节点,在走法的步数最少为最优的意义下,寻找它的最优解实际上也就是寻找路径最短的解.因此,只要某种初始布局存在解,则应用广度优先搜索策略总是可以搜索到它的最优解

    在进行广度优先搜索时,一个盘面状态可以理解为一个节点。深度优先不适合求解华容道问题,当然可以按一定策略调整搜索方法,深度搜索和广度搜搜结合或采用启发式算法进行搜索。
    下一篇讲解启发式算法提高搜索效率。

这篇关于【浅析华容道之二】华容道问题搜索求解策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/793873

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基