人工智能实验一_八数码问题

人工智能实验一_八数码问题
人工智能实验一_八数码问题

用A*算法解决八数码问题

1 问题描述

1.1 待解决问题的解释

八数码游戏(八数码问题)描述为:在3×3组成的九宫格棋盘上,摆有八个将牌,每一个将牌都刻有1-8八个数码中的某一个数码。棋盘中留有一个空格,允许其周围的某一个将牌向空格移动,这样通过移动将牌就可以不断改变将牌的布局。这种游戏求解的问题是:给定一种初始的将牌布局或结构(称初始状态)和一个目标的布局(称目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。

1.2 问题的搜索形式描述(4要素)

初始状态:

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

后继函数:

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

目标测试:

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

路径消耗:

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

1.3 解决方案介绍(原理)

对于八数码问题的解决,首先要考虑是否有答案。每一个状态可认为是一个1×9的矩阵,问题即通过矩阵的变换,是否可以变换为目标状态对应的矩阵?由数学知识可知,可计算这两个有序数列的逆序值,如果两者都是偶数或奇数,则可通过变换到达,否则,这两个状态不可达。这样,就可以在具体解决问题之前判断出问题是否可解,从而可以避免不必要的搜索。

如果初始状态可以到达目标状态,那么采取什么样的方法呢?

常用的状态空间搜索有深度优先和广度优先。广度优先是从初始状态一层一层向下找,直到找到目标为止。深度优先是按照一定的顺序前查找完一个分支,再查找另一个分支,以至找到目标为止。广度和深度优先搜索有一个很大的缺陷就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。由于八数码问题状态空间共有9!个状态,对于八数码问题如果选定了初始状态和目标状态,有9!/2个状态要搜索,考虑到时间和空间的限制,在这里采用A*算法作为搜索策略。在这里就要用到启发式搜索启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。

启发中的估价是用估价函数表示的,如:f(n) = g(n) + h(n)

其中f(n) 是节点n的估价函数,g(n)是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。在此八数码问题中,显然g(n)就是从初始状态变换到当前状态所移动的步数,估计函数f(n)我们就可采用当前状态各个数字牌不在目标

状态未知的个数,即错位数。

2 算法介绍

2.1 搜索算法一般介绍

不管哪种搜索,都统一用这样的形式表示:搜索的对象是一个图,它面向一个问题,不一定有明确的存储形式,但它里面的一个结点都有可能是一个解(可行解),搜索的目的有两个方面,或者求可行解,或者从可行解集中求最优解。

搜索算法可分为两大类:无信息的搜索算法和有信息的搜索算法。无信息的搜索又称盲目搜索,其特点是只要问题状态可以形式化表示,原则上就可用使用无信息的搜索,无信息搜索有如下常见的几种搜索策略:广度优先搜索、代价一致搜索、深度优先搜索、深度有限搜索、迭代深入优先搜索、双向搜索。我们说DFS和BFS都是蛮力搜索,因为它们在搜索到一个结点时,在展开它的后续结点时,是对它们没有任何‘认识’的,它认为它的孩子们都是一样的‘优秀’,但事实并非如此,后续结点是有好有坏的。好,就是说它离目标结点‘近’,如果优先处理它,就会更快的找到目标结点,从而整体上提高搜索性能。

为了改善上面的算法,我们需要对展开后续结点时对子结点有所了解,这里需要一个估值函数,估值函数就是评价函数,它用来评价子结点的好坏,因为准确评价是不可能的,所以称为估值。这就是我们所谓的有信息搜索。如果估值函数只考虑结点的某种性能上的价值,而不考虑深度,比较有名的就是有序搜索(Ordered-Search),它着重看好能否找出解,而不看解离起始结点的距离(深度)。如果估值函数考虑了深度,或者是带权距离(从起始结点到目标结点的距离加权和),那就是A*如果不考虑深度,就是说不要求最少步数,移动一步就相当于向后多展开一层结点,深度多算一层,如果要求最少步数,那就需要用A*。简单的来说A*就是将估值函数分成两个部分,一个部分是路径价值,另一个部分是一般性启发价值,合在一起算估整个结点的价值,

考虑到八数码问题的特点,在本实验中使用A*算法求解。A*搜索是一种效的搜索算法,它把到达节点的耗散g(n)和从该节点到目标节点的消耗h(n)结合起来对节点进行评价:f(n)=g(n)+h(n)。当h(n)是可采纳时,使用Tree-Search的A*算法将是最优的。

2.2 算法伪代码

算法的功能:产生8数码问题的解(由初始状态到达目标状态的过程)

输入:初始状态,目标状态

输出:从初始状态到目标状态的一系列过程

算法描述:

Begin:

读入初始状态和目标状态,并计算初始状态评价函数值f;

根据初始状态和目标状态,判断问题是否可解;

If(问题可解)

把初始状态假如open表中;

While(未找到解&&状态表非空)

①在open表中找到评价值最小的节点,作为当前结点;

②判断当前结点状态和目标状态是否一致,若一致,跳出循环;否则跳转

到③;

③对当前结点,分别按照上、下、左、右方向移动空格位置来扩展新的状

态结点,并计算新扩展结点的评价值f并记录其父节点;

④对于新扩展的状态结点,判断其是否重复,若不重复,把其加入到open 表中;

⑤把当前结点从open 表中移除;

End while End if

输出结果;

End

算法流程如下:

3 算法实现

3.1 实验环境与问题规模 实验环境:

硬件环境:PC 机。

软件环境:Windows XP ;VC++ 6.0。 问题规模: 2)问题规模

是目标节点

开始

读入棋局初始状态

是否可解

在open 表中找到评价值最小的节点,作为当前结点

初始状态加入open 表

扩展新状态,把不重复的新状态加入open 表中

当前结点从open 表移除

输出结果

结束

对于任一给定可解初始状态,状态空间有9!/2=181440个状态;当采用不在位棋子数作为启发函数时,深度超过20时,算法求解速度缓慢;

3.2 数据结构

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){} }

3.3 实验结果

h: 启发函数(不在位将牌数)

初始状态 目标状态 是否有解 启发函数 用时 步数

3 2 1 8 0

4 7 6

5 1 2 3 8 0 4 7

6 5 否

h

--

1 0 4

2 7

3 8 5 6 1 2 3 8 0

4 7 6

5 是 h 2875ms

21

1 0 3 8

2 4 7 6 5

1 2 3 8 0 4 7 6 5

是 h 0ms 1

3.4 系统中间及最终输出结果(要求有屏幕显示)

目标状态默认为1 2 3 8 0 4 7 6 5 .

a) 初始状态是3 2 1 8 0 4 7 6 5,用h 作为启发函数结果都如下:

b)初始状态是1 04 2 7 3 8 5 6,用h 作为启发函数结果都如下:

中间略

b)初始状态是1 0 3 8 2 4 7 6 5,用h作为启发函数结果都如下:

参考文献

[1] Artificial Intelligence——A Modern Approach. Stuart Russell, Peter Norvig. 人民邮电出版社,2004

[2] Artificial Intelligence, Rob Callan. 电子工业出版社,2004

附录—源代码及其注释

#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);

eight_num& operator=(eight_num&);

eight_num& operator=(int other_num[9]);

int operator==(eight_num&);

int operator==(int other_num[9]);

};

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

void eight_num::cul_para(void)

{

int i;

int temp_nipn=0;

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

if (num[i]!=target[i])

temp_nipn++;

not_in_position_num=temp_nipn;

if (this->parent==NULL)

deapth=0;

else

deapth=this->parent->deapth+1;

eva_function=not_in_position_num+deapth; }

//构造函数1

eight_num::eight_num(int init_num[9])

{

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

num[i]=init_num[i];

}

//显示当前节点的状态

void eight_num::show()

{

cout<

cout<<" ";

cout<

cout<<" ";

cout<

cout<<"\n";

cout<

cout<<" ";

cout<

cout<<" ";

cout<

cout<<"\n";

cout<

cout<<" ";

cout<

cout<<" ";

cout<

cout<<"\n";

}

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

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

{

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

other_num[i]=num[i];

}

//设置当前节点状态(欲设置的状态记录的other数组中) void eight_num::set_num(int other_num[9])

{

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

num[i]=other_num[i];

}

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

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

num[i]=another_8num.num[i];

not_in_position_num=another_8num.not_in_position_num;

deapth=another_8num.deapth+1;

eva_function=not_in_position_num+deapth;

return *this;

}

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

{

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

num[i]=other_num[i];

return *this;

}

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

{

int match=1;

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

if(num[i]!=another_8num.num[i])

{

match=0;

break;

}

if (match==0)

return 0;

else

return 1;

}

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

int match=1;

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

if(num[i]!=other_num[i])

{

match=0;

break;

}

if (match==0)

return 0;

else

return 1;

}

//class definition over

//*************************

//空格向上移

int move_up(int num[9])

{

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

if (num[i]==0)

break;

if (i<3)

return 0;

else

{

num[i]=num[i-3];

num[i-3]=0;

return 1;

}

}

//空格向下移

int move_down(int num[9])

{

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

if (num[i]==0)

break;

if (i>5)

return 0;

else

{

num[i]=num[i+3];

num[i+3]=0;

return 1;

}

}

//空格向左移

int move_left(int num[9])

{

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

if (num[i]==0)

break;

if (i==0||i==3||i==6)

return 0;

else

{

num[i]=num[i-1];

num[i-1]=0;

return 1;

}

}

//空格向右移

int move_right(int num[9])

{

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

if (num[i]==0)

break;

if (i==2||i==5||i==8)

return 0;

else

{

num[i]=num[i+1];

num[i+1]=0;

return 1;

}

}

//判断可否解出

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

int i,j;

int count_num,count_target;

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

for (j=0;j

{

if(num[j]

count_num++;

if(target[j]

count_target++;

}

if((count_num+count_target)%2 == 0)

return 1;

else

return 0;

}

//判断有无重复

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

{

eight_num *p;

for(p=where;p!=NULL;p=p->parent)

if(*p==num)

return 1;

return 0;

}

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

eight_num* find_OK_leaf(eight_num* start)

{

eight_num *p,*OK;

p=OK=start;

int min=start->get_evafun();

for(p=start;p!=NULL;p=p->leaf_next)

if(min>p->get_evafun())

{

OK=p;

min=p->get_evafun();

}

return OK;

}

//主函数开始

int main(void)

{

double time;

clock_t Start,Finish;

int memery_used=0,step=0;

int num[9];

int flag=0;//是否输入错误标志,1表示输入错误

int bingo=0;//是否查找成功标志,1表示成功

int i,j;

cout<<"Please input the number(0 for the blank):\n";

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

{

flag=0;

cin>>num[i];

for(j=0;j

if(num[i]==num[j])

flag=1;

if (num[i]<0||num[i]>8||flag==1)

{

i--;

cout<<"Illegle number!\tReinput!\n";

}

}

eight_num S(num),Target(target);

S.parent=S.leaf_next=S.leaf_pre=NULL;

S.cul_para();

memery_used++;

cout<<"Now the initial numbers are:\n";

S.show();

cout<<"And the Target is:\n";

Target.show();

if(!icansolve(num,target))

{

cout<<"No one can solve it!\n";

cin>>i;

return 1;

}

Start=clock( );

eight_num *OK_leaf=&S,*leaf_start=&S,*new_8num,*p; while(OK_leaf!=NULL&&bingo!=1)

{

OK_leaf=find_OK_leaf(leaf_start);

if(*OK_leaf==Target)

{

bingo=1;

break;

}

p=OK_leaf->leaf_pre;

OK_leaf->get_numbers_to(num);

if(move_up(num)&&!existed(num,OK_leaf))

{

new_8num=new eight_num;

new_8num->set_num(num);

new_8num->parent=OK_leaf;

new_8num->cul_para();

new_8num->leaf_pre=p;

if(p==NULL)

leaf_start=new_8num;

else

p->leaf_next=new_8num;

p=new_8num;

memery_used++;

}

OK_leaf->get_numbers_to(num);

if(move_down(num)&&!existed(num,OK_leaf)) {

new_8num=new eight_num;

new_8num->set_num(num);

new_8num->parent=OK_leaf;

new_8num->cul_para();

new_8num->leaf_pre=p;

if(p==NULL)

leaf_start=new_8num;

else

p->leaf_next=new_8num;

p=new_8num;

memery_used++;

}

OK_leaf->get_numbers_to(num);

if(move_left(num)&&!existed(num,OK_leaf)) {

new_8num=new eight_num;

new_8num->set_num(num);

new_8num->parent=OK_leaf;

new_8num->cul_para();

new_8num->leaf_pre=p;

if(p==NULL)

leaf_start=new_8num;

else

p->leaf_next=new_8num;

p=new_8num;

memery_used++;

}

OK_leaf->get_numbers_to(num);

if(move_right(num)&&!existed(num,OK_leaf))

{

new_8num=new eight_num;

new_8num->set_num(num);

new_8num->parent=OK_leaf;

new_8num->cul_para();

new_8num->leaf_pre=p;

if(p==NULL)

leaf_start=new_8num;

else

p->leaf_next=new_8num;

p=new_8num;

memery_used++;

}

p->leaf_next=OK_leaf->leaf_next;

if(OK_leaf->leaf_next!=NULL)

OK_leaf->leaf_next->leaf_pre=p;

OK_leaf->leaf_next=OK_leaf->leaf_pre=NULL;

}

Finish=clock( );

if(bingo==1)

{

time = (double)(Finish-Start)*1000/CLOCKS_PER_SEC;

eight_num *p;

for (p=OK_leaf->parent;p!=NULL;p=p->parent)

{

cout<<" ^\n";

p->show();

step++;

}

cout<<"Time cost:";

cout<

cout<<"ms\n";

cout<<"Totaly covered steps:";

cout<

cout<<"\n";

}

else

cout<<"Fail to find!";

return 0;

}

八数码问题求解--实验报告讲解

实验报告 一、实验问题 八数码问题求解 二、实验软件 VC6.0 编程语言或其它编程语言 三、实验目的 1. 熟悉人工智能系统中的问题求解过程; 2. 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 3. 熟悉对八数码问题的建模、求解及编程语言的应用。 四、实验数据及步骤 (一、)实验内容 八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。 2 8 3 1 2 3 1 4 8 4 7 6 5 7 6 5 (a) 初始状态(b) 目标状态 图1 八数码问题示意图 (二、)基本数据结构分析和实现 1.结点状态 我采用了struct Node数据类型 typedef struct _Node{

int digit[ROW][COL]; int dist; // distance between one state and the destination一 个表和目的表的距离 int dep; // the depth of node深度 // So the comment function = dist + dep.估价函数值 int index; // point to the location of parent父节点的位置 } Node; 2.发生器函数 定义的发生器函数由以下的四种操作组成: (1)将当前状态的空格上移 Node node_up; Assign(node_up, index);//向上扩展的节点 int dist_up = MAXDISTANCE; (2)将当前状态的空格下移 Node node_down; Assign(node_down, index);//向下扩展的节点 int dist_down = MAXDISTANCE; (3)将当前状态的空格左移 Node node_left; Assign(node_left, index);//向左扩展的节点 int dist_left = MAXDISTANCE; (4)将当前状态的空格右移 Node node_right; Assign(node_right, index);//向右扩展的节点 int dist_right = MAXDISTANCE; 通过定义结点状态和发生器函数,就解决了8数码问题的隐式图的生成问题。接下来就是搜索了。 3.图的搜索策略 经过分析,8数码问题中可采用的搜速策略共有:1.广度优先搜索、2.深度优先搜索、2.有界深度优先搜索、4.最好优先搜索、5.局部择优搜索,一共五种。其中,广度优先搜索法是可采纳的,有界深度优先搜索法是不完备的,最好优先和局部择优搜索法是启发式搜索法。 实验时,采用了广度(宽度)优先搜索来实现。 (三、)广度(宽度)优先搜索原理 1. 状态空间盲目搜索——宽度优先搜索 其基本思想是,从初始节点开始,向下逐层对节点进形依次扩展,并考察它是否为目标节点,再对下层节点进行扩展(或搜索)之前,必须完成对当层的所有节点的扩展。再搜索过程中,未扩展节点表OPEN中的节点排序准则是:先进入的节点排在前面,后进入的节点排在后面。其搜索过程如图(1)所示。

人工智能实验报告大全

人工智能实验报告大 全

人工智能课内实验报告 (8次) 学院:自动化学院 班级:智能1501 姓名:刘少鹏(34) 学号: 06153034 目录 课内实验1:猴子摘香蕉问题的VC编程实现 (1) 课内实验2:编程实现简单动物识别系统的知识表示 (5)

课内实验3:盲目搜索求解8数码问题 (18) 课内实验4:回溯算法求解四皇后问题 (33) 课内实验5:编程实现一字棋游戏 (37) 课内实验6:字句集消解实验 (46) 课内实验7:简单动物识别系统的产生式推理 (66) 课内实验8:编程实现D-S证据推理算法 (78)

人工智能课内实验报告实验1:猴子摘香蕉问题的VC编程实现 学院:自动化学院 班级:智能1501 姓名:刘少鹏(33) 学号: 06153034 日期: 2017-3-8 10:15-12:00

实验1:猴子摘香蕉问题的VC编程实现 一、实验目的 (1)熟悉谓词逻辑表示法; (2)掌握人工智能谓词逻辑中的经典例子——猴子摘香蕉问题的编程实现。 二、编程环境 VC语言 三、问题描述 房子里有一只猴子(即机器人),位于a处。在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过VC语言编程实现猴子摘香蕉问题的求解过程。 图1 猴子摘香蕉问题

四、源代码 #include unsigned int i; void Monkey_Go_Box(unsigned char x, unsigned char y) { printf("Step %d:monkey从%c走到%c\n", ++i, x, y);//x表示猴子的位置,y为箱子的位置 } void Monkey_Move_Box(char x, char y) { printf("Step %d:monkey把箱子从%c运到%c\n", ++i, x, y);//x表示箱子的位置,y为香蕉的位置 } void Monkey_On_Box() { printf("Step %d:monkey爬上箱子\n", ++i); } void Monkey_Get_Banana() { printf("Step %d:monkey摘到香蕉\n", ++i); } void main() { unsigned char Monkey, Box, Banana; printf("********智能1501班**********\n"); printf("********06153034************\n"); printf("********刘少鹏**************\n"); printf("请用a b c来表示猴子箱子香蕉的位置\n"); printf("Monkey\tbox\tbanana\n"); scanf("%c", &Monkey); getchar(); printf("\t"); scanf("%c", &Box); getchar(); printf("\t\t"); scanf("%c", &Banana); getchar(); printf("\n操作步骤如下\n"); if (Monkey != Box) { Monkey_Go_Box(Monkey, Box); } if (Box != Banana)

《人工智能及其应用》(蔡自兴)课后习题答案第3章

第三章搜索推理技术 3-1什么是图搜索过程?其中,重排OPEN表意味着什么,重排的原则是什么? 图搜索的一般过程如下: (1) 建立一个搜索图G(初始只含有起始节点S),把S放到未扩展节点表中(OPEN表)中。 (2) 建立一个已扩展节点表(CLOSED表),其初始为空表。 (3) LOOP:若OPEN表是空表,则失败退出。 (4) 选择OPEN表上的第一个节点,把它从OPEN表移出并放进CLOSED表中。称此节点为节 点n,它是CLOSED表中节点的编号 (5) 若n为一目标节点,则有解并成功退出。此解是追踪图G中沿着指针从n到S这条路径 而得到的(指针将在第7步中设置) (6) 扩展节点n,生成不是n的祖先的那些后继节点的集合M。将M添入图G中。 (7) 对那些未曾在G中出现过的(既未曾在OPEN表上或CLOSED表上出现过的)M成员设置一 个通向n的指针,并将它们加进OPEN表。 对已经在OPEN或CLOSED表上的每个M成员,确定是否需要更改通到n的指针方向。 对已在CLOSED表上的每个M成员,确定是否需要更改图G中通向它的每个后裔节点的指针方向。 (8) 按某一任意方式或按某个探试值,重排OPEN表。 (9) GO LOOP。 重排OPEN表意味着,在第(6)步中,将优先扩展哪个节点,不同的排序标准对应着不同的搜索策略。 重排的原则当视具体需求而定,不同的原则对应着不同的搜索策略,如果想尽快地找到一个解,则应当将最有可能达到目标节点的那些节点排在OPEN表的前面部分,如果想找到代价最小的解,则应当按代价从小到大的顺序重排OPEN表。 3-2 试举例比较各种搜索方法的效率。

八数码问题人工智能实验报告

基于人工智能的状态空间搜索策略研究 ——八数码问题求解 (一)实验软件 TC2.0 或VC6.0编程语言或其它编程语言 (二)实验目的 1. 熟悉人工智能系统中的问题求解过程; 2. 熟悉状态空间的盲目搜索和启发式搜索算法的应用; 3. 熟悉对八数码问题的建模、求解及编程语言的应用。 (三)需要的预备知识 1. 熟悉TC 2.0或VC6.0 编程语言或者其它编程语言; 2. 熟悉状态空间的宽度优先搜索、深度优先搜索和启发式搜索算法; 3. 熟悉计算机语言对常用数据结构如链表、队列等的描述应用; 4. 熟悉计算机常用人机接口设计。 (四)实验数据及步骤 1. 实验内容 八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。 图1 八数码问题示意图 请任选一种盲目搜索算法(深度优先搜索或宽度优先搜索)或任选一种启发式搜索方法(A 算法或A* 算法)编程求解八数码问题(初始状态任选),并对实验结果进行分析,得出合理的结论。 2. 实验步骤 (1)分析算法基本原理和基本流程; 程序采用宽度优先搜索算法,基本流程如下:

(2)确定对问题描述的基本数据结构,如Open表和Closed表等;

(3)编写算符运算、目标比较等函数; (4)编写输入、输出接口; (5)全部模块联调; (6)撰写实验报告。 (五)实验报告要求 所撰写的实验报告必须包含以下内容: 1. 算法基本原理和流程框图; 2. 基本数据结构分析和实现; 3. 编写程序的各个子模块,按模块编写文档,含每个模块的建立时间、功能、输入输出参数意义和与其它模块联系等; 4. 程序运行结果,含使用的搜索算法及搜索路径等; 5. 实验结果分析; 6. 结论; 7. 提供全部源程序及软件的可执行程序。 附:实验报告格式 一、实验问题 二、实验目的 三、实验原理 四、程序框图 五、实验结果及分析 六、结论

游戏人工智能实验报告四

实验四有限状态机实验 实验报告 一、实验目的 通过蚂蚁世界实验掌握游戏中追有限状态机算法 二、实验仪器 Windows7系统 Microsoft Visual Studio2015 三、实验原理及过程 1)制作菜单 设置参数:点击会弹出对话框,设置一些参数,红、黑蚂蚁的家会在地图上标记出来 运行:设置好参数后点击运行,毒药、食物、水会在地图上随机显示 下一步:2只红蚂蚁和2只黑蚂蚁会随机出现在地图上,窗口右方还会出现红、黑蚂蚁当前数量的统计 不断按下一步,有限状态机就会不断运行,使蚁群产生变化 2)添加加速键 资源视图中 下方

选择ID和键值 3)新建头文件def.h 在AntView.cpp中加入#include"def.h" 与本实验有关的数据大都是在这里定义的 int flag=0; #define kForage 1 #define kGoHome 2 #define kThirsty 3 #define kDead 4 #define kMaxEntities 200 class ai_Entity{ public: int type; int state; int row; int col; ai_Entity(); ~ai_Entity() {} void New (int theType,int theState,int theRow,int theCol); void Forage(); void GoHome(); void Thirsty(); void Dead(); }; ai_Entity entityList[kMaxEntities]; #define kRedAnt 1 #define kBlackAnt 2

《人工智能及其应用》实验指导书Word版

《人工智能及其应用》 实验指导书 浙江工业大学计算机科学与技术学院—人工智能课程组 2011年9月

前言 本实验是为了配合《人工智能及其应用》课程的理论学习而专门设置的。本实验的目的是巩固和加强人工智能的基本原理和方法,并为今后进一步学习更高级课程和信息智能化技术的研究与系统开发奠定良好的基础。 全书共分为八个实验:1.产生式系统实验;2.模糊推理系统实验;3.A*算法求解8数码问题实验;4.A*算法求解迷宫问题实验;5.遗传算法求解函数最值问题实验;6.遗传算法求解TSP问题实验;7.基于神经网络的模式识别实验;8.基于神经网络的优化计算实验。每个实验包括有:实验目的、实验内容、实验条件、实验要求、实验步骤和实验报告等六个项目。 本实验指导书包括两个部分。第一个部分是介绍实验的教学大纲;第二部分是介绍八个实验的内容。 由于编者水平有限,本实验指导书的错误和不足在所难免,欢迎批评指正。 人工智能课程组 2011年9月

目录 实验教学大纲 (1) 实验一产生式系统实验 (3) 实验二模糊推理系统实验 (5) 实验三A*算法实验I (9) 实验四A*算法实验II (12) 实验五遗传算法实验I (14) 实验六遗传算法实验II (18) 实验七基于神经网络的模式识别实验 (20) 实验八基于神经网络的优化计算实验 (24)

实验教学大纲 一、学时:16学时,一般安排在第9周至第16周。 二、主要仪器设备及运行环境:PC机、Visual C++ 6.0、Matlab 7.0。 三、实验项目及教学安排 序号实验名称实验 平台实验内容学 时 类型教学 要求 1产生式系统应用VC++设计知识库,实现系统识别或 分类等。 2设计课内 2模糊推理系统应用Matlab1)设计洗衣机的模糊控制器; 2)设计两车追赶的模糊控制 器。 2验证课内 3A*算法应用I VC++设计与实现求解N数码问题的 A*算法。 2综合课内4A*算法应用II VC++设计与实现求解迷宫问题的A* 算法。 2综合课内5遗传算法应用I Matlab1)求某一函数的最小值; 2)求某一函数的最大值。 2验证课内6遗传算法应用II VC++设计与实现求解不同城市规模 的TSP问题的遗传算法。 2综合课内 7基于神经网络的模式识别Matlab1)基于BP神经网络的数字识 别设计; 2)基于离散Hopfiel神经网络 的联想记忆设计。 2验证课内 8基于神经网络的 优化计算 VC++设计与实现求解TSP问题的连2综合课内 四、实验成绩评定 实验课成绩单独按五分制评定。凡实验成绩不及格者,该门课程就不及格。学生的实验成绩应以平时考查为主,一般应占课程总成绩的50%,其平时成绩又要以实验实际操作的优劣作为主要考核依据。对于实验课成绩,无论采取何种方式进行考核,都必须按实验课的目的要求,以实际实验工作能力的强弱作为评定成绩的主要依据。

八数码实验报告人工智能课设报告

学生实验报告 实验课名称:人工智能 实验名称: 八数码 专业名称:计算机科学与技术 班级: 学号: 学生姓名: 教师姓名: 2010 年10 月20日 一.实验内容 用OPEN表和CLOSED表解决搜索问题。 二.实验题目 采用启发式算法(如A*算法)求解八数码问题。 三.实验要求 1.必须使用OPEN表和CLOSED表。 2.明确给出问题描述。系统初始状态。目标状态和启发式函数。 3.除了初始状态以外,至少搜索四层。 4.给出解路径(解图)。 四.实验过程 ①问题:初始状态到目标状态是否可解如何判断? 答:实验过程自己给出的初始状态使用A*算法求解,并不是所有的初始状态都可解到达目标状态。因为八数码问题其实是0~9的一个排列,而排列有奇排列和偶排列,从奇排列不能转化为偶排列或者相反。例如:函数f(s)表示s前比s 小的数字的数目(s 则当f(a8)+f(a7)+……+f(a1)为偶数时才能重排成,所以嘛,上面那个有解的. ②问题描述: 在3X3的九宫格棋盘上,摆有8个将牌,每一个将牌都刻有1~8数码中的某一个数码。棋盘中留有一个空格,允许周围的某一个将牌向空格移动,这样通过移动将牌就可以不断地改变将牌的布局。这种游戏的求解的问题是:给定一种处

世的将牌布局或结构和一个目标的布局,问如何移动将牌,实现从从初始状态到目标状态的转变。 下面给出初始状态和目标状态: 初始状态:Array 目标状态: 评价函数f(n)形式为:f(n)=g(n)+h(n),其中g(n)是节点所处的深度, h(n)是启发式函数,这里启发式函数h(n)表示“不在位”的将牌个数,这时f(n) 注意:移动规则为左-→上→右→下。 ③搜索过程: 因此可得解路径:S(4)→B(4)→D(5)→E(5)→I(5)→K(5)→L(5). ④得到OPEN表和CLOSED表 OPEN表

人工智能及其应用总结

人工智能及其应用总结 1、感知能力、 2、记忆与思维能、 3、学习能力、 4、行为能力(表达能力)人工智能的研究内容:知识表示、机器感知、机器思维、机器学习、机器行为人工智能的研究目标:近期目标:使现有的电子数字计算机更聪明、更有用,使它不仅能做一般的数值计算及非数值信息的数据处理,而且能运用知识处理问题,能模拟人类的部分智能行为。建造智能机器人代替人类的部分智力劳动。远期目标:用自动机模仿人类的思维过程和智能行为。最终目标:机器智能实现生物智能的各项功能。智能行为:感知、推理、学习、通信和复杂环境下的动作行为知识发现的处理过程:数据挖掘、数据选择、知识评价人工智能的主要学派:符号主义、连接主义和行为主义人工智能的研究途径:心理模拟、生理模拟和行为模拟人工智能的应用领域:智能控制、智能管理、智能决策、智能仿真。人工智能的基本技术:表示、运算、搜索归纳技术、联想技术人工智能(机器智能)、学科和能力:(书)所谓人工智能就是用人工的方法在机器(计算机)上实现的智能,或者说是人们使机器具有类似于人的智能。从学科角度来看:人工智能是计算机科学中涉及研究、设计和应用智能机器的一个分支。它的近期主要目标在于研究用机器来模仿和执行人脑的某些智能功能,并开发相关理论和技术。从能力角度来看:人工智能是智能机器所执行的通常与人类智能有关的功能。对认知

行为进行研究:心理活动的最高层级是思维策略,中间一层是初级信息处理,最低层级是生理过程,与此相应的是计算机程序、语言和硬件。研究认知过程的主要任务是探求高层次思维决策与初级信息处理的关系,并用计算机程序来模拟人的思维策略水平,而用计算机语言模拟人的初级信息处理过程。人工智能新的研究热点:新的研究热点:分布式人工智能与Agent,计算智能与进化计算,数据挖掘与知识发现 (超市市场商品数据分析),人工生命第二章:知识表示方法知识的一般概念:知识是人们在改造客观世界的实践中积累起来的认识和经验知识表示:是研究用机器表示知识的可行性、有效性的一般方法,是一种数据结构与控制结构的统一体,既考虑知识的存储又考虑知识的使用。知识表示的要求:表示能力、可利用性、可实现性、可组织性、可维护性、自然性、可理解性状态空间法的三要素:状态、算符、状态空间方法问题求解技术:问题的表示和求解的方法二种不确定性:关于证据的不确定性和关于结论的不确定性原子公式:由若干谓词符号和项组成问题的状态空间包含三种说明的集合:初始状态集合S、操作符集合以及目标状态集合“我听音乐或者绘画”的谓词表示的析取式LISTEN(I,MUSIC)VDRAW(I,PAINTING)句子变换成子句形式:(x){P(x)→P(x)} (ANY x) { P(x)P(x) } (ANY x) {~P(x)

人工智能 八数码实验

人工智能作业八数码问题

一、题目 八数码问题: 初始状态图:目标状态图: 二、算符与状态空间 算符:左、上、右、下 状态空间: 状态:A=(X0,X1,X2,X3,X4,X5,X6,X7,X8) 初始状态:S0=(0,4,1,5,2,8,3,6,7); 目标状态:Sg=(0,1,7,5,2,8,3,6,4)。

三、搜索树 22 求解: 四、Open 表,Closed 表 Open 表: Closed 表:

五、程序代码 /* 3_13.pro eight puzzle */ trace DOMAINS state=st(in,in,in,in,in,in,in,in,in) in=integer DATABASE-mydatabase open(state,integer) closed(integer,state,integer) res(state) mark(state) fail_ PREDICATES solve search(state,state) result searching step4(integer,state) step56(integer,state) equal(state,state) repeat resulting(integer) rule(state,state) GOAL solve. CLAUSES solve:-search(st(0,4,1,5,2,8,3,6,7),st(0,1,7,5,2,8,3,6,4)),result. search(Begin,End):-retractall(_,mydatabase), assert(closed(0,Begin,0)),assert(open(Begin,0)),

人工智能实验报告大全

人工智能课内实验报告 (8次) 学院:自动化学院 班级:智能1501 姓名:刘少鹏(34) 学号: 06153034

目录 课内实验1:猴子摘香蕉问题的VC编程实现 (1) 课内实验2:编程实现简单动物识别系统的知识表示 (5) 课内实验3:盲目搜索求解8数码问题 (18) 课内实验4:回溯算法求解四皇后问题 (33) 课内实验5:编程实现一字棋游戏 (37) 课内实验6:字句集消解实验 (46) 课内实验7:简单动物识别系统的产生式推理 (66) 课内实验8:编程实现D-S证据推理算法 (78)

人工智能课内实验报告实验1:猴子摘香蕉问题的VC编程实现 学院:自动化学院 班级:智能1501 姓名:刘少鹏(33) 学号: 06153034 日期: 2017-3-8 10:15-12:00

实验1:猴子摘香蕉问题的VC编程实现 一、实验目的 (1)熟悉谓词逻辑表示法; (2)掌握人工智能谓词逻辑中的经典例子——猴子摘香蕉问题的编程实现。 二、编程环境 VC语言 三、问题描述 房子里有一只猴子(即机器人),位于a处。在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过VC语言编程实现猴子摘香蕉问题的求解过程。 图1 猴子摘香蕉问题 四、源代码 #include unsigned int i; void Monkey_Go_Box(unsigned char x, unsigned char y) {

人工智能及其应用(蔡自兴)课后答案

第二章知识表示方法 2-1 状态空间法、问题归约法、谓词逻辑法和语义网络法的要点是什么?它们有何本质上的联系及异同点? 答:状态空间法:基于解答空间的问题表示和求解方法,它是以状态和算符为基础来表示和求解问题的。一般用状态空间法来表示下述方法:从某个初始状态开始,每次加一个操作符,递增的建立起操作符的试验序列,直到达到目标状态为止。 问题规约法:已知问题的描述,通过一系列变换把此问题最终变成一个子问题集合:这些子问题的解可以直接得到,从而解决了初始问题。问题规约的实质:从目标(要解决的问题)出发逆向推理,建立子问题以及子问题的子问题,直至最后把出示问题规约为一个平凡的本原问题集合。 谓词逻辑法:采用谓词合式公式和一阶谓词算法。要解决的问题变为一个有待证明的问题,然后采用消解定理和消解反演莱证明一个新语句是从已知的正确语句导出的,从而证明这个新语句也是正确的。 语义网络法:是一种结构化表示方法,它由节点和弧线或链组成。节点用于表示物体、概念和状态,弧线用于表示节点间的关系。语义网络的解答是一个经过推理和匹配而得到的具有明确结果的新的语义网络。语义网络可用于表示多元关系,扩展后可以表示更复杂的问题 2-2 设有3个传教士和3个野人来到河边,打算乘一只船从右岸渡到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去? 用S i(nC, nY) 表示第i次渡河后,河对岸的状态,nC表示传教士的数目,nY表示野人的数目,由于总人数的确定的,河对岸的状态确定了,河这边的状态也即确定了。考虑到题目的限制条件,要同时保证,河两岸的传教士数目不少于野人数目,故在整个渡河的过程中,允许出现的状态为以下3种情况: 1. nC=0 2. nC=3 3. nC=nY>=0 (当nC不等于0或3) 用d i(dC, dY)表示渡河过程中,对岸状态的变化,dC表示,第i次渡河后,对岸传教士数目的变化,dY表示,第i次渡河后,对岸野人数目的变化。当i为偶数时,dC,dY同时为非负数,表示船驶向对岸,i为奇数时,dC, dY同时为非正数,表示船驶回岸边。

《人工智能及其应用》实验指导书上课讲义

《人工智能及其应用》实验指导书

《人工智能及其应用》 实验指导书 浙江工业大学计算机科学与技术学院—人工智能课程组 2011年9月

前言 本实验是为了配合《人工智能及其应用》课程的理论学习而专门设置的。本实验的目的是巩固和加强人工智能的基本原理和方法,并为今后进一步学习更高级课程和信息智能化技术的研究与系统开发奠定良好的基础。 全书共分为八个实验:1.产生式系统实验;2.模糊推理系统实验;3.A*算法求解8数码问题实验;4.A*算法求解迷宫问题实验;5.遗传算法求解函数最值问题实验;6.遗传算法求解TSP问题实验;7.基于神经网络的模式识别实验;8.基于神经网络的优化计算实验。每个实验包括有:实验目的、实验内容、实验条件、实验要求、实验步骤和实验报告等六个项目。 本实验指导书包括两个部分。第一个部分是介绍实验的教学大纲;第二部分是介绍八个实验的内容。 由于编者水平有限,本实验指导书的错误和不足在所难免,欢迎批评指正。 人工智能课程组 2011年9月

目录 实验教学大纲 (1) 实验一产生式系统实验 (4) 实验二模糊推理系统实验 (6) 实验三 A*算法实验I (11) 实验四 A*算法实验II (14) 实验五遗传算法实验I (16) 实验六遗传算法实验II (21) 实验七基于神经网络的模式识别实验 (24) 实验八基于神经网络的优化计算实验 (28)

实验教学大纲 一、学时:16学时,一般安排在第9周至第16周。 二、主要仪器设备及运行环境:PC机、Visual C++ 6.0、Matlab 7.0。 三、实验项目及教学安排 序号实验名称实验 平台 实验内容学 时 类型教学 要求 1 产生式系统应 用VC++ 设计知识库,实现系统识 别或分类等。 2 设计课内 2 模糊推理系统 应用Matlab 1)设计洗衣机的模糊控制 器; 2)设计两车追赶的模糊控 制器。 2 验证课内 3 A*算法应用I VC++ 设计与实现求解N数码问 题的A*算法。 2 综合课内4 A*算法应用II VC++ 设计与实现求解迷宫问题 的A*算法。 2 综合课内 5 遗传算法应用 I Matlab 1)求某一函数的最小值; 2)求某一函数的最大值。 2 验证课内 6 遗传算法应用 II VC++ 设计与实现求解不同城市 规模的TSP问题的遗传算 法。 2 综合课内 7 基于神经网络 的模式识别Matlab 1)基于BP神经网络的数 字识别设计; 2)基于离散Hopfiel神经 网络的联想记忆设计。 2 验证课内 8 基于神经网络 的优化计算VC++ 设计与实现求解TSP问题 的连续Hopfield神经网 络。 2 综合课内 四、实验成绩评定

人工智能实验报告

实验报告 1.对CLIPS和其运行及推理机制进行介绍 CLIPS是一个基于前向推理语言,用标准C语言编写。它具有高移植性、高扩展性、 强大的知识表达能力和编程方式以及低成本等特点。 CLIPS由两部分组成:知识库、推理机。它的基本语法是: (defmodule< module-n ame >[< comme nt >]) CLIPS的基本结构: (1).知识库由事实库(初始事实+初始对象实例)和规则库组成。 事实库: 表示已知的数据或信息,用deftemplat,deffact定义初始事实表FACTLIS,由关系名、后跟 零个或多个槽以及它们的相关值组成,其格式如下: 模板: (deftemplate [] *) :: = | 事实: (deffacts [] *) 当CLIPS系统启动推理时,会把所有用deffact定义的事实自动添加到工作存储器中。常用命令如下:asser:把事实添加到事实库(工作存储器)中retract:删除指定事实 modify :修改自定义模板事实的槽值duplicate :复制事实 clear:删除所有事实 规则库 表示系统推理的有关知识,用defrule命令来定义,由规则头、后跟零个或多个条件元素以 及行为列表组成,其格式如下: (defrule [] * ; =>

《人工智能及其应用》实验指导书

《人工智能及其应用》 实验指导书

浙江工业大学计算机科学与技术学院—人工智能课程组 2011年9月

前言 本实验是为了配合《人工智能及其应用》课程的理论学习而专门设置的。本实验的目的是巩固和加强人工智能的基本原理和方法,并为今后进一步学习更高级课程和信息智能化技术的研究与系统开发奠定良好的基础。 全书共分为八个实验:1.产生式系统实验;2.模糊推理系统实验;3.A*算法求解8数码问题实验;4.A*算法求解迷宫问题实验;5.遗传算法求解函数最值问题实验;6.遗传算法求解TSP问题实验;7.基于神经网络的模式识别实验;8.基于神经网络的优化计算实验。每个实验包括有:实验目的、实验内容、实验条件、实验要求、实验步骤和实验报告等六个项目。 本实验指导书包括两个部分。第一个部分是介绍实验的教学大纲;第二部分是介绍八个实验的内容。 由于编者水平有限,本实验指导书的错误和不足在所难免,欢迎批评指正。 人工智能课程组 2011年9月

目录 实验教学大纲 (1) 实验一产生式系统实验 (4) 实验二模糊推理系统实验 (7)

实验三A*算法实验I (13) 实验四A*算法实验II (17) 实验五遗传算法实验I (19) 实验六遗传算法实验II (26) 实验七基于神经网络的模式识别实验 (29) 实验八基于神经网络的优化计算实验 (35)

实验教学大纲 一、学时:16学时,一般安排在第9周至第16周。 二、主要仪器设备及运行环境:PC机、Visual C++ 6.0、Matlab 7.0。 三、实验项目及教学安排 序号实验名称实验 平台实验内容学 时 类型教学 要求 1 产生式系统应用VC++ 设计知识库,实现系统识别或 分类等。 2 设计课内 2 模糊推理系统应 用Matla b 1)设计洗衣机的模糊控制器; 2)设计两车追赶的模糊控制 器。 2 验证课内 3 A*算法应用I VC++ 设计与实现求解N数码问题的 A*算法。 2 综合课内 4 A*算法应用II VC++ 设计与实现求解迷宫问题的A* 算法。 2 综合课内 5 遗传算法应用I Matla b 1)求某一函数的最小值; 2)求某一函数的最大值。 2 验证课内 6 遗传算法应用II VC++ 设计与实现求解不同城市规模 的TSP问题的遗传算法。 2 综合课内7 基于神经网络的Matla1)基于BP神经网络的数字识 2 验证课内

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

昆明理工大学信息工程与自动化学院学生实验报告 (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:

人工智能实验八数码问题的求解策略

人工智能上机实验二八数码问题的求解策略1、广度优先算法程序截图: 2、最佳优先算法程序截图:

(接上图) 3、程序代码: ①广度优先算法: (defun init-search (start goal) (declare (special *open*)) (declare (special *closed*)) (declare (special *moves*)) (declare (special *start*)) (declare (special *goal*)) (let (tuple) (setq tuple (cons start '(nil)) ) (setq *open* (list tuple) ) (setq *closed* nil ) (setq *start* start) (setq *goal* goal) (setq *moves* '(blank-left blank-up blank-right blank-down)) (breadth-first-search))) (defun breadth-first-search () (declare (special *open*)) (declare (special *closed*)) (declare (special *goal*)) (declare (special *moves*)) (let (state tuple children path) (cond ((null *open*) 'FAIL!) (t (setq tuple (car *open*) ) (setq state (car tuple) ) (setq *open* (cdr *open*) ) (setq *closed* (cons tuple *closed*)) (cond ((equal state *goal*) (setq path (get-path-from *goal*)) (setq path (reverse path)) (print-path path)

人工智能实验报告

人工智能课程项目报告 姓名: 班级:二班

一、实验背景 在新的时代背景下,人工智能这一重要的计算机学科分支,焕发出了他强大的生命力。不仅仅为了完成课程设计,作为计算机专业的学生, 了解他,学习他我认为都是很有必要的。 二、实验目的 识别手写字体0~9 三、实验原理 用K-最近邻算法对数据进行分类。逻辑回归算法(仅分类0和1)四、实验内容 使用knn算法: 1.创建一个1024列矩阵载入训练集每一行存一个训练集 2. 把测试集中的一个文件转化为一个1024列的矩阵。 3.使用knnClassify()进行测试 4.依据k的值,得出结果 使用逻辑回归: 1.创建一个1024列矩阵载入训练集每一行存一个训练集 2. 把测试集中的一个文件转化为一个1024列的矩阵。 3. 使用上式求参数。步长0.07,迭代10次 4.使用参数以及逻辑回归函数对测试数据处理,根据结果判断测试数 据类型。 五、实验结果与分析 5.1 实验环境与工具 Window7旗舰版+ python2.7.10 + numpy(库)+ notepad++(编辑)

Python这一语言的发展是非常迅速的,既然他支持在window下运行就不必去搞虚拟机。 5.2 实验数据集与参数设置 Knn算法: 训练数据1934个,测试数据有946个。

数据包括数字0-9的手写体。每个数字大约有200个样本。 每个样本保持在一个txt文件中。手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下图所 示 建立一个kNN.py脚本文件,文件里面包含三个函数,一个用来生成将每个样本的txt文件转换为对应的一个向量:img2vector(filename):,一个用 来加载整个数据库loadDataSet():,最后就是实现测试。

人工智能八数码游戏

实验一:八数码游戏问题 一、八数码游戏问题简介 九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。问题是在3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。 问题给定初始位置和目标位置,要求通过一系列的数码移动,将初始位置转化为目标位置。 (a)初始状态(b)目标状态 图八数码游戏 二、实验目的 1.熟悉人工智能系统中的问题求解过程; 2.熟悉状态空间的盲目搜索和启发式搜索算法的应用; 3.熟悉对八数码问题的建模、求解及编程语言的应用。 三、实验的思路 八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。 例如:

图1 八数码问题示意图 1.启发函数设定 由八数码问题的部分状态图可以看出,从初始节点开始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零,因此可以把数码不同的位置个数作为标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息来扩展节点的选择,减少搜索范围,提高搜索速度。 2.搜索过程:(搜索采用广度搜索方式,利用待处理队列辅助,逐层搜索(跳过劣质节点)) a、把初始数码组压入队列; b、从队列中取出一个数码组节点; c、扩展子节点,即从上下左右四个方向移动空格,生成相应子节点: d、对子节点数码组作评估,是否为优越节点,即其评估值是否小于等于其父节点加一,是则将其压入队,否则抛弃。 e、判断压入队的子节点数码组(优越点)的评估值,为零则表示搜索完成,

人工智能实验报告

《一人工智能方向实习一》 实习报告 专业:计算机科学与技术 班级:12419013 学号: 姓名: 江苏科技大学计算机学院 2016年3月

实验一数据聚类分析 一、实验目的 编程实现数据聚类的算法。 二、实验内容 k-means聚类算法。 三、实验原理方法和手段 k-means算法接受参数k ;然后将事先输入的 n个数据对象划分为 k个聚类以便使得 所获得的聚类满足:同一聚类中的对象相似度较高 四、实验条件 Matlab2014b 五、实验步骤 (1)初始化k个聚类中心。 (2)计算数据集各数据到中心的距离,选取到中心距离最短的为该数据所属类别。 (3)计算(2)分类后,k个类别的中心(即求聚类平均距离) (4)继续执行(2)(3)直到k个聚类中心不再变化(或者数据集所属类别不再变化) 六、实验代码 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % mai n.m % k-mea ns algorithm % @author matcloud %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; close all ; load fisheriris ; X = [meas(:,3) meas(:,4)]; figure; plot(X(:,1),X(:,2), 'ko' ,'MarkerSize' ,4); title( 'fisheriris dataset' , 'FontSize' ,18, 'Color' , 'red'); [idx,ctrs] = kmea ns(X,3); figure; subplot(1,2,1); plot(X(idx==1,1),X(idx==1,2), 'ro' , 'MarkerSize' ,4); hold on;

人工智能实验报告,包括八数码问题八皇后问题和tsp问题

八数码问题 (一)问题描述 在一个3*3的方棋盘上放置着1,2,3,4,5,6,7,8八个数码,每个数码占一格,且有一个空格。这些数码可以在棋盘上移动,其移动规则是:与空格相邻的数码方格可以移入空格。现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。该问题称八数码难题或者重排九宫问题。 (二)问题分析 八数码问题是个典型的状态图搜索问题。搜索方式有两种基本的方式,即树式搜索和线式搜索。搜索策略大体有盲目搜索和启发式搜索两大类。盲目搜索就是无“向导”的搜索,启发式搜索就是有“向导”的搜索。 1、启发式搜索 由于时间和空间资源的限制,穷举法只能解决一些状态空间很小的简单问题,而对于那些大状态空间的问题,穷举法就不能胜任,往往会导致“组合爆炸”。所以引入启发式搜索策略。启发式搜索就是利用启发性信息进行制导的搜索。它有利于快速找到问题的解。 由八数码问题的部分状态图可以看出,从初始节点开始,在通向目标节点的路径上,各节点的数码格局同目标节点相比较,其数码不同的位置个数在逐渐减少,最后为零。所以,这个数码不同的位置个数便是标志一个节点到目标节点距离远近的一个启发性信息,利用这个信息就可以指导搜索。即可以利用启发信息来扩展节点的选择,减少搜索范围,提高搜索速度。 启发函数设定。对于八数码问题,可以利用棋局差距作为一个度量。搜索过程中,差距会逐渐减少,最终为零,为零即搜索完成,得到目标棋局。 (三)数据结构与算法设计 该搜索为一个搜索树。为了简化问题,搜索树节点设计如下: struct Chess//棋盘 {

int cell[N][N];//数码数组 int Value;//评估值 Direction BelockDirec;//所屏蔽方向 struct Chess * Parent;//父节点 }; int cell[N][N]; 数码数组:记录棋局数码摆放状态。 int Value; 评估值:记录与目标棋局差距的度量值。 Direction BelockDirec; 所屏蔽方向:一个屏蔽方向,防止回推。 Direction :enum Direction{None,Up,Down,Left,Right};//方向枚举 struct Chess * Parent; 父节点:指向父亲节点。 下一步可以通过启发搜索算法构造搜索树。 1、局部搜索树样例:

相关文档
最新文档