人工智能实验一Word文档下载推荐.docx

上传人:b****6 文档编号:16564852 上传时间:2022-11-24 格式:DOCX 页数:23 大小:180.74KB
下载 相关 举报
人工智能实验一Word文档下载推荐.docx_第1页
第1页 / 共23页
人工智能实验一Word文档下载推荐.docx_第2页
第2页 / 共23页
人工智能实验一Word文档下载推荐.docx_第3页
第3页 / 共23页
人工智能实验一Word文档下载推荐.docx_第4页
第4页 / 共23页
人工智能实验一Word文档下载推荐.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

人工智能实验一Word文档下载推荐.docx

《人工智能实验一Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《人工智能实验一Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。

人工智能实验一Word文档下载推荐.docx

(1)复习程序设计和数据结构课程的相关知识;

(2)熟悉人工智能系统中的问题求解过程;

(3)熟悉对八码数问题的建模、求解及编程语言的运用。

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

(1)建立一个只含有起始节点S的搜索图G,把S放到一个叫做OPEN的未扩展节点的表中;

(2)建立一个叫做CLOSED的已扩展节点表,其初始为空表;

(3)LOOP:

若OPEN表是空表,则失败退出;

(4)选择OPEN表上的第一个节点,把它从OPEN表移除并放进CLOSED表中,称此节点为节点n;

(5)若n为一目标节点,则有解并成功退出,此解是追踪图G中沿着指针从n到S这条路径而得到的;

(6)扩展节点n,同时生成不是n的祖先的那些后继节点的集合M。

把M的这些成员作为n的后继节点舔到图中;

(7)对那些未曾在G中出现过的M成员设置一个通向n的指针。

把M的这些成员加进OPEN表。

对已经在OPEN表或CLOSED表上的成员,确定是否需要更改通到n的指针方向;

(8)按某一任意方式或按某个探视值,重排OPEN表。

宽度优先算法实现过程

(1)把起始节点放到OPEN表中;

(2)如果OPEN是个空表,则没有解,失败退出;

否则继续;

(3)把第一个节点从OPEN表中移除,并把它放入CLOSED的扩展节点表中;

(4)扩展节点n。

如果没有后继节点,则转向

(2);

(5)把n的所有后继结点放到OPEN表末端,并提供从这些后继结点回到n的指针;

(6)如果n的任意一个后继结点是目标节点,则找到一个解答,成功退出,否则转

(2)。

深度优先实现过程

(1)把起始节点S放入未扩展节点OPEN表中。

如果此节点为一目标节点,则得一个解;

(2)如果OPEN为一空表,则失败退出;

(3)把第一个节点从OPEN表移到CLOSED表;

(4)如果节点n的深度等于最大深度,则转向

(2);

(5)扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。

如果没有后裔,则转向

(2);

(6)如果后继结点中有任一个目标节点,则得到一个解,成功退出,否则转向

(2)。

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

1台PC及VISUALC++6.0软件

四、实验方法、步骤(或:

程序代码或操作过程)

1、先创建项目,新建SourceFile文件:

main.cpp。

#include<

iostream>

#include"

Node.h"

Queue.h"

Search.h"

Tree.h"

voidCreateNode1(std:

:

vector<

int>

&

s)

{

s.push_back

(2);

s.push_back(8);

s.push_back(3);

s.push_back

(1);

s.push_back(0);

s.push_back(4);

s.push_back(7);

s.push_back(6);

s.push_back(5);

}

voidCreateNode4(std:

d)

d.push_back

(2);

d.push_back(8);

d.push_back(3);

d.push_back

(1);

d.push_back(6);

d.push_back(4);

d.push_back(7);

d.push_back(0);

d.push_back(5);

voidCreateNode8(std:

voidCreateNode20(std:

voidCreateNode27(std:

voidCreateNode_test1(std:

voidtest_expand()

std:

s;

CreateNode1(s);

d;

CreateNode4(d);

Nodesource(s);

Nodedest(d);

source.Display();

Searchsearch(&

source);

cout<

<

source.Expand(dest,search);

voidtest_search()

dest.Display();

search.Find(&

dest);

search.DisplayRoute();

voidtest_search2level()

CreateNode8(d);

voidtest_search_lab1()

CreateNode27(d);

intmain(intargc,char**argv)

//test_expand();

//test_search();

//test_search2level();

//test_search_lab1();

return0;

2、新建SourceFile文件:

Node.cpp。

#ifndefPROGECT_1_NODE

#definePROGECT_1_NODE

vector>

enumOP

EMPTY,

UP,

DOWN,

LEFT,

RIGHT

};

boolIsOpposite(OPopa,OPopb);

classNode

public:

Node(std:

const&

state);

boolExpand(Nodeconst&

destNode,Search&

search);

voidDisplay()const;

voidDisplayRoute()const;

booloperator==(Nodeconst&

v)const;

private:

Node*CreateChild(OPop);

intFindEmptySpaceId()const;

OP>

GenerateLegalOperators(intspaceId)const;

intCalIdBasedOP(OPop,intspaceId)const;

boolIsWithinRange(OPop,intspaceId)const;

m_state;

Node*m_pParent;

Node*>

m_children;

OPm_op;

#endif//PROGECT_1_NODE

3新建HeardFile文件:

node.h。

math.h>

boolIsOpposite(OPopa,OPopb)

if(LEFT==opa&

RIGHT==opb)

returntrue;

if(RIGHT==opa&

LEFT==opb)

if(UP==opa&

DOWN==opb)

if(DOWN==opa&

UP==opb)

returnfalse;

Node:

Node(std:

state)

m_state(state)

m_pParent(NULL)

m_children()

m_op(EMPTY)

voidShowOP(OPop)

switch(op)

{

caseEMPTY:

std:

"

EMPTY"

;

break;

caseUP:

UP"

caseDOWN:

DOWN"

caseLEFT:

LEFT"

caseRIGHT:

RIGHT"

default:

exit(-1);

}

voidShowOPs(std:

ops)

for(intid=0;

id<

ops.size();

++id)

ShowOP(ops[id]);

endl;

boolNode:

Expand(Nodeconst&

search)

intspaceId=FindEmptySpaceId();

spaceisat"

<

spaceId<

legalOPs=GenerateLegalOperators(spaceId);

ShowOPs(legalOPs);

while(legalOPs.size()>

0)

OPop=legalOPs[legalOPs.size()-1];

legalOPs.pop_back();

Node*pChild=CreateChild(op);

if(*pChild==destNode)

{

search.SetDestPt(pChild);

returntrue;

}

search.GetQueue().EnQueue(pChild);

voidNode:

Display()const

for(inti=0;

i<

m_state.size();

++i)

m_state[i]<

pParent:

m_pParent<

op:

ShowOP(m_op);

for(intj=0;

j<

m_children.size();

++j)

m_children[j]<

DisplayRoute()const

routeOps;

Nodeconst*pNode=this;

while(NULL!

=pNode)

routeOps.push_back(pNode->

m_op);

pNode=pNode->

m_pParent;

for(intid=routeOps.size()-2;

id>

=0;

--id)

ShowOP(routeOps[id]);

operator==(Nodeconst&

v)const

++id)

if(m_state[id]!

=v.m_state[id])

returnfalse;

returntrue;

Node*Node:

CreateChild(OPop)

childState=m_state;

intexchangePos1=FindEmptySpaceId();

intexchangePos2=CalIdBasedOP(op,exchangePos1);

inttemp=childState[exchangePos1];

childState[exchangePos1]=childState[exchangePos2];

childState[exchangePos2]=temp;

Node*child=newNode(childState);

child->

m_pParent=this;

m_op=op;

m_children.push_back(child);

returnchild;

intNode:

FindEmptySpaceId()const

if(0==m_state[id])

returnid;

return-1;

std:

Node:

GenerateLegalOperators(intspaceId)const

allPossibleOps;

allPossibleOps.push_back(UP);

allPossibleOps.push_back(DOWN);

allPossibleOps.push_back(LEFT);

allPossibleOps.push_back(RIGHT);

ops;

allPossibleOps.size();

OPop=allPossibleOps[id];

if(IsOpposite(op,m_op))

continue;

if(IsWithinRange(op,spaceId))

ops.push_back(op);

returnops;

CalIdBasedOP(OPop,intspaceId)const

spaceId-=int(sqrt(m_state.size()));

spaceId+=int(sqrt(m_state.size()));

--spaceId;

++spaceId;

return-1;

returnspaceId;

IsWithinRange(OPop,intspaceId)const

spaceId=CalIdBasedOP(op,spaceId);

if(spaceId>

=0&

m_state.size())

4、新建SourceFile文件:

Queue.cpp。

voidQueue:

EnQueue(Node*pNode)

m_queue.push_back(pNode);

Node*Queue:

DeQueue()

if(m_queue.size()==0)

returnNULL;

Node*pNode=m_queue[0];

m_queue.pop_front();

returnpNode;

5、新建HeardFile文件:

Queue.h。

#ifndefPROGECT_1_QUEUE

#definePROGECT_1_QUEUE

deque>

classNode;

classQueue

voidEnQueue(Node*pNode);

Node*DeQueue();

deque<

m_queue;

#endif//PROGECT_1_QUEUE

6、新建SourceFile文件:

Search.cpp。

Search:

Search(Node*root)

m_queue()

m_pDestNode(NULL)

m_queue.EnQueue(root);

Node*Search:

Select()

returnm_queue.DeQueue();

voidSearch:

Find(Node*destNode)

boolisFound=false;

while(!

isFound)

Node*pNode=Select();

pNode->

Display();

isFound=pNode->

Expand(*destNode,*this);

m_pDestNode->

DisplayRoute(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1