图搜索算法(深度优先搜索、迭代加深的深度优先搜索、广度优先搜索、代价一致搜索、A*搜索)

本文介绍了图的搜索算法,包括深度优先搜索、迭代加深的深度优先搜索、广度优先搜索、代价一致搜索和A*搜索。通过对罗马尼亚地图问题的应用,分析了每种算法的时间开销和路径优劣,并进行了算法的比较。
摘要由CSDN通过智能技术生成

图搜索算法

本周学习了一下图的搜索算法,包括无信息搜索算法:深度优先搜索、迭代加深的深度优先搜索、广度优先搜索以及代价一致搜索;有信息搜索算法:A*搜索。

一、需求分析

分别用深度优先搜索、迭代加深的深度优先搜索、广度优先搜索以及代价一致搜索得到从AradBucharest的一条路径,即为罗马尼亚问题的一个解,然后输出每个解的单源路径,并计算、输出每个算法花费的时间开销然后进行比较。

 

图一:罗马尼亚地图

二、详细代码

//主函数

int main(){
Graph g=Graph();
clock_t start,end;
cout<<"1、深度优先搜索:"<<endl;
start=clock();
DFS dfs=DFS();
dfs.DFS_Search(g,0,12);
end=clock();
cout<<"深度优先搜索花费时间为:"<<(double)(end-start)/CLK_TCK<<endl;
cout<<"2、迭代加深的深度优先搜索:"<<endl;
start=clock();
IDS ids=IDS();
ids.IDS_Search(g,0,12,8);
end=clock();
cout<<"迭代加深的深度优先搜索花费时间为:"<<(double)(end-start)/CLK_TCK<<endl;
cout<<"3、广度优先搜索:"<<endl;
start=clock();
BFS bfs=BFS();
bfs.BFS_Search(g,0,12);
end=clock();
cout<<"广度优先搜索花费时间为:"<<(double)(end-start)/CLK_TCK<<endl;
cout<<"4、代价一致搜索:"<<endl;
start=clock();
UCS u=UCS(g,0,12);
end=clock();
cout<<"代价一致搜索花费时间为:"<<(double)(end-start)/CLK_TCK<<endl;
cout<<"5、A*搜索:"<<endl;
start=clock();
A_Star a_star=A_Star();
a_star.A_Search(g,0,15,g.getH());
end=clock();
cout<<"A*搜索花费时间为:"<<(double)(end-start)/CLK_TCK<<endl;
return 0;
}


 

//打印路径函数

void show(Graph g,stack<int> s){
stack<int> s1=s,s2=s,s3=s;
int result=0;
if(s1.size()==0){
cout<<"路径搜索失败..."<<endl;
return;
}
cout<<"访问的下标:";
for(int i=0;i<s.size();i++){
cout<<"->"<<s1.top();
s1.pop();
}
cout<<endl;
cout<<"访问的过程:";
if(s3.empty()){
cout<<"路径搜索失败..."<<endl;
return;
}else{
for(int i=0;i<s.size();i++){
cout<<"->"<<g.getCities(s3.top());
s3.pop();
}
while(!s2.empty()){
int t=s2.top();
s2.pop();
if(s2.empty())
break;
result+=g.getPath(t,s2.top());
}
}
cout<<endl<<"总长度为:"<<result<<endl;
g.init();//初始化图
}


 

//图类

class Graph{
private:
//城市名
charcities[20][20]={"Arad","Zerind","Oradea","Timisoara","Sibiu","Lugoj","RimnicuVilcea","Fagaras","Mehadia","Drobeta","Craiova","Pitesti","Bucharest","Giurgiu","Urziceni","Hirsova","Eforie","Vaslui","Isi","Neamt"};
intpath[20][20]={
  {0,75,10000,118,140,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{75,0,71,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{10000,71,0,10000,151,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{118,10000,10000,0,10000,111,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{140,10000,151,10000,0,10000,80,99,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,111,10000,0,10000,10000,70,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,80,10000,0,10000,10000,10000,146,97,10000,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,99,10000,10000,0,10000,10000,10000,10000,211,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,10000,70,10000,10000,0,75,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,10000,10000,75,0,120,10000,10000,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,146,10000,10000,120,0,138,10000,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,97,10000,10000,10000,138,0,101,10000,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,10000,211,10000,10000,10000,101,0,90,85,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,90,0,10000,10000,10000,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,85,10000,0,98,10000,142,10000,10000},
{10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,98,0,86,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,86,0,10000,10000,10000},
{10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,142,10000,10000,0,92,10000},
{10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,92,0,87},
{10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,87,0}};
int mark[20];//标志访问函数
//启发式函数
intH[20]={516,524,530,479,403,394,343,326,391,392,310,160,150,155,100,0};
public:
//构造函数
Graph(){
init();
} 
//访问标志初始化
void init(){
for(int i=0;i<20;i++)
mark[i]=0;
}
//第一个孩子 
int getFirst(int start){
if(start>=0 && start<20){
for(int i=0;i<20;i++)
if(path[start][i]>0 && path[start][i]<10000) //表示start和i所表示的点有关系
return i; 
}
return -1;//表示一个孩子也没有 
}
//下一个孩子
int getNext(int start,int w){
if(start>=0 && start<20 && w>=0 && w<20){
for(int i=w+1;i<20;i++)
if(path[start][i]>0 && path[start][i]<10000)//有关联 
return i;
}
return -1;//一个孩子也没有 
}
void setMark(int i){
mark[i]=1;
}
int getMark(int i){
return mark[i];
}
int getH(int i){
return H[i];
}
int* getH(){
return H; 
}
char* getCities(int i){
return cities[i];
}
int getPath(int i,int j){
return path[i][j];
}
};


 

/**

【深度优先】

基本原理:深度优先搜索采用堆栈寻找路径,首先从Arad结点出发,判断是否为目标结点,若否,寻找与该结点的邻接点,先搜索一条分

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值