1. 程式人生 > >旅行商問題TSP(蟻群演算法Java)

旅行商問題TSP(蟻群演算法Java)

旅行商問題,即TSP問題(Traveling Salesman Problem)是數學領域中著名問題之一。假設有一個旅行商人要拜訪N個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要 回到原來出發的城市。路徑的選擇目標是要求得的路徑路程為所有路徑之中的最小值。TSP問題是一個NPC問題。這個問題一般是使用遺傳演算法去解,但是螞蟻演算法要更高效.對於c++不熟悉的我,用C語言是個噩夢,因此寫一個java程式碼,並且桌面視窗顯示結果的版本.

再來說說蟻群演算法

       各個螞蟻在沒有事先告訴他們食物在什麼地方的前提下開始尋找食物。當一隻找到食物以後,它會向環境釋放一 種揮發性分泌物pheromone (稱為資訊素,該物質隨著時間的推移會逐漸揮發消失,資訊素濃度的大小表徵路徑的遠近)來實現的,吸引其他的螞蟻過來,這樣越來越多的螞蟻會找到食物。有 些螞蟻並沒有像其它螞蟻一樣總重複同樣的路,他們會另闢蹊徑,如果另開闢的道路比原來的其他道路更短,那麼,漸漸地,更多的螞蟻被吸引到這條較短的路上 來。最後,經過一段時間執行,可能會出現一條最短的路徑被大多數螞蟻重複著。(實在不理解去度娘)


公共函式及變數

  1. package com.seul.tsp;  
  2. /* 
  3.  * 公共函式以及變數 
  4.  */
  5. publicclass PublicFun  
  6. {  
  7.     publicstaticfinaldouble ALPHA=1.0;//資訊啟發式因子,資訊素的重要程度
  8.     publicstaticfinaldouble BETA=2.0;//期望啟發式因子, 城市間距離的重要程度
  9.     publicstaticfinaldouble ROU=0.5;//資訊素殘留係數
  10.     publicstaticint N_ANT_COUNT=50;//螞蟻數量
  11.     publicstaticint N_IT_COUNT=200;//迭代次數
  12.     public
    staticint N_CITY_COUNT=15;//城市數量
  13.     publicstaticfinaldouble DBQ=100.0;//總資訊素
  14.     publicstaticfinaldouble DB_MAX=Math.pow(10,9);//一個標誌數,用來初始化一個比較大的最優路徑
  15.     //兩兩城市間的資訊量
  16.     publicstaticdouble[][] g_Trial;  
  17.     //兩兩城市間的距離
  18.     publicstaticdouble[][] g_Distance;  
  19.     //返回指定範圍內的隨機整數
  20.     publicstaticint rnd(int nLow,int nUpper)  
  21.     {  
  22.         return (int) (Math.random()*(nUpper-nLow)+nLow);  
  23.     }  
  24.     //返回指定範圍內的隨機浮點數
  25.     publicstaticdouble rnd(double dbLow,double dbUpper)  
  26.     {  
  27.         return Math.random()*(dbUpper-dbLow)+dbLow;  
  28.     }  
  29. }  

螞蟻類
  1. package com.seul.tsp;  
  2. /* 
  3.  * 螞蟻類 
  4.  * 使用物件的複製,必須實現Cloneable介面,然後重寫Object中clone()方法 
  5.  */
  6. publicclass Ant implements Cloneable  
  7. {  
  8.     publicint[] m_nPath=newint[PublicFun.N_CITY_COUNT];//螞蟻走過的路徑
  9.     publicdouble m_dbPathLength;//螞蟻走過的路徑長度
  10.     publicint[] m_nAllowedCity=newint[PublicFun.N_CITY_COUNT];//螞蟻沒有去過的城市
  11.     publicint m_nCurCityNo;//當前所在城市的編號
  12.     publicint m_nMovedCityCount;//已經去過的城市數量
  13.     /* 
  14.      * 初始化函式,螞蟻搜尋前呼叫該方法 
  15.      */
  16.     publicvoid Init()  
  17.     {  
  18.         for (int i = 0; i < PublicFun.N_CITY_COUNT; i++)  
  19.         {  
  20.             m_nAllowedCity[i]=1;//設定全部城市沒有去過
  21.             m_nPath[i]=0;//螞蟻走過的路徑全部設定為0
  22.         }  
  23.         m_dbPathLength=0.0//螞蟻走過的路徑長度設定為0
  24.         m_nCurCityNo=PublicFun.rnd(0,PublicFun.N_CITY_COUNT);//隨機選擇一個出發城市
  25.         m_nPath[0]=m_nCurCityNo;//把出發城市儲存的路徑陣列中
  26.         m_nAllowedCity[m_nCurCityNo]=0;//標識出發城市已經去過了
  27.         m_nMovedCityCount=1;//已經去過的城市設定為1;
  28.     }  
  29.     /* 
  30.      * 覆蓋Object中的clone()方法 
  31.      * 實現物件的複製 
  32.      */
  33.     protected Object clone() throws CloneNotSupportedException  
  34.     {  
  35.         returnsuper.clone();  
  36.     }  
  37.     /* 
  38.      * 選擇下一個城市 
  39.      * 返回值為城市編號 
  40.      */
  41.     publicint ChooseNextCity()  
  42.     {  
  43.         int nSelectedCity=-1;//返回結果,初始化為-1
  44.         //計算當前城市和沒去過城市的資訊素的總和
  45.         double dbTotal=0.0;  
  46.         double[] prob=newdouble[PublicFun.N_CITY_COUNT];//用來儲存各個城市被選中的概率
  47.         for (int i = 0; i < PublicFun.N_CITY_COUNT; i++)  
  48.         {  
  49.             if(m_nAllowedCity[i]==1)//城市沒去過
  50.             {  
  51.                 //該城市和當前城市的資訊素
  52.                 prob[i]=Math.pow(PublicFun.g_Trial[m_nCurCityNo][i], PublicFun.ALPHA)*Math.pow(1.0/PublicFun.g_Distance[m_nCurCityNo][i],PublicFun.BETA);  
  53.                 dbTotal=dbTotal+prob[i];//累加資訊素
  54.             }  
  55.             else//如果城市去過了 則被選中的概率為0;
  56.             {  
  57.                 prob[i]=0.0;  
  58.             }  
  59.         }  
  60.         //進行輪盤選擇
  61.         double dbTemp=0.0;  
  62.         if(dbTotal>0.0)//如果總的資訊素大於0
  63. 相關推薦

    行商問題TSP演算法Java

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

    TSP_行商問題-基本演算法

    TSP_旅行商問題-基本蟻群演算法 旅行商系列演算法 TSP_旅行商問題-貪心演算法 TSP_旅行商問題-模擬退火演算法 TSP_旅行商問題-遺傳演算法 TSP_旅行商問題-基本蟻群演算法 基於基本蟻群演算法解決連續優化

    遺傳演算法解決TSP行商問題附:Python實現

    前言 我先囉嗦一下:不是很喜歡寫計算智慧的演算法,因為一個演算法就要寫好久。前前後後將近有兩天的時間。 好啦,現在進入正題。 巡迴旅行商問題(TSP)是一個組合優化方面的問題,已經成為測試組合優化新演算法的標準問題。應用遺傳演算法解決 TSP 問題,首先對訪問

    TSPTraveling Salesman Problem-----淺談行商問題動態規劃,回溯實現

      1.什麼是TSP問題   一個售貨員必須訪問n個城市,這n個城市是一個完全圖,售貨員需要恰好訪問所有城市的一次,並且回到最終的城市。   城市於城市之間有一個旅行費用,售貨員希望旅行費用之和最少。   完全圖:完全圖是一個簡單的無向圖,其中每對不同的頂點之間都恰連有一條邊相連。      2.T

    【機器學習】利用演算法求解行商TSP問題

    如果喜歡這裡的內容,你能夠給我最大的幫助就是轉發,告訴你的朋友,鼓勵他們一起來學習。 If you like the content here, you can give me the greatest help is forwarding, tell you

    演算法實現TSP(行商)問題(java語言)

    旅行商問題,即TSP問題(Traveling Salesman Problem)是數學領域中著名問題之一。假設有一個旅行商人要拜訪N個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而

    PSO解決TSP問題粒子演算法解決行商問題--python實現

    歡迎私戳關注這位大神! 有任何問題歡迎私戳我->給我寫信 首先來看一下什麼是TSP: The travelling salesman problem (TSP) asks the following question: "Given a list

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

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

    ACO演算法解決TSP行商問題

    前言 蟻群演算法也是一種利用了大自然規律的啟發式演算法,與之前學習過的GA遺傳演算法類似,遺傳演算法是用了生物進行理論,把更具適應性的基因傳給下一代,最後就能得到一個最優解,常常用來尋找問題的最優解。當然,本篇文章不會主講GA演算法的,想要了解的同學可以檢視,我的和遺傳演算

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

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

    簡單易懂,演算法解決行商問題

    轉載宣告: 原文把蟻群解決旅行商問題寫的很清楚,只不過本人認為原文中有一些小錯誤,特此更改(文中紅色加粗字型為改正處),程式碼中出現的一些演算法的小問題也進行了更正(比如程式碼中的貪心演算法),程式碼也附在下面,謝謝博主的分享。 1.關於旅行商(TSP)問題及衍化

    貪心演算法行商問題TSP

    TSP問題(Traveling Salesman Problem,旅行商問題),由威廉哈密頓爵士和英國數學家剋剋曼T.P.Kirkman於19世紀初提出。問題描述如下: 有若干個城市,任何兩個城市之間的距離都是確定的,現要求一旅行商從某城市出發必須經

    演算法課堂實驗報告——python回溯法與分支限界法行商TSP問題

    python實現回溯法與分支限界 一、開發環境 開發工具:jupyter notebook 並使用vscode,cmd命令列工具協助程式設計測試演算法,並使用codeblocks輔助編寫C++程式 程式語言:python3.6 二、實驗目標 1. 請用回溯法求對稱的旅

    行商問題Traveling Salesman Problem,TSP)的+Leapms線性規劃模型及c++呼叫

    知識點 旅行商問題的線性規劃模型旅行商問題的+Leapms模型及CPLEX求解C++呼叫+Leapms 旅行商問題 旅行商問題是一個重要的NP-難問題。一個旅行商人目前在城市1,他必須對其餘n-1個城市訪問且僅訪問一次而後回到城市1,請規 劃其最短的迴圈路線。 旅行商問題的建模 設城市i,j之間的距

    記一次演算法解決TSP問題

    演算法規則 1)範圍 螞蟻觀察到的範圍是一個方格世界,螞蟻有一個引數為速度半徑(一般是3),那麼它能觀察到的範圍就是3*3個方格世界,並且能移動的距離也在這個範圍之內。 2)摺疊環境 螞蟻所在的環境是一個虛擬的世界,其中有障礙物,有別的螞蟻,還有資訊素,資訊素有兩種,一種是找到食物的

    演算法解決tsp問題

    控制蟻群演算法走向的關鍵是資訊素,資訊素類似遺傳演算法的適應性函式,類似退火演算法的評價函式,影響著其中一隻螞蟻的下一步的選擇。 螞蟻:類似遺傳演算法的染色體,就是一條解,在tsp問題中螞蟻的路徑就是tsp的解。 資訊素:評價函式,與路徑成反比 螞蟻數量:一次迭代有多少隻螞

    演算法TSP問題

    添加了部分註釋,幾乎沒有改動(引數和城市格式略做改動),原博主的程式碼寫的很容易理解,也是我找到的最短的程式碼了,在此感謝。 程式碼如下: //蟻群演算法關於簡單的TSP問題求解// #include<stdio.h> #include<std

    TSP問題中,演算法的應用

    1. 蟻群演算法簡介      蟻群演算法(Ant Clony Optimization, ACO)是一種群智慧演算法,它是由一群無智慧或有輕微智慧的個體(Agent)通過相互協作而表現出智慧行為,從而為求解複雜問題提供了一個新的可能性。蟻群演算法最早是由義大利學者Colo

    MATLAB演算法TSP詳細註釋

    某大神寫的MATLAB蟻群演算法解TSP程式,自己看了好久才看懂,所以加上了更加詳細的註釋,借花獻佛了吧 實現函式 function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m

    基於分支限界法的行商問題TSP

    //分支限界法 #include<iostream> #include<algorithm> #include<cstdio> #include<queue> const int INF = 100000; const int MAX_N = 22; usin