基於爬山演算法求解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.其距離計算方法下圖所示:
具體程式碼如下:
- package noah;
-
import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.Random;
- publicclass HillClimbing {
- privateint MAX_GEN;// 迭代次數
- privateint cityNum; // 城市數量,編碼長度
- privateint[][] distance; // 距離矩陣
- privateint bestT;// 最佳出現代數
- privateint[] bestGh;// 最好的路徑編碼
- privateint bestEvaluation;
- private Random random;
- public HillClimbing() {
- }
- /**
- * constructor of GA
- *
- * @param n
- * 城市數量
- * @param g
- * 執行代數
- *
- **/
- public HillClimbing(int n, int g) {
- cityNum = n;
- MAX_GEN = g;
- }
- // 給編譯器一條指令,告訴它對被批註的程式碼元素內部的某些警告保持靜默
- @SuppressWarnings("resource")
- /**
- * 初始化HillClimbing演算法類
- * @param filename 資料檔名,該檔案儲存所有城市節點座標資料
- * @throws IOException
-
相關推薦
基於爬山演算法求解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演算法題-Sqrt(Java實現)
這是悅樂書的第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++:蟻群演算法解決TSP(C++多執行緒版)
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