【演算法】旅行商A*演算法
阿新 • • 發佈:2019-02-07
#include "stdio.h" const int max=9999; const int ax=50; int isbest(int i,int bestpath[],int p)//檢測改節點是否已經加入bestpath[]中 { for(int k=1;k<=p;k++) { if(i==bestpath[k]) break; } if(k!=p+1)//新測試節點在a[]中 return 1; else return 0; } void main() { int min=max; int minf=max; int num;//城市數量 int mat[ax][ax];//城市間距離 int bestpath[ax];//最佳路徑 int f=0,g=0,h=0; int ff[ax];//依次求每個城市的f值 int gg[ax];//城市的g值 printf("城市個數為:"); scanf("%d",&num); printf("城市間的距離為:\n");//輸入各城市間距離的矩陣 for(int i=0;i<num;i++) for(int j=0;j<num;j++) scanf("%d",&mat[i][j]); bestpath[0]=0;//起點為0,即城市A for(int p=0;p<num-1;p++)//依次求每個最優節點,每次迴圈得到一個新的最優城市放到bestpath[]中 { for(int kk=0;kk<num;kk++) ff[kk]=max;//便於後面求最小值 for(i=1;i<num;i++)//起點A不算,從非起點開始找尋最優城市 { if(isbest(i,bestpath,p))//該點已經在bestpath[]中的話,忽略 continue; else//計算該點的g值 gg[i]=g+mat[bestpath[p]][i];//i點的g值 for(int m=0;m<num;m++)//開始計算h值 { if(isbest(m,bestpath,p))//該點已經在bestpath[]中的話,忽略 continue; for(int t=m+1;t<num;t++) { if(isbest(t,bestpath,p)) continue; if(m!=0||t!=i||p==num-2)//不是最後一個點的話,不算A點到這個點長度 if(mat[m][t]<min) min=mat[m][t]; } } h=min*(num-p-1);//h值 ff[i]=gg[i]+h;//第i個節點的f值 min=max;//重新賦值最大,以便下次迴圈 } for(i=0;i<num;i++)//找尋最優點,即f值最小者 { if(ff[i]<minf) { minf=ff[i]; bestpath[p+1]=i; } } minf=max;//重新賦值最大,以便下次迴圈 g=g+mat[bestpath[p]][bestpath[p+1]];//更新g值 } printf("最優路徑為:"); for(i=0;i<num;i++) printf("%c ",bestpath[i]+65); printf("A\n"); printf("總路程為:"); int sum=0; for(i=0;i<num-1;i++) sum=sum+mat[bestpath[i]][bestpath[i+1]]; sum=sum+mat[bestpath[num-1]][0];//總路程最後一個城市要回到A,所以加上其距離 printf("%d\n",sum); }