人工智能试验-八数码难题

  • 格式:doc
  • 大小:218.50 KB
  • 文档页数:15

下载文档原格式

  / 15
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

昆明理工大学信息工程与自动化学院学生实验报告

(2012 —2013 学年第 1 学期)

课程名称:人工智能开课实验室:信自楼442 2012 年10月 24日

一、上机目的及内容

1.上机内容

用确定性推理算法求解教材65-66页介绍的八数码难题。

2.上机目的

(1)复习程序设计和数据结构课程的相关知识,实现课程间的平滑过渡;

(2)掌握并实现在小规模状态空间中进行图搜索的方法;

(3)理解并掌握图搜索的技术要点。

二、实验原理及基本技术路线图(方框原理图或程序流程图)

(1)设计并实现程序,求解出正确的解答路径;

(2)对所设计的算法采用大O符号进行时间复杂性和空间复杂性分析;

(3)对一般图搜索的技术要点和技术难点进行评述性分析。

问题描述:

在3×3组成的九宫格棋盘上,摆有八个将牌,每一个将牌都刻有1-8八个数码中的某一个数码。棋盘中留有一个空格,允许其周围的某一个将牌向空格移动,这样通过移动将牌就可以

不断改变将牌的布局。这种游戏求解的问题是:给定一种初始的将牌布局或结构(称初始状

态)和一个目标的布局(称目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。

初始状态:8个数字将牌和空格在九宫格棋盘上的所有格局组成了问题的状态空间。其中,状态空间中的任一种状态都可以作为初始状态。

后继函数:

通过移动空格(上、下、左、右)和周围的任一棋子一次,到达新的合法状态。

目标测试:

比较当前状态和目标状态的格局是否一致。

路径消耗:

每一步的耗散值为1,因此整个路径的耗散值是从起始状态到目标状态的棋子移动的总步数。

三、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC及VISUAL C++6.0软件

四、实验方法、步骤(或:程序代码或操作过程)

数据结构

static int target[9]={1,2,3,8,0,4,7,6,5}; 全局静态变量,表示目标状态class eight_num

{

private:

int num[9]; 定义八数码的初始状态

int not_in_position_num; 定义不在正确位置八数码的个数

int deapth; 定义了搜索的深度

int eva_function; 评价函数的值,每次选取最小的进行扩展public:

eight_num* parent; 指向节点的父节点

eight_num* leaf_next; 指向open表的下一个节点

eight_num* leaf_pre; 指向open 表的前一个节点

初始状态的构造函数

eight_num(int init_num[9]);

eight_num(int num1,int num2,int num3,int num4,int num5,int num6,int num7,int num8,int num9){} eight_num(void){ }

计算启发函数g(n)的值

void eight_num::cul_para(void){}

显示当前节点的状态

void eight_num::show(){}

复制当前节点状态到一个另数组中

void eight_num::get_numbers_to(int other_num[9]){}

设置当前节点状态(欲设置的状态记录的other数组中)

void eight_num::set_num(int other_num[9]){}

eight_num& eight_num::operator=(eight_num& another_8num){}

eight_num& eight_num::operator=(int other_num[9]){}

int eight_num::operator==(eight_num& another_8num){}

int eight_num::operator==(int other_num[9]){}

空格向上移

int move_up(int num[9]){}

空格向下移

int move_down(int num[9]){}

空格向左移

int move_left(int num[9]){}

空格向右移

int move_right(int num[9]){}

判断可否解出

int icansolve(int num[9],int target[9]){}

判断有无重复

int existed(int num[9],eight_num *where){}

寻找估价函数最小的叶子节点

eight_num* find_OK_leaf(eight_num* start){}

}

源代码

#include "stdafx.h"

#include "iostream.h"

#include

#include

#include

#include

static int target[9]={1,2,3,8,0,4,7,6,5};

//class definition

class eight_num

{

private:

int num[9];

int not_in_position_num;

int deapth;

int eva_function;

public:

eight_num* parent;

eight_num* leaf_next;

eight_num* leaf_pre;

eight_num(int init_num[9]);

eight_num(int num1,int num2,int num3,int num4,int num5,int num6,int num7,int num8,int num9)

{

num[0]=num1;

num[1]=num2;

num[2]=num3;

num[3]=num4;

num[4]=num5;

num[5]=num6;

num[6]=num7;

num[7]=num8;

num[8]=num9;

}

eight_num(void)

{

for (int i=0;i<9;i++)

num[i]=i;

}

void cul_para(void);

void get_numbers_to(int other_num[9]);

int get_nipn(void)

{return not_in_position_num;}

int get_deapth(void)

{return deapth;}

int get_evafun(void)

{return eva_function;}

void set_num(int other_num[9]);

void show(void);