1. 程式人生 > >基於爬山演算法求解TSP問題(JAVA)

基於爬山演算法求解TSP問題(JAVA)

一、TSP問題

TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市。路徑的選擇目標是要求得的路徑路程為所有路徑之中的最小值。

TSP問題是一個組合優化問題。該問題可以被證明具有NPC計算複雜性。TSP問題可以分為兩類,一類是對稱TSP問題(Symmetric TSP),另一類是非對稱問題(Asymmetric TSP)。所有的TSP問題都可以用一個圖(Graph)來描述:

V={c1, c2, …, ci, …, cn},i = 1,2, …, n,是所有城市的集合. ci表示第i個城市, n為城市的數目;

E={(r, s): r,s∈ V}是所有城市之間連線的集合;

C = {crs: r,s∈ V}是所有城市之間連線的成本度量(一般為城市之間的距離);

如果crs = csr, 那麼該TSP問題為對稱的,否則為非對稱的。

一個TSP問題可以表達為:

求解遍歷圖G = (V, E, C),所有的節點一次並且回到起始節點,使得連線這些節點的路徑成本最低。

二、爬山演算法

爬山演算法是一種區域性擇優的方法,採用啟發式方法,是對深度優先搜尋的一種改進,它利用反饋資訊幫助生成解的決策。 該演算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個區域性最優解。屬於人工智慧演算法的一種。

爬山演算法實現很簡單,其主要缺點是會陷入區域性最優解,而不一定能搜尋到全域性最優解。如下圖所示:假設C點為當前解,爬山演算法搜尋到A點這個區域性最優解就會停止搜尋,因為在A點無論向那個方向小幅度移動都不能得到更優的解。

爬山演算法實施步驟:


三、爬山演算法求解TSP問題

在該JAVA實現中我們選擇使用tsplib上的資料att48,這是一個對稱TSP問題,城市規模為48,其最優值為10628.其距離計算方法下圖所示:

具體程式碼如下:

  1. package noah;  
  2. import java.io.BufferedReader;  
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.util.Random;  
  7. publicclass HillClimbing {  
  8.     privateint MAX_GEN;// 迭代次數
  9.  privateint cityNum; // 城市數量,編碼長度
  10.     privateint[][] distance; // 距離矩陣
  11.     privateint bestT;// 最佳出現代數
  12.     privateint[] bestGh;// 最好的路徑編碼
  13.     privateint bestEvaluation;  
  14.     private Random random;  
  15.     public HillClimbing() {  
  16.     }  
  17.     /** 
  18.      * constructor of GA 
  19.      *  
  20.      * @param n 
  21.      *            城市數量 
  22.      * @param g 
  23.      *            執行代數 
  24.      *  
  25.      **/
  26.     public HillClimbing(int n, int g) {  
  27.         cityNum = n;  
  28.         MAX_GEN = g;  
  29.     }  
  30.     // 給編譯器一條指令,告訴它對被批註的程式碼元素內部的某些警告保持靜默
  31.     @SuppressWarnings("resource")  
  32.     /** 
  33.      * 初始化HillClimbing演算法類 
  34.      * @param filename 資料檔名,該檔案儲存所有城市節點座標資料 
  35.      * @throws IOException 
  36. 相關推薦

    基於爬山演算法求解TSP問題JAVA

    一、TSP問題 TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市。路徑的選擇目

    基於遺傳演算法求解TSP問題Java介面

    最近為做展示,改寫了一個遺傳演算法求TSP的Java介面版,思路程式碼和 http://blog.csdn.net/wangqiuyun/article/details/12838903 這篇文章思路是一樣的,追加了Java用Graphics畫點及畫線做路徑展示,展示部分

    基於貪心演算法求解TSP問題JAVA

    前段時間在搞貪心演算法,為了舉例,故拿TSP來開刀,寫了段求解演算法程式碼以便有需之人,注意程式碼考慮可讀性從最容易理解角度寫,沒有優化,有需要可以自行優化!一、TSP問題TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、

    基於MongoDB的儲存系統java

    很多年不寫部落格了,希望寫一些東西總結總結。 我從2011年開始做工業軟體生產執行系統架構,2016年對整體架構進行重新規劃和重構。 我們MES架構中關於日誌模組的設計思路,接下來我會介紹 在MES業務下Java和MongoDB的一些思路總結 同步java和mongodb的jar

    網際網路校招常考經典演算法模板彙總java

    一、二分查詢 1、左閉右閉版[start, end] (1)迴圈實現: bool binarySearch(int arr[ ], int start, int end, int target){ w

    紅黑樹 原理和演算法詳細介紹Java

    R-B Tree簡介 R-B Tree,全稱是Red-Black Tree,又稱為“紅黑樹”,它一種特殊的二叉查詢樹。紅黑樹的每個節點上都有儲存位表示節點的顏色,可以是紅(Red)或黑(Black)。 紅黑樹的特性: (1)每個節點或者是黑色,或者是紅

    歐幾里得演算法的實現Java

    package euclidean_algorithm; import java.util.Scanner; /** * @author ALazy_cat * 歐幾里得演算法的自然語言描述:

    幾種大數階乘演算法效率比較Java

    完整程式碼: package bigdatamul; import java.math.BigInteger; /** * 大數階乘 * * @Description: TODO(大數階乘) * * @author yzy * @date 201

    基於蟻群演算法求解求解TSP問題JAVA

    一、TSP問題 TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的

    C++版遺傳演算法求解TSP Java版GA_TSP我的第一個Java程式

      嗯哼,時隔半年,再次有時間整理關於組合優化問題——旅行商問題(Traveling Salesman Problem, TSP),這次採用的是經典遺傳演算法(Genetic Algorithm, GA)進行求解,利用C++語言進行程式設計實現。關於TSP問題以及GA的簡單介紹,可參見我的另一篇文章:Java

    粒子群演算法求解旅行商問題TSP JAVA實現

    粒子群演算法求解旅行商問題TSP 寫在開頭: 最近師妹的結課作業問我,關於使用粒子群求解TSP問題的思路。我想了想,自己去年的作業用的是遺傳演算法,貌似有些關聯,索性給看了看程式碼。重新學習了一遍粒子群演算法,在這裡記錄一下,算是對知識的總結,鞏固一下。

    基於哈夫曼壓縮演算法的壓縮與解壓實現Java

    如果需要對一個檔案進行壓縮,第一步是提取出檔案中的內容資訊;第二步是對其中的字元等進行統計,獲得壓縮編碼;第三步是把壓縮編碼及解壓檔案需要的資訊存入一個檔案(或者生成新檔案並存入)。這樣對檔案的壓縮就完成了。 下面就是檔案的解壓,第一步還是讀入檔案,即從前面生

    圖論演算法--求解割點、割邊JAVA

    割點:對於一個連通圖來說,如果刪除某個點之後圖不再連通,這個點就稱為割點 割點演算法 時間複雜度:O(N+M) 但是下面給出的演算法時間複雜度為O(N^2),這是因為下面的儲存結構都是鄰接矩陣,這

    貪婪演算法求解最小生成樹中的應用JAVA--Kruskal演算法

    Kruskal演算法又被稱為“加邊法”,這種演算法會將加權連通圖的最小生成樹看成具有V-1條邊的無環子圖,且邊的權重和最小。演算法開始時,會按照權重的非遞減順序對圖中的邊排序,之後迭代的以貪婪的方式新增邊。下面以下圖為例來講解Kruskal演算法的過程:Input:6 101

    圖的點著色、區間著色問題及其應用基於貪心思想的DFS回溯法求點著色問題和區間著色演算法求解任務排程問題

    Graph Coloring Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4503 Accepted: 2059 Special Judge Description You are

    LeetCode演算法題-SqrtJava實現

    這是悅樂書的第158次更新,第160篇原創 01 看題和準備 今天介紹的是LeetCode演算法題中Easy級別的第17題(順位題號是69)。 計算並返回x的平方根,其中x保證為非負整數。 由於返回型別是整數,因此將截斷十進位制數字,並僅返回結果的整數部分。例如: 輸入:4 輸出:2

    資料結構與演算法2—— 棧java

    1 棧的實現 1.1 簡單陣列實現棧 package mystack; public class ArrayStack { private int top; //當前棧頂元素的下標 private int[] array; public ArraySt

    C++:蟻群演算法解決TSPC++多執行緒版

    TSP問題:旅行商問題,最短迴路。 這裡採用att48資料,鄰接矩陣全部取整數,原資料放在文後。 解決程式碼如下: //#define TEST_INPUT //#define TEST_T //#define TEST_ANT //#define TEST_VALUE #

    ID生成器,Twitter的雪花演算法Java

    /** * Twitter_Snowflake<br> * SnowFlake的結構如下(每部分用-分開):<br> * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000

    作業排程演算法Java

    package Task03; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class App { private List<Integer> arr