《人工智能_八数码实验报告》由会员分享,可在线阅读,更多相关《人工智能_八数码实验报告(16页珍藏版)》请在金锄头文库上搜索。
1、.专业整理 .西安郵電大学人工智能实验报 告 书(三)学院:自动化学院专业:智能科学与技术班级:智能 1403姓名:刘忠强.学习帮手 .专业整理 .时间:2016-3-29一、实验目的1. 熟悉人工智能系统中的问题求解过程 ;2. 熟悉状态空间的盲目搜索策略 ;3.掌握盲目收索算法 ,重点是宽度优先收索和深度优先收索。二、实验算法广度优先收索是一种先生成的节点先扩展的策略。它的过程是 :从初始节点开始逐层向下扩展 ,再第 n 层节点还没有完全搜索之前,不进如第 n+1 层节点 。Open 表中的节点总是按进入的先后排序,先进入的节点排在前面 ,够进入的排在后面 。三、程序框图.学习帮手 .专业
2、整理 .四、实验结果及分析初始状态 :目标状态 :283216164408705753.学习帮手 .专业整理 .五、源程序及注释#include #include #include using namespace std;.学习帮手 .专业整理 .const int ROW = 3;const int COL = 3;const int MAXDISTANCE = 10000;const int MAXNUM = 10000;int abs(int a)if (a0) return a;else return -a;typedef struct _Nodeint digitROWCOL;int
3、 dist;/距离int dep;/深度int index; /索引值 Node;Node src, dest;.学习帮手 .专业整理 .vector node_v;/储存节点bool isEmptyOfOPEN() /判断 Open 表是否空for (int i = 0; i node_v.size(); i+) if (node_vi.dist != MAXNUM)return false;return true;bool isEqual(int index, int digitCOL) / 判断节点是否与索引值指向的节点相同for (int i = 0; i ROW; i+)for (i
4、nt j = 0; j COL; j+) if (node_vindex.digitij != digitij)return false;return true;ostream& operator(ostream& os, Node& node) for (int i = 0; i ROW; i+) .学习帮手 .专业整理 .for (int j = 0; j COL; j+)os node.digitij ;os endl;return os;void PrintSteps(int index, vector& rstep_v) / 输出步骤rstep_v.push_back(node_vi
5、ndex);index = node_vindex.index;while (index != 0) rstep_v.push_back(node_vindex);index = node_vindex.index;for (int i = rstep_v.size() - 1; i = 0; i-)cout Step rstep_v.size() - i endl rstep_vi endl;void Swap(int& a, int& b) / 交换int t;.学习帮手 .专业整理 .t = a;a = b;b = t;void Assign(Node& node, int index)
6、 / 获取节点for (int i = 0; i ROW; i+)for (int j = 0; j COL; j+)node.digitij = node_vindex.digitij;int GetMinNode() / 获取启发值最小的节点int dist = MAXNUM;int loc;/ the location of minimize nodefor (int i = 0; i node_v.size(); i+) if (node_vi.dist = MAXNUM)continue;else if (node_vi.dist + node_vi.dep) dist) loc =
7、 i;dist = node_vi.dist + node_vi.dep;.学习帮手 .专业整理 .return loc;bool isExpandable(Node& node) / 判断是否可扩展for (int i = 0; i node_v.size(); i+) if (isEqual(i, node.digit)return false;return true;int Distance(Node& node, int digitCOL) / 计算距离int distance = 0;bool flag = false;for(int i = 0; i ROW; i+)for (in
8、t j = 0; j COL; j+)for (int k = 0; k ROW; k+) for (int l = 0; l COL; l+) if (node.digitij = digitkl) distance += abs(i - k) + abs(j - l);flag = true;.学习帮手 .专业整理 .break;elseflag = false;if (flag)break;return distance;int MinDistance(int a, int b) / 二者取小return (a b ? a : b);void ProcessNode(int index) / 展开节点int x, y;bool flag;for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+) if (node_vindex.digitij = 0) x =i; y = j;.学习帮手 .专业整理 .flag = true;break;else flag = false;if(flag)break;Node node_up;/ 上移操作Assign(node_up, index);int dist_up = MAXDISTANCE;