說明信息素權重,路徑權重和信息素蒸發(fā)率對最后的結(jié)果_第1頁
說明信息素權重,路徑權重和信息素蒸發(fā)率對最后的結(jié)果_第2頁
說明信息素權重,路徑權重和信息素蒸發(fā)率對最后的結(jié)果_第3頁
說明信息素權重,路徑權重和信息素蒸發(fā)率對最后的結(jié)果_第4頁
說明信息素權重,路徑權重和信息素蒸發(fā)率對最后的結(jié)果_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、說明:信息素權重,路徑權重和信息素蒸發(fā)率對最后的結(jié)果影響很大,需要微調(diào)。 目前發(fā)現(xiàn)2 / 5 / 0.5 能達到稍微讓人滿意的效果。本程序離完美的ACO還差很遠,僅供參考。 本蟻群算法為AS算法。 用法: 1.new一個對象 ACOforTSP tsp = new ACPforTSP(tsp數(shù)據(jù)文件名,迭代次數(shù),螞蟻數(shù)量,信息素權重,路徑權重,信息素蒸發(fā)率); 2.用go()方法運行 tsp.go(); ACOforTSP.java _ import java.io.File; import static java.lang.Math.pow; import static java.lang.

2、Math.sqrt; import static java.lang.Math.random; import java.util.HashMap; import java.io.FileReader; import java.io.BufferedReader; /* * * author dvdface */ public class ACOforTSP /城市的距離表 private double distance; /距離的倒數(shù)表 private double heuristic; /啟發(fā)信息表 private double pheromone; /權重 private int alph

3、a, beta; /迭代的次數(shù) private int iterationTimes; /螞蟻的數(shù)量 private int numbersOfAnt; /蒸發(fā)率 private double rate; ACOforTSP (String file, int iterationTimes, int numbersOfAnt, int alpha, int beta, double rate) /加載文件 this.initializeData(file); /初始化參數(shù) this.iterationTimes = iterationTimes; /設置螞蟻數(shù)量 this.numbersOfA

4、nt = numbersOfAnt; /設置權重 this.alpha = alpha; this.beta = beta; /設置蒸發(fā)率 this.rate = rate; private void initializeData(String filename) /定義內(nèi)部類 class City int no; double x; double y; City(int no, double x, double y) this.no = no; this.x = x; this.y = y; private double getDistance(City city) return sqrt(

5、pow(x - city.x), 2) + pow(y - city.y), 2); try /定義HashMap保存讀取的坐標信息 HashMap<Integer, City> map = new HashMap<Integer, City>(); /讀取文件 BufferedReader reader = new BufferedReader(new FileReader(new File(filename); for (String str = reader.readLine(); str != null; str = reader.readLine() /將讀到

6、的信息保存入HashMap if (str.matches("(0-9+)(s*)(0-9+)(.?)(0-9*)(s*)(0-9+)(.?)(0-9*)") String data = str.split("(s+)"); City city = new City(Integer.parseInt(data0), Double.parseDouble(data1), Double.parseDouble(data2); map.put(city.no, city); /分配距離矩陣存儲空間 distance = new doublemap.size()

7、 + 1map.size() + 1; /分配距離倒數(shù)矩陣存儲空間 heuristic = new doublemap.size() + 1map.size() + 1; /分配信息素矩陣存儲空間 pheromone = new doublemap.size() + 1map.size() + 1; for (int i = 1; i < map.size() + 1; i+) for (int j = 1; j < map.size() + 1; j+) /計算城市間的距離,并存入距離矩陣 distanceij = map.get(i).getDistance(map.get(j

8、); /計算距離倒數(shù),并存入距離倒數(shù)矩陣 heuristicij = 1 / distanceij; /初始化信息素矩陣 pheromoneij = 1; catch (Exception exception) System.out.println("初始化數(shù)據(jù)失??!"); class Ant /已訪問城市列表 private boolean visited; /訪問順序表 private int tour; /已訪問城市的個數(shù) private int n; /總的距離 private double total; Ant() /給訪問順序表分配空間 tour = new i

9、ntdistance.length+1; /已存入城市數(shù)量為n,剛開始為0 n = 0; /將起始城市1,放入訪問結(jié)點順序表第一項 tour+n = 1; /給已訪問城市結(jié)點分配空間 visited = new booleandistance.length; /第一個城市為出發(fā)城市,設置為已訪問 visitedtourn = true; private int chooseCity() /用來random的隨機數(shù) double m = 0; /獲得當前所在的城市號放入j,如果和j相鄰的城市沒有被訪問,那么加入m for (int i = 1, j = tourn; i < pheromo

10、ne.length; i+) if (!visitedi) m += pow(pheromoneji, alpha) * pow(heuristicji, beta); /保存隨機到的數(shù) double p = m * random(); /尋找被隨機到的城市 double k = 0; /保存找到的城市 int q = 0; for (int i = 1, j = tourn; k < p; i+) if (!visitedi) k += pow(pheromoneji, alpha) * pow(heuristicji, beta); q = i; return q; private

11、void constructSolution () while (n != (distance.length-1) ) /選取下一個城市 int p = chooseCity(); /計算總的距離 total += distancetournp; /將選取到的城市放入已訪問列表 tour+n = p; /將選取到的城市標記為已訪問 visitedp = true; /回到起點 total += distancetour1tourn; /將起點加入訪問順序表的最后 tour+n = tour1; private void releasePheromone() /釋放信息素的大小 double t

12、 = 1/total; /釋放信息素 for (int i=1;i<tour.length-1;i+) pheromonetouritouri+1 += t; pheromonetouri+1touri += t; public void go() /保存最好的路徑和路徑長度 double bestTotal = Double.MAX_VALUE; int bestTour = new intdistance.length+1; /新建螞蟻數(shù)組,用來引用所創(chuàng)建的螞蟻 Ant ant = new AntnumbersOfAnt; /進行iterationTimes次迭代 while (it

13、erationTimes != 0) /初始化新的一批螞蟻(這里用構(gòu)造新的螞蟻代替重置螞蟻狀態(tài)) for (int i=0; i<numbersOfAnt; i+) anti = new Ant(); /進行一次迭代(即讓所有的螞蟻構(gòu)建一條路徑) for (int i=0; i<numbersOfAnt; i+) anti.constructSolution(); /如果螞蟻構(gòu)建的路徑長度比上次最好的還好,那么保存這個長度和它所走的路徑 if (anti.total<bestTotal) bestTotal = anti.total; System.arraycopy(ant

14、i.tour, 1, bestTour, 1, bestTour.length-1); /蒸發(fā)信息素 evaporatePheromone(); /釋放信息素 for (int i=0; i<numbersOfAnt; i+) anti.releasePheromone(); /報告本次迭代的信息 System.out.format("本次為倒數(shù)第%d次迭代,當前最優(yōu)路徑長度為%10.2fn",iterationTimes,bestTotal); /迭代總數(shù)減去1,進行下次迭代 iterationTimes-; /輸出最好的路徑長度 System.out.format("得到的最優(yōu)的路徑長度為:%10.2fn",bestTotal); /輸出最好的路徑 System.out.println("最優(yōu)路徑如下:"); for

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論