還是回溯法,TSP問題
阿新 • • 發佈:2019-01-24
//TSP問題,Travel Salesman Problem,又稱為貨擔郎問題,郵遞員問題 //題目要求:從n個城市中的某一個出發,不重複的走網其餘n-1個城市,並且回到起始點, //在所有可能的線路中,找出路徑最短的一條 //演算法:還是用回溯法,解空間結構為排列樹 #define NUM 100 int n; //圖G的頂點個數 int m; //圖G的邊數 int a[NUM][NUM]; //圖G的鄰接矩陣 int x[NUM]; //當前解 int bestx[NUM]; //最優解,順序輸出即可 int cc; //當前費用 int bestc; //最優費用 int NoEdge=-1; //無邊標記 void init() { for(int i=0;i<NUM;i++) { for(int j=0;j<NUM;j++) { a[i][j]=NoEdge; } } bestc=NoEdge; cc=0; for(int i=1;i<=n;i++) { x[i]=i; } } void BackTrack(int t) //t從2開始 { //到達第n個節點 if(t==n) { if(a[x[n-1]][x[n]]!=NoEdge && (a[x[n]][1]!=NoEdge) && (cc+a[x[n-1]][x[n]]+a[x[n]][1]<bestc ||bestc==NoEdge)) { for(int i=1;i<=n;i++) { bestx[i]=x[i]; } bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1]; } } else { for(int i=t;i<=n;i++) { //如果上一個節點和它此後的節點有邊,並且費用不高於現有的最優費用(bestc==NoEdge表示第一次) if(a[x[t-1]][x[i]]!=NoEdge && (cc+a[x[t-1]][x[i]]<bestc ||bestc==NoEdge)) { swap(x[t],x[i]); cc+=a[x[t-1]][x[t]]; BackTrack(t+1); cc-=a[x[t-1]][x[t]]; swap(x[t],x[i]); } } } }//注,此時預設x[1]==1,即從第一個節點出發