实验设计三基于AI的问题求解Word文档格式.docx
《实验设计三基于AI的问题求解Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验设计三基于AI的问题求解Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
第一类问题是可以用来求解确定性问题的;
另一类问题是只有通过寻找一个解决方案来解决。
AI所关心的正是后一类问题的解决方案,即此应用示例要解决的搜索类型。
请分别采用以下搜索方法实现:
(1)深度优先搜索
(2)广度优先搜索
3.课程设计要求:
现在,考虑我们将使用不同的搜索方法来解决的问题。
假定您是一位旅行代理人,一个相当挑剔的客户想让您预定A航空公司的从纽约到洛杉矶的航班。
您告诉客户A航空公司没有直接从纽约到洛杉矶的航班,但客户坚持说,A航空公司是他唯一想要乘坐的飞机的航空公司。
因此,您必须寻找连接纽约和洛杉矶之间的航线。
您可参考A航空公司的定期航班,如表3-1所示。
从上表中不难看出从纽约到洛杉矶的连接。
问题在于如何利用C++程序实现它。
为了使得问题易于理解,在图3-1中以树的形式绘制了这幅图。
现在我们准备开发不同的搜索技术(深度优先、广度优先)来查找从纽约到洛杉矶的航线。
(1)深度优先搜索:
①深度优先搜索在尝试另一种路径之前,会探索每条可能的路径,直到结束。
②算法:
如图3-2所示。
深度优先搜索按ABDBEBACF顺序遍历。
其中A是起点,F是终点。
深度优先搜索是树的中序遍历。
即路径一直向左,直到遇到终端节点或者找到目标。
如果达到终端节点,路径回退到上一层,转向右边,然后在向左边搜索,直到遇到目标或者终端节点。
这个过程一直持续到发现目标或者检查到搜索空间中的最后一个节点。
③main()提示您输入出发城市和目标城市。
这意味可使用此程序来寻找任何两个城市之间的航线。
下面是运行结果:
From?
NewYork
To?
LosAngeles
NewYorktoChicagotoDenvertoLosAngeles
Distanceis2900
提示:
◆正如main()函数显示的那样,为了使用Search,首先创建一个Search对象。
然后用这个连接加载航班数据库。
随后,调用findroute()试图在出发与目标城市之间寻找一条航线。
为了判断是否找到了这样的航线,调用了routefound()函数。
若存在这样的航线,这个函数返回true。
为了显示这条航线,调用了route()函数。
match()函数实现判断两个城市之间是否有航班,这两个城市分别由from和to指定.
Find()函数用来在数据库中搜索从指定的出发城市开始的连接;
Findroute()函数是寻找两个城市之间航线的关键例程,函数调用时需要出发城市和目标城市的名称;
route()函数显示路径和总的距离。
与深度优先搜索相对的是广度优先搜索。
在这种方法中,在搜索下一层的节点之前,会检查这个层的每个节点。
这种遍历方法如下图所示(红色虚线),C为目标
当涉及到航班示例时,广度优先搜索是通过检查是否存在离开出发城市的航班与到达目标城市的航班之间的连接来实现的。
换句话说,在前进到另一层之前,会检查连接航班的所有连接的目的地。
4.实验条件:
(1)主要设备:
586或更高机型,256MB或更高的内存,40G或更大的硬盘。
(2)主要软件:
①操作系统可为Windows9X、WinMe、Win2000或更高版本等;
②开发环境为VC++6.0或者TC++3.0。
(3)参考书目:
①TheArtofC++------C++编程艺术作者:
(美)斯切尔特(Schildt,H.)著,曹蓉蓉译
清华大学出版社
②《数据结》严蔚敏等编著机械工业出版社2005年第1版
③《数据结构及应用算法教程》严蔚敏等编著清华大学出版社2001年2月第1版
5.实验方法与步骤:
#include<
iostream>
string>
fstream>
stdlib.h>
iomanip>
usingnamespacestd;
classTree;
classnode
{
public:
voidinitque(node*q);
voidpop(node*q,int&
s1);
voidpush(node*q,int&
s);
intempty(node*q);
private:
intbase[20];
intfront;
intrear;
};
voidnode:
:
initque(node*q)
(*q).front=(*q).rear=0;
}
pop(node*q,int&
s1)
s1=(*q).base[(*q).front];
(*q).front++;
push(node*q,int&
s)
(*q).base[(*q).rear]=s;
(*q).rear++;
intnode:
empty(node*q)
if((*q).front==(*q).rear)
return0;
else
return1;
classpoint
point():
visit(0),value(0),distance(0)
{}
intvisit;
intvalue;
intdistance;
classgraph:
publicpoint
{
graph():
top(0)
int*res,*vis,*dis;
intdec,top;
point**gh;
nodeq;
int*nos;
classdata:
publicgraph,publicnode
data()
voidread()
stringtemp;
inti=0;
ifstreamfin;
fin.open("
c:
\\airplane.txt"
);
while(!
fin.eof())
fin>
>
temp;
i++;
sum=i/3;
//cout<
<
"
sum:
"
sum<
endl;
fin.close();
s=newstring[sum];
d=newstring[sum];
k=newint[sum];
i=0;
s[i]>
d[i]>
k[i];
voidcity();
intinput()
cout<
请输入出发城市与目的城市:
出发城市:
cin>
src;
目的城市:
graph:
dec;
returnsrc;
friendTree;
intsum,*k,max,src,nd;
string*s,*d,*temp,*temp2;
voiddata:
city()
inti,j,k,m;
temp=newstring[sum*2];
for(i=0;
i<
sum;
i++)
temp[i]=s[i];
for(i=sum,j=0;
sum*2;
i++,j++)
temp[i]=d[j];
m=0;
(sum*2-m);
for(j=i+1;
j<
j++)
if(temp[i]==temp[j])
for(k=j;
k<
(sum*2-1-m);
k++)
temp[k]=temp[k+1];
m++;
j--;
temp2=newstring[sum*2-m];
max=sum*2-m;
sum*2-m;
temp2[i]=temp[i];
------"
temp[i]<
vis=newint[max];
res=newint[max];
dis=newint[max];
//wenti
nos=newint[max];
classTree
Tree():
sum(0)
voidbuild(data&
g);
voidDFS(data&
g,intsrc);
voidTree:
BFS(data&
voiddisplay(data&
g)
inti;
g.top-1;
sum+=g.dis[i];
g.top;
for(intj=0;
g.max;
if(i==g.top-1&
&
g.res[i]==j)
g.temp2[j]<
总路程为:
elseif(g.res[i]==j)
--->
;
voiddisplay1(data&
g.nd-1;
g.nd;
if(i==g.nd-1&
g.nos[i]==j)
elseif(g.nos[i]==j)
intsum;
build(data&
inti,j,a,b;
g.gh=newpoint*[g.sum];
g.sum;
g.gh[i]=newpoint[g.sum];
for(j=0;
g.gh[i][j].value=0;
g.gh[i][j].distance=0;
if(g.s[i]==g.temp2[j])
a=j;
if(g.d[i]==g.temp2[j])
b=j;
g.gh[a][b].value=1;
g.gh[a][b].distance=g.k[i];
DFS(data&
g,intsrc)
inti,j,flag=1;
g.vis[src]=1;
g.res[g.top++]=src;
if(g.res[g.top-1]==g.dec&
flag==1)
display(g);
flag=0;
if(g.gh[src][i].value==1)
if(g.vis[i]!
=1)
g.dis[g.top-1]=g.gh[src][i].distance;
DFS(g,i);
g,intsrc)//非递归
intv,w,i,flag=1;
g.nd=0;
int*visited;
g.initque(&
g.q);
visited=newint[g.max];
visited[i]=0;
if(src>
=0&
src<
g.max)
g.push(&
g.q,src);
visited[src]=1;
while(g.empty(&
g.q)!
flag)
g.pop(&
g.q,v);
g.nos[g.nd]=v;
if(g.nos[g.nd]==g.dec)
{g.nd++;
display1(g);
g.nd++;
for(w=0;
w<
w++)
if(g.gh[v][w].value==1)
if(visited[w]!
=1)
g.q,w);
visited[w]=1;
g.dis[g.nd-1]=g.gh[v][w].distance;
g.nos[i]<
delete[]visited;
intmain()
datada,da2;
Treet,t2;
//da.read();
//da.city();
//t.build(da);
深度优先算法:
//t.DFS(da,da.input());
//t.display(da);
da2.read();
da2.city();
t2.build(da2);
广度优先算法:
t2.BFS(da2,da2.input());
system("
pause"
附录:
说明:
1.实验过程由学生记录实验的过程,包括画出流程图、操作过程、遇到哪些问题以及如何解决等;
2.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
3.源程序(带注释)、代码、具体语句等,若表格空间不足时可作为附录另外附页。
4.程序测试后,将多组测试结果附在程序后;
5.提交报告时请将说明部分去掉。