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

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

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模