图搜索算法
本周学习了一下图的搜索算法,包括无信息搜索算法:深度优先搜索、迭代加深的深度优先搜索、广度优先搜索以及代价一致搜索;有信息搜索算法:A*搜索。
一、需求分析
分别用深度优先搜索、迭代加深的深度优先搜索、广度优先搜索以及代价一致搜索得到从Arad到Bucharest的一条路径,即为罗马尼亚问题的一个解,然后输出每个解的单源路径,并计算、输出每个算法花费的时间开销然后进行比较。
图一:罗马尼亚地图
二、详细代码
//主函数
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结点出发,判断是否为目标结点,若否,寻找与该结点的邻接点,先搜索一条分