大工20春《人工智能》大作业题目及要求Word文件下载.docx

上传人:wj 文档编号:3537971 上传时间:2023-05-01 格式:DOCX 页数:36 大小:204.97KB
下载 相关 举报
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第1页
第1页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第2页
第2页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第3页
第3页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第4页
第4页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第5页
第5页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第6页
第6页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第7页
第7页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第8页
第8页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第9页
第9页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第10页
第10页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第11页
第11页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第12页
第12页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第13页
第13页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第14页
第14页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第15页
第15页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第16页
第16页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第17页
第17页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第18页
第18页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第19页
第19页 / 共36页
大工20春《人工智能》大作业题目及要求Word文件下载.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

大工20春《人工智能》大作业题目及要求Word文件下载.docx

《大工20春《人工智能》大作业题目及要求Word文件下载.docx》由会员分享,可在线阅读,更多相关《大工20春《人工智能》大作业题目及要求Word文件下载.docx(36页珍藏版)》请在冰点文库上搜索。

大工20春《人工智能》大作业题目及要求Word文件下载.docx

constintROW=3;

//行数

constintCOL=3;

//列数

constintMAXDISTANCE=10000;

//最多可以有的表的数目

constintMAXNUM=10000;

typedefstruct_Node{

intdigit[ROW][COL];

intdist;

//一个表和目的表的距离

intdep;

//t深度

intindex;

//节点的位置

}Node;

Nodesrc,dest;

//父节表目的表

vector<

Node>

node_v;

//存储节点

boolisEmptyOfOPEN()//open表是否为空

{

for(inti=0;

i<

node_v.size();

i++){

if(node_v[i].dist!

=MAXNUM)

returnfalse;

}

returntrue;

boolisEqual(intindex,intdigit[][COL])//判断这个最优的节点是否和目的节点一样

ROW;

i++)

for(intj=0;

j<

COL;

j++){

if(node_v[index].digit[i][j]!

=digit[i][j])

ostream&

operator<

<

(ostream&

os,Node&

node)

j++)

os<

node.digit[i][j]<

'

;

endl;

returnos;

voidPrintSteps(intindex,vector<

&

rstep_v)//输出每一个遍历的节点深度遍历

rstep_v.push_back(node_v[index]);

index=node_v[index].index;

while(index!

=0)

for(inti=rstep_v.size()-1;

i>

=0;

i--)//输出每一步的探索过程

cout<

"

Step"

<

rstep_v.size()-i

endl<

rstep_v[i]<

voidSwap(int&

a,int&

b)

intt;

t=a;

a=b;

b=t;

voidAssign(Node&

node,intindex)

node.digit[i][j]=node_v[index].digit[i][j];

intGetMinNode()//找到最小的节点的位置即最优节点

intdist=MAXNUM;

intloc;

//thelocationofminimizenode

if(node_v[i].dist==MAXNUM)

continue;

elseif((node_v[i].dist+node_v[i].dep)<

dist){

loc=i;

dist=node_v[i].dist+node_v[i].dep;

returnloc;

boolisExpandable(Node&

if(isEqual(i,node.digit))

intDistance(Node&

node,intdigit[][COL])

intdistance=0;

boolflag=false;

for(inti=0;

for(intk=0;

k<

k++){

for(intl=0;

l<

l++){

if(node.digit[i][j]==digit[k][l]){

distance+=abs(i-k)+abs(j-l);

flag=true;

break;

else

flag=false;

if(flag)

returndistance;

intMinDistance(inta,intb)

return(a<

b?

a:

b);

voidProcessNode(intindex)

intx,y;

boolflag;

if(node_v[index].digit[i][j]==0)

x=i;

y=j;

elseflag=false;

if(flag)

Nodenode_up;

Assign(node_up,index);

//向上扩展的节点

intdist_up=MAXDISTANCE;

if(x>

0)

Swap(node_up.digit[x][y],node_up.digit[x-1][y]);

if(isExpandable(node_up))

dist_up=Distance(node_up,dest.digit);

node_up.index=index;

node_up.dist=dist_up;

node_up.dep=node_v[index].dep+1;

node_v.push_back(node_up);

Nodenode_down;

Assign(node_down,index);

//向下扩展的节点

intdist_down=MAXDISTANCE;

if(x<

2)

Swap(node_down.digit[x][y],node_down.digit[x+ 

1][y]);

if(isExpandable(node_down))

dist_down=Distance(node_down,dest.digit);

node_down.index=index;

node_down.dist=dist_down;

node_down.dep=node_v[index].dep+1;

node_v.push_back(node_down);

Nodenode_left;

Assign(node_left,index);

//向左扩展的节点

intdist_left=MAXDISTANCE;

if(y>

Swap(node_left.digit[x][y],node_left.digit[x][y-1]);

if(isExpandable(node_left))

dist_left=Distance(node_left,dest.digit);

node_left.index=index;

node_left.dist=dist_left;

node_left.dep=node_v[index].dep+1;

node_v.push_back(node_left);

Nodenode_right;

Assign(node_right,index);

//向右扩展的节点

intdist_right=MAXDISTANCE;

if(y<

Swap(node_right.digit[x][y],node_right.digit[x][y+1]);

if(isExpandable(node_right))

dist_right=Distance(node_right,dest.digit);

node_right.index=index;

node_right.dist=dist_right;

node_right.dep=node_v[index].dep+1;

node_v.push_back(node_right);

node_v[index].dist=MAXNUM;

intmain()//主函数

intnumber;

Inputsource:

"

i++)//输入初始的表

cin>

>

number;

src.digit[i][j]=number;

src.index=0;

src.dep=1;

Inputdestination:

//输入目的表

for(intm=0;

m<

m++)

for(intn=0;

n<

n++){

dest.digit[m][n]=number;

node_v.push_back(src);

//在容器的尾部加一个数据

Search..."

clock_tstart=clock();

while

(1)

if(isEmptyOfOPEN())

Cann'

tsolvethisstatement!

return-1;

//thelocationoftheminimizenode最优节点的位置

loc=GetMinNode();

if(isEqual(loc,dest.digit))

rstep_v;

Source:

src<

PrintSteps(loc,rstep_v);

Successful!

Using"

(clock()-start)/CLOCKS_PER_SEC

seconds."

ProcessNode(loc);

return0;

四、程序运行效果图

2

8

3

1

6

4

7

5

(初始状态)

(结束状态)

五、对于重排九宫问题的启发式函数

给定九宫格的初始状态,要求在有限步的操作内,使其转化为目标状态,且所得到的解是代价最小解(即移动的步数最少)。

如:

初始格局 

目标状态

#include"

iostream.h"

time.h>

stdio.h>

dos.h>

conio.h>

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

//classdefinition

classeight_num

private:

intnum[9];

intnot_in_position_num;

intdeapth;

inteva_function;

public:

eight_num*parent;

eight_num*leaf_next;

eight_num*leaf_pre;

eight_num(intinit_num[9]);

eight_num(intnum1,intnum2,intnum3,intnum4,int 

num5,intnum6,intnum7,intnum8,intnum9)

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(inti=0;

i<

9;

i++)

num[i]=i;

voidcul_para(void);

voidget_numbers_to(intother_num[9]);

intget_nipn(void)

{returnnot_in_position_num;

intget_deapth(void)

{returndeapth;

intget_evafun(void)

{returneva_function;

voidset_num(intother_num[9]);

voidshow(void);

eight_num&

operator=(eight_num&

);

operator=(intother_num[9]);

intoperator==(eight_num&

intoperator==(intother_num[9]);

};

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

voideight_num:

:

cul_para(void)

inti;

inttemp_nipn=0;

for(i=0;

if(num[i]!

=target[i])

temp_nipn++;

not_in_position_num=temp_nipn;

if(this->

parent==NULL)

deapth=0;

deapth=this->

parent->

deapth+1;

eva_function=not_in_position_num+deapth;

//构造函数1

eight_num:

eight_num(intinit_num[9])

num[i]=init_num[i];

//显示当前节点的状态

show()

cout<

num[0];

num[1];

num[2];

\n"

num[3];

num[4];

num[5];

num[6];

num[7];

num[8];

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

get_numbers_to(intother_num[9])

other_num[i]=num[i];

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

set_num(intother_num[9])

num[i]=other_num[i];

eight_num:

operator=(eight_num&

another_8num)

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

not_in_position_num=another_8num.not_in_position_num;

deapth=another_8num.deapth+1;

return*this;

operator=(intother_num[9])

inteight_num:

operator==(eight_num&

intmatch=1;

if(num[i]!

=another_8num.num[i])

match=0;

if(match==0)

return1;

operator==(intother_num[9])

=other_num[i])

//classdefinitionover

//空格向上移

intmove_up(intnum[9])

if(num[i]==0)

if(i<

3)

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

num[i-3]=0;

//空格向下移

intmove_down(intnum[9])

if(i>

5)

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

num[i+3]=0;

//空格向左移

intmove_left(intnum[9])

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

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

num[i-1]=0;

//空格向右移

intmove_right(intnum[9])

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

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

num[i+1]=0;

//判断可否解出

inticansolve(intnum[9],inttarget[9])

inti,j;

intcount_num,count_target;

for(j=0;

j<

i;

j++)

if(num[j]<

num[i]&

num[j]!

=0)

count_num++;

if(target[j]<

target[i]&

target[j]!

count_target++;

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

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2