- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(人工智能实验产生式系统解决汉诺塔有代码
实验一一、实验目的:掌握产生式系统解决汉诺塔算法的基本思想。二、问题描述:如图所示放置3根柱子,其中一根从上往下按由小到大顺序串有若干个圆盘,要求通过3根柱子移动圆盘。若规定每次只能移动1片,且不许大盘放在小盘之上,最后要将圆盘从一根柱子移动到另一根柱子上。 三、问题分析及基本思想:汉诺塔(也被称为梵塔)问题有很多解决方法,比较典型的是使用递归算法,而本次设计的算法则是应用人工智能中产生式相关知识进行的求解。数学模型描述如下:1、设计该问题的状态。使用了二维数组描述汉诺塔的状态,对n个盘子由大到小分别用数组n、n-1...2、1描述。例如:当n=4时,二维数组为:1002003004002、定义目标状态。当n=4时,这里是:001002003004依据如下规则定义产生式规则:1、在移动盘子时,每次只移动A\B\C柱子上可以移动的盘子中最大的盘子。2、如果上一次已经移动了某个盘子,则下一次不能继续移动,即:一个盘子不能被连续移动两次。如:某次操作将1号盘子由A柱子移动到B柱子,那么在选择下一个要移动的盘子时应不在考虑1号盘。3、当某个可以移动的盘子摆放位置不唯一时要将当前状态入栈,并选择盘子移动前所在的柱子的左侧(同理:反方向选择也可)柱子作为移动的目标柱子。为提高程序运行过程中的空间利用率,产生式规则在汉诺塔移动过程中依据以上规则自动生成。控制策略依据如下:1、根据以上产生式规则依据,在每次移动盘子时可选择产生式唯一,所以不需要考虑路径选择。2、当移动的是一组盘子中的最大盘子(即:在要移动的一组盘子中的最下面的盘子)时,观察目标柱子是否是C柱子(最终结果所在柱子),如果是则表示当前盘子移动成功,并清空栈,转移问题(即减小一层盘子);如果移动目标错误(即移动到了A或B柱子)则执行回溯:栈顶状态出栈,向右选择目标柱子产生新的产生式规则,并按此执行移动操作。3、如果要移动的一组盘子中最大的是1号盘(最后一个盘子),执行的移动操作是将盘子移动到C柱子,则算法结束。四、主要功能流程图如下:(注意:本设计控制盘子为九个)。五、源程序:package Hanoi;import java.util.Arrays;import java.util.Scanner;import java.util.Stack;public class Hanoi {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.println(请输入汉诺塔盘子的个数:);int n = in.nextInt();// 定义初始状态int[][] first = new int[n][3];System.out.println(初始状态:);for (int i = 0; i n; i++) {first[i][0] = i + 1;System.out.println(Arrays.toString(first[i]));}// 定义目标状态int[][] end = new int[n][3];for (int i = 0; i n; i++) {end[i][2] = i + 1;// System.out.println(Arrays.toString(end[i]));}int maxValue = n;// 定义可以移动的最大盘子的值,初值Disk before = null;// 定义上一个移动的盘子,初始值为nullStackint[][] stack = new Stackint[][]();// 定义存放盘子状态的栈StackDisk bs = new StackDisk();b: while (true) {System.out.println(before: + before);Disk canMoveDisk = Hanoi.findMoveDisk(first, before);// 找出当前可移动盘子//System.out.println(canMoveDisk: + canMoveDisk);Disk[] movePlace = Hanoi.movePlace(first,Hanoi.findMoveDisk(first, before));// 返回当前可移动去的位置数组//System.out.println(locateionNumber: + movePlace.length);Disk right = movePlace[0];// 如果可移动位置有两个,right为右侧位置Disk left = movePlace[0];// 如果可移动位置有两个,left为左侧位置if (movePlace.length
您可能关注的文档
最近下载
- 2025年中国心力衰竭诊断和治疗指南更新要点解读.pdf VIP
- 百度免费文档批量下载工具说明书.pdf VIP
- 质量管理的55个细节.pptx VIP
- 2025年物理普通高中学业水平考试合格性考试考试试卷含答案 .pdf VIP
- 绿色设计产品评价技术规范 鞋类.docx VIP
- 哈尔滨商业大学《大学物理》2025—2026学年第一学期期末试卷(A卷).docx VIP
- [纺织标准]FZT 01104-2010 机织印染产品取水计算办法及单耗基本定额.pdf
- 2025年年轻干部学习教育对照查摆问题清单(五个方面).docx VIP
- 电力巡线方案.pdf VIP
- G2809A-2005部队油库加油站设计与施工规范(完整版).doc VIP
文档评论(0)