1、人工智能及其应用-推销员旅行问题一、问题描述:一个推销员计划出访推销产品。从一个城市(如A)出发,访问每个城市一次,且最多一次,然后返回城市A,要求寻找最短路线,如图所示。ACBDE7101071369106105二、把图形建立成加权图形的邻接数组.如下1(A)2(B)3(C)4(D)5(E)1(A)07610132(B)0710103(C)0594(D)065(E)0三、程序如下:(在程序中,将设为一个极大值999)#define Max 999 /定义最大数#define VertexNum 6 /定义顶点数,A顶点重复2次#define EdgeNum 9 /定义邻接边数int Grap
2、hVertexNumVertexNum; /图形邻接数组int EdgeEdgeNum3= /输入数据 1,2,7,1,3,6,1,4,10,1,5,13, 2,3,7,2,4,5,2,5,10, 3,4,5,3,5,9, ;int VisitedVertexNum; /查找记录int DistanceVertexNum; /距离总和void Dijkstra(int Begin)int MinEdge; /最小边 int Vertex; /最小边的顶点 int i,j; int Edges; /边数 Edges=1; /初始边数 VisitedBegin=1; /初始顶点for(i=1;iV
3、ertexNum;i+) /计算初始距离之和 Distancei=GraphBegini; DistanceBegin=0; /起始顶点的距离为0 printf(Vertice); for(i=1;iVertexNum;i+) /输出顶点数据 printf(%5d,i); printf(n); printf(Step %d:,Edges); for(i=1;iVertexNum;i+) printf(%5d,Distancei); /输出距离总和数据 printf(n); while(Edges(VertexNum-1) /当边数少于顶点数执行 Edges+; MinEdge=Max; /将最
4、小边设到最大值 for(j=1;jDistancej) Vertex=j;/找出最小边的顶点MinEdge=Distancej; /找出最小边的距离总和 VisitedVertex=1; /将最小边的顶点设为已查找 printf(Step %d:,Edges); for(j=1;jVertexNum;j+) /找出未查找顶点的最小距离总和 if(Visitedj=0&(DistanceVertex+GraphVertexjDistancej) Distancej=DistanceVertex+GraphVertexj; printf(%5d,Distancej); printf(n); voi
5、d Print_M_Graph() /输出邻接数组数据 int i,j; printf(Vertice); for(i=1;iVertexNum;i+) printf(%5d,i); printf(n); for(i=1;iVertexNum;i+) printf(%5d ,i); for(j=1;jVertexNum;j+) printf(%5d,Graphij); printf(n); /以邻接数组建立图形 void Create_M_Graph(int Vertice1,int Vertice2,int Weight) GraphVertice1Vertice2=Weight; /主程序
6、 void main() int BeginVertex=1; int i,j; for(i=0;iVertexNum;i+) /清除查找记录 Visitedi=0; for(i=0;iVertexNum;i+) /清除数组数据 for(j=0;jVertexNum;j+) Graphij=Max; for(i=0;iEdgeNum;i+) /调用建立邻接数组 Create_M_Graph(Edgei0,Edgei1,Edgei2); printf(#Graph#n); Print_M_Graph(); printf(Dijkstra Slgorithm:n); Dijkstra(BeginVertex);