標籤:
一、問題描述
,一個旅行商從A點出發,需要不重複地走遍5個城市ABCDE,最後回到A。每個城市之間的花費(即權值),現在要求找出一條總花費最小的路徑,即權值和為最小的路徑。
二、 演算法說明
1. 演算法一: 登山法(貪進法)
即在每一個城市出發前比較接下來所能走的城市花費(權值),找出權值最小的走。
優缺點:由於只是在每個城市局部地考慮權值最小,但當走完所用城市後,所得到權值和不一定為最小,所以採用此演算法得不到精確解,但此演算法複雜度較低。
2. 演算法二:窮舉法(本程式採用此演算法)
即計算出每條路徑的權值和,選權值和最小的路徑為最佳路徑。
優缺點:此演算法可以得到精確解,但由於採用的是窮舉,所以複雜度較高。
三、源碼樣本
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 旅行商問題 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //權值矩陣 14 int[,] weightValue = new int[10, 10]; 15 //城市數量 16 int cityNum = 0; 17 //城市名稱 18 string[] cityName = new string[10]; 19 //出發城市 用索引表示 20 int beginCityIndex = 0; 21 //權值 22 int minWeightValue = int.MaxValue; 23 int weightSum = minWeightValue; 24 //最佳路徑 25 int[] bestWay; 26 27 //輸入城市數量 28 Console.WriteLine("請輸入城市數量:"); 29 cityNum = int.Parse(Console.ReadLine()); 30 Console.WriteLine("請輸入各個城市名稱"); 31 for (int i = 0; i < cityNum; i++) 32 { 33 cityName[i] = Console.ReadLine(); 34 } 35 Console.WriteLine("請輸入權值矩陣:"); 36 //輸入權值矩陣 37 for (int i = 0; i < cityNum; i++) 38 { 39 for (int j = 0; j < cityNum; j++) 40 { 41 weightValue[i, j] = int.Parse(Console.ReadLine()); 42 } 43 } 44 //輸入出發城市 45 Console.WriteLine("請輸入出發城市:"); 46 beginCityIndex = int.Parse(Console.ReadLine()); 47 48 bestWay = new int[cityNum+1]; 49 50 for (int i = 0; i < cityNum; i++) 51 { 52 if (i != beginCityIndex) 53 { 54 for (int j = 0; j < cityNum; j++) 55 { 56 if (j != i && j != beginCityIndex) 57 { 58 for (int k = 0; k < cityNum; k++) 59 { 60 if(k!=j && k!=i && k!=beginCityIndex) 61 { 62 for (int t = 0; t < cityNum; t++) 63 { 64 if(t!=i && t!=j && t!=k && t!=beginCityIndex) 65 { 66 weightSum = weightValue[beginCityIndex,i] 67 +weightValue[i,j] 68 +weightValue[j,k] 69 +weightValue[k,t] 70 +weightValue[t,beginCityIndex]; 71 if(minWeightValue>weightSum) 72 { 73 minWeightValue=weightSum; 74 bestWay[0] = beginCityIndex; 75 bestWay[1] = i; 76 bestWay[2] = j; 77 bestWay[3] = k; 78 bestWay[4] = t; 79 bestWay[5] = beginCityIndex; 80 } 81 } 82 } 83 } 84 } 85 } 86 } 87 } 88 } 89 90 91 Console.WriteLine("最短路徑為:"); 92 Console.WriteLine(cityName[bestWay[0]]+"->" 93 + cityName[bestWay[1]] + "->" 94 + cityName[bestWay[2]] + "->" 95 + cityName[bestWay[3]] + "->" 96 + cityName[bestWay[4]] + "->" 97 + cityName[bestWay[5]]); 98 99 Console.WriteLine("最小權值為{0}", minWeightValue);100 101 Console.ReadKey();102 }103 }104 }
View Code
窮舉法解決旅行商問題