人工智能实验报告.docx
《人工智能实验报告.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
人工智能实验报告
院系:
计算机科学学院
专业:
计算机科学与技术
年级:
XXX
课程名称:
人工智能导论
学号:
XXX
姓名:
XXX
指导教师:
XXX
XXX年XX月XX日
年级
班号
学号
专业
姓名
实验名称
实验一:
水壶问题
实验
类型
设计型
综合型
创新型
实
验
目
的
或
要
求
实验题目:
有3个没有刻度的油壶,其容量分别为10升,3升,4升。
其中,只有
10升的壶里面装满了油,其他两个壶是空的。
现在需要较为准确地得到5
升油并且油不能被倒在其他的地方浪费掉。
实
验
原
理
(
算
法
流
程
)
实验步骤:
1、程序代码
#include
#include
#include
inth10=10,h4=0,h3=0;
intmain()
{
while(h10!
=5)
{
inti=rand()%6;
intrule=i;
switch(i)
{
case0:
h10=h10-(4-h4);h4=4;break;
case1:
h10=h10-(3-h3);h3=3;break;
case2:
h10=h10+h4;h4=0;break;
case3:
h10=h10+h3;h3=0;break;
case4:
if((h4+h3)>3)
{h4=h4+h3-3;h3=3;}
else{h3=h4+h3;h4=0;}break;
case5:
if((h4+h3)>4){h3=h4+h3-4;h4=4;}
else{h4=h4+h3;h3=0;}break;
}
printf("h10:
%d,h4:
%d,h3:
%d,rule:
%d\n",h10,h4,h3,rule);
}
return0;
}
组
内
分
工
(
可
选
)
实
验
结
果
分
析
及
心
得
体
会
1、实验结果分析
运行得到的结果后,可能会出现重复的情况,这是无法避免的。
在分析实验的结果时,应将得到的重复的结果去掉再进行分析,才能得出正确的结果。
2、心得体会
应将实际问题转化为数学模型从而进行建模分析。
再用代码来解决问题。
而且
要学会用代码解决身边的常识性问题,提高自己将实际问题转化为用程序解决实际问题的能力。
成
绩
评
定
教师签名:
2013年月日
备注:
源代码附后,源代码要求有注释说明
年级
班号
学号
专业
姓名
实验名称
实验二:
传教士野人问题
实验
类型
设计型
综合型
创新型
实
验
目
的
或
要
求
题目:
传教士人数M,野人C,M≥C,开始都在岸左边,
①船只能载两人,传教士和野人都会划船
②两岸边保证野人人数不能大于传教士人数,否则传教士将被野人吃掉
把所有人都送过河,设计方案,要求编程实现。
实
验
原
理
(
算
法
流
程
)
实验步骤:
1、程序代码
#include
#include
#include
typedefstruct
{
intxds;//xiudaoshi
intyr;//yeren
intcw;//chuanwei
}DataType;
DataTypefa[50000];
typedefstructnode
{
DataTypedata;
structnode*son;
structnode*bro;
structnode*par;
structnode*next;
}Ltable;
voidLtableinit(Ltable**head)//初始化邻接表的操作
{
*head=(Ltable*)malloc(sizeof(Ltable));//动态分配空间
(*head)->son=NULL;
(*head)->bro=NULL;
(*head)->par=NULL;
(*head)->next=NULL;
}
voidinsertson(Ltable*head,DataTypex)//在邻接表中插入儿子结点的操作
{
Ltable*q,*s;
q=(Ltable*)malloc(sizeof(Ltable));
q->data=x;
head->son=q;
s=head;
while(s->next!
=NULL)
s=s->next;
q->par=head;
q->son=NULL;
q->bro=NULL;
s->next=q;
q->next=NULL;
}
voidinsertbro(Ltable*head,DataTypex)//在邻接表中插入兄弟结点的操作,所有的兄弟结点都指向他们右边的结点;
{
Ltable*q,*s;
q=(Ltable*)malloc(sizeof(Ltable));
s=head->son;
q->data=x;
while(s->bro!
=NULL)
s=s->bro;
s->bro=q;
s->next=q;
q->next=NULL;
q->bro=NULL;
q->par=head;
q->son=NULL;
}
intfindfa(DataTypex,intn)//生成在船上修道士仍安全的几种情况;
{
inti=0,a,b,t=0;
if(x.cw)
{
a=0;b=n-a;
while(a+b>=1)
{
t++;
while(b>=0)
{
fa[i].xds=a;
fa[i].yr=b;
i++;
a++;
b--;
}
a=0;
b=n-a-t;
}
}
else
{
a=1;b=0;t=0;
while(a+b<=n)
{
t++;
while(a>=0)
{
fa[i].xds=a*(-1);
fa[i].yr=b*(-1);
i++;
a--;
b++;
}
a=fa[0].xds*(-1)+t;
b=0;
}
}
returni;
}
intjiancha(DataTypex,intn)//安全性检测,检查当前情况下,修道士是否安全
{
if((x.xds>=x.yr||x.xds==0)&&((n-x.xds)>=(n-x.yr)||x.xds==n)&&x.xds>=0&&x.xds<=n&&x.yr>=0&&x.yr<=n)
return1;
else
return0;
}
voidprint(Ltable*q,Ltable*p)//打印安全渡河的过程
{
DataTypea[100];
inti=1;
a[0].cw=0;
a[0].xds=0;
a[0].yr=0;
while(q!
=p)
{
a[i++]=q->data;
q=q->par;
}
while((--i)>-1)
{
printf("(%d%d%d)",a[i].xds,a[i].yr,a[i].cw);
if(!
(a[i].xds==0&&a[i].yr==0&&a[i].cw==0))
{if(a[i].cw==1)
printf("-->(%d%d)-->(%d%d0)\n",a[i].xds-a[i-1].xds,a[i].yr-a[i-1].yr,a[i-1].xds,a[i-1].yr);
//else printf("<--(%d%d)<--(%d%d1)\n",(a[i].xds-a[i-1].xds)*(-1),(-1)*(a[i].yr-a[i-1].yr),a[i-1].xds,a[i-1].yr);
}
elseprintf("\n");
}
printf("渡河成功!
\n");
}
voidwork(Ltable*p,intn,intc)
{
Ltable*q,*t;
DataTypetem;
inti,flag,flag1,g=0,j,count=0;
q=p->son;
while(q!
=NULL)
{
flag=0;
j=findfa(q->data,c);
for(i=0;i{
tem.xds=q->data.xds-fa[i].xds;
tem.yr=q->data.yr-fa[i].yr;
tem.cw=1-q->data.cw;
t=q;
if(jiancha(tem,n))
{
flag1=1;
while(t!
=p)
{
if(tem.xds==t->data.xds&&tem.yr==t->data.yr&&tem.cw==t->data.cw)
{
flag1=0;
break;
}
t=t->par;
}
if(flag1==1)
{
if(flag==0)
{
insertson(q,tem);
flag=1;
}
else
insertbro(q,tem);
if(tem.xds==0&&tem.yr==0&&tem.cw==0)
{
print(q,p);
count++;
}
}
}
}
q=q->next;
}
if(count==0)
printf("无法成功渡河,修道士好郁闷!
\n");
else
printf("有%d种渡河方式。
\n",count);
}
intmain()
{
Ltable*p;
DataTypetem;
Ltableinit(&p);//初始化邻接表;
intn,c;
while
(1)
{
printf("请输入修道士与野人的人数n:
\n");
scanf("%d",&n);
if(n==0)
break;
printf("请输入船可容纳的人数c:
\n");
scanf("%d",&c);
tem.xds=n;
tem.yr=n;
tem.cw=1;
insertson(p,tem);//将初始状态作为头结点的孩子结点;
work(p,n,c);//进行广度搜索;
}
return1;
}
2、结果截图
组
内
分
工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
通过传教士过河问题,可以提高我们的编程能力。
让我们清楚的知道如何将实际问题转化为程序问题。
让计算机来解决实际中的问题。
成
绩
评
定
教师签名:
2013年月日
年级
班号
学号
专业
姓名
实验名称
实验三:
演化算法
实验
类型
设计型
综合型
创新型
实
验
目
的
或
要
求
题目:
根据以下MATLAB程序编写C语言代码
pop=rand(20,1)*10;%随机产生初始群体
objvalue=10*sin(5*pop)+7*cos(4*pop);%//10*sin(5*x)+7*cos(4*x);
fori=1:
200%200为迭代次数
forj=1:
19
a=rand();
x=a*pop(j)+(1-a)*pop(j+1);
obj=10*sin(5*x)+7*cos(4*x);
ifobj>objvalue(j)
pop(j)=x;
objvalue(j)=obj;
end
end
end
实
验
原
理
(
算
法
流
程
)
实验步骤:
1、程序代码
#include
#include
#include
intmain()
{
doublea,obj[20],b1[20],c,d,a1;
inti,j;
srand(5);
for(i=0;i<20;i++)
{
a=(double)rand()*10.0/RAND_MAX;
b1[i]=a;
obj[i]=10*sin(5*a)+7*cos(4*a);
}
for(j=0;j<200;j++)
{
for(i=0;i<19;i++)
{
c=(double)rand()/RAND_MAX;
d=c*b1[i]+(1-c)*b1[i+1];
a1=10*sin(5*d)+7*cos(4*d);
if(a1>obj[i])
{
b1[i]=d;
obj[i]=a1;
}
}
}
for(i=0;i<19;i++)
{
printf("b2=%1.4f\n",obj[i]);
}
system("pause");
}
2、程序运行结果截图
组
内
分
工
(
可
选
)
无
实
验
结
果
分
析
及
心
得
体
会
演化算法在实际中有着许多重要的意义。
他是根据达尔文的生物进化得来的。
它主要有两点方面的特点:
(1)自组织、自适应和自学习性(智能性)。
(2)本质并行性。
演化计算主要的经过长时间的发展,主要出现了以下几个研究领域:
(1)演化计算的理论研究;
(2)新的计算模型;
(3)演化优化;
(4)演化人工神经网络;
(5)并行和分布式演化计算;
(6)演化机器学习;
(7)演化计算应用系统;
(8)演化硬件;
(9)演化软件;
(10)演化计算内涵的扩充。
所以,学会演化算法也是相当重要的
成
绩
评
定
教师签名:
2013年月日
备注:
源代码附后,源代码要求有注释说明