1. 程式人生 > >【演算法】旅行商A*演算法

【演算法】旅行商A*演算法

#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);
}