【问题描述】
以八数码问题为例,以启发式搜索方法求解给定初始状态和目标状态的最优搜索路径。
1、设计代码的构架。
2、定义启发式函数,使用 A*算法,要求能正确求解出从初始状态到目标状态的移动路线。
3、在控制台界面显示初始状态、目标状态和中间搜索步骤。
4、在实验报告中对所采用的启发式函数作出性能分析。
【问题分析】
在简单的宽度优先搜索中,队列的元素排列顺序是根据进栈的先后顺序,最先进栈的排在队首。而 A*算法就是要利用启发信息,根据估价函数值重新排序,对估价函数值小的结点优先进行扩展,提高搜索的效率。
#include<bits/stdc++.h>
using namespace std;
vector<int>start_state,end_state;   //初态和终态
struct state{vector<int>now;                 //当前的状态数组vector<int>steps;               //当前走过的步骤记录int deep;                       //深度//启发信息=状态的深度+未在正确位置的数字个数bool operator < (const state &a) const{int x=0,y=0;for(int i=0;i<9;i++)if(now[i]!=end_state[i])x++;for(int i=0;i<9;i++)if(a.now[i]!=end_state[i])y++;return deep+x<a.deep+y;}
};
int step[4]={-3,-1,1,3};            //移动路线共四种
map<vector<int>,int>vis;            //标记状态是否遍历过
int find_(vector<int>a){            //找到当前矩阵中0的位置for(int i=0;i<9;i++)if(a[i]==0)return i;
}
void print_matrix(vector<int>a){    //打印矩阵printf("%d %d %d\n%d %d %d\n%d %d %d\n\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
}
void print(state t){                //打印结果vector<int>k=start_state;printf("initial\n");print_matrix(k);for(int i=0;i<t.steps.size();i++){int index=find_(k);swap(k[index+t.steps[i]],k[index]);printf("step %d\n",i+1);print_matrix(k);}
}
bool check(int index,int k){        //判断该步是否可以移动if(k==-3&&(index==3||index==4||index==5||index==6||index==7||index==8))return 1;if(k==-1&&(index==1||index==2||index==4||index==5||index==7||index==8))return 1;if(k==1&&(index==0||index==1||index==3||index==4||index==6||index==7))return 1;if(k==3&&(index==0||index==1||index==2||index==3||index==4||index==5))return 1;return 0;
}
int main()
{for(int i=0;i<9;i++) {          //读入初态int x;cin>>x;start_state.push_back(x);}for(int i=0;i<9;i++) {          //读入终态int x;cin>>x;end_state.push_back(x);}bool flag=0;                    //标记是否到达终态/*     构造初始状态,加入到空队列中     */vector<int>k;state t;t.now=start_state;t.steps=k;t.deep=0;priority_queue<state>q;q.push(t);vis[start_state]=1;while(!q.empty()){t=q.top();if(t.now==end_state){       //判断当前队首元素是否为终态flag=1;print(t);break;}if(t.deep>10) break;        //深度>10,结束搜索else{int index=find_(t.now);for(int i=0;i<4;i++){if(check(index,step[i])){state s;s.now=t.now;s.steps=t.steps;s.deep=t.deep+1;swap(s.now[index],s.now[index+step[i]]);s.steps.push_back(step[i]);if(!vis.count(s.now)){q.push(s);vis[s.now]=1;}}}}q.pop();}if(!flag)printf("no answer\n");return 0;
}

人工智能-八数码问题-启发式搜索相关推荐

  1. 人工智能----八数码问题(启发式搜索)

    启发式搜索 一. 实验目的 理解人工智能系统中搜索策略的含义. 熟悉盲目搜索和启发式搜索算法的实际应用. 结合八数码问题的建模.求解及编程语言的应用,掌握启发式搜索算法的应用. 二. 实验原理 启发式 ...

  2. 八数码问题a*算法c语言,八数码问题的A*算法求解

    A*算法是启发式搜素算法中较为出名和高效的算法之一,其关键是对于启发式函数的实际,启发式函数h(x)需要尽可能的接近实际的 .下面是人工智能八数码问题使用A*算法求解的源码放在博客上记录一下.程序使用 ...

  3. 人工智能作业 八数码启发式搜索与bfs比较

    问题描述 3×3九宫棋盘,放置数码为1 -8的8个棋牌,剩下一个空格,只能通过棋牌向空格的移动来改变棋盘的布局. 要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋牌才能从初始布 ...

  4. A*算法解决八数码问题 人工智能原理实验报告 启发式搜索 python

    目录 一.实验主要步骤 ①.设计界面输入规则 ②.判断是否有解 ③.求解 二.实验结果展示 三.附录 完整实验程序代码: 一.实验主要步骤 ①.设计界面输入规则 有且仅有9位数字代表数码和空格,从左到 ...

  5. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

  6. 《人工智能》实验二——搜索技术(八数码问题)

    必须记住下一步还可以走哪些点--OPEN表(记录还没有扩展的点) 必须记住哪些点走过了--CLOSED表(记录已经扩展的点 广度优先搜索 在应用BFS算法进行八数码问题搜索时需要open和closed ...

  7. 人工智能作业 - A*算法程序求解八数码

    文章目录 A*算法 简介 思路 A*伪代码 八数码问题 题目描述 注意事项 实验过程 解决思路 伪代码 二维压缩为一维 检查是否有解 其他 代码实现 h1和h2的对比 关于曼哈顿距离 参考链接 A*算 ...

  8. 人工智能导论(2)——启发式算法(八数码问题)

    实验要求 用A*算法来解决八数码问题. 代码实现 #include<iostream> #include<stdio.h> #include<cmath> usin ...

  9. 【人工智能】八数码问题:广度搜索、深度搜索

    应用广度搜索BFS和深度搜索DFS解决八数码问题,广度搜索和深度搜索都是盲目搜索,相关理论知识,算法过程:问题求解:状态空间图和盲目搜索. 参考:7种方法求解八数码问题 Python实现A*算法解决N ...

  10. 人工智能:(C语言)采用状态空间法求解八数码问题

    实验要求:八数码难题也称九宫问题,它是在3×3的方格棋盘上,分别放置了表有数字1.2.3.4.5.6.7.8的八张牌,初始状态S0,目标状态Sg,要求程序能输入任意的初始状态和目标状态,要求通过空格来 ...

最新文章

  1. Python之Numpy数组拼接,组合,连接
  2. 让模糊图片变视频,找回丢失的时间维度,MIT这项新研究简直像魔术
  3. 一个人越来越有出息的7大迹象
  4. linux 修改dmi信息,如何从linux清除DMI系统事件日志?
  5. 《笨办法学python》6_笨办法学Python 习题 25: 更多更多的练习
  6. 使用Navicat Premium 12 连接远程Oracle数据库
  7. (王道408考研操作系统)第二章进程管理-第二节2:调度算法评价指标
  8. JavaSelenium处理页面Table以及Table中随机位置的数据
  9. Swift 3: let sortedNumbers = numbers.sort { $0 $1 } print(sortedNumbers) 结果显示为()
  10. 工作4-5年的.NET开发人员也需要有人带带才可以保证软件项目的质量
  11. CIF、DCIF、D1分辨率是多少?
  12. numpy中相关系数
  13. 不支持android浏览器下载工具,android 默认浏览器 无法下载,此手机不支持此内容(自定义文件or APK文件看过了)...
  14. 天翎BPM流程引擎助力打造流程服务中台
  15. 微软苏州校招笔试 12月27日
  16. JavaScript框架的四个时代
  17. 【紫光同创国产FPGA教程】【第九章】HDMI编程测试实验
  18. 苹果:付费才能用 iOS 开发者预览版,网友吐槽:找 Bug,还得先交 99 美元?
  19. 操作系统:Linux进程与线程
  20. 在MATLAB的figure图中画局部放大的图中图

热门文章

  1. wincc vbs mysql_WinCC 如何访问数据库(VBS)
  2. DHCP报文分析及C/C++代码实现
  3. 机器学习文本特征提取
  4. matlab怎么画两个自变量的图_横道图怎么画?免费使用的项目管理软件
  5. 大数据驱动教育变革,产教融合呈现新高度——数据科学与大数据技术教育分论坛顺利召开...
  6. 计算机应用程序设计师,2018年上半年软件设计师真题+答案解析上午选择+下午案例完整版(全国计算机软考).pdf...
  7. Adobe dreamweaver CS6小白入门教程
  8. python语音信号处理(一)
  9. 【PCL】SolidWorks 三维建模 STL, OBJ 采样生成 PCD 点云数据(附源码)
  10. 计算机辅助制造camppt,CADCAM课件计算机辅助制造 (2).ppt