窮舉法解決旅行商問題


一、問題描述

如圖所示,一個旅行商從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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM