日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

粒子群算法tsp java_粒子群算法解决TSP问题

發布時間:2024/7/23 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 粒子群算法tsp java_粒子群算法解决TSP问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 粒子群算法簡介

粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,屬于進化算法的一種,是通過對模擬鳥群撲食行為設計的。

基本思想:

從隨機解出發,通過迭代尋找最優解,通過適應度來評價解的品質。

場景設定 :

一群鳥在隨機搜索食物。在這個區域里只有一塊食物。所有的鳥都不知道食物在那里。但是他們知道當前的位置離食物還有多遠。那么找到食物的最優策略是什么呢。最簡單有效的就是搜尋目前離食物最近的鳥的周圍區域。

粒子群算法的幾個概念

粒子:場景中的一只鳥;

種群:場景中的一群鳥;

位置:粒子(鳥)所在的位置;

速度:鳥的飛行速度,粒子的移動速度;

適應度:鳥距離食物遠近,粒子距離目標的評價。

2. 算法分析

算法流程

粒子群算法流程.png

流程描述

1.首先隨機生成粒子,并組成種群;其中粒子的數量及種群的大小可以控制;

2. 計算每個粒子的適應度值;

3. 通過當前適應度值是pBest(當前粒子的歷代最佳值)和gBest(種群的歷代最佳值)進行對比,來更新當前粒子的速度和位置;

4. 判斷是否滿足退出條件(達到迭代次數或者最優解的誤差滿足設定的閾值),若不滿足則轉向 2.

速度與位置的更新

粒子群算法的核心就是每個粒子位置和速度的更新

速度更新

速度更新公式

v:粒子當前的速度; w是慣性因子; position是粒子當前的位置; pBest是當前粒子歷代最好的位置;gBest是種群中當前最好的位置; c1和c2 是學習因子,分別是向pBest和gBest學習。

速度更新的三部分解讀

w*v : 慣性保持部分,粒子沿著當前的速度和方向慣性飛行,不會偏移。假如沒有慣性部分,粒子會很快向pBest和gBest移動,很容易陷入局部最優。有了慣性,粒子就會有在空間中自由飛行的趨勢,能夠在整個空間尋找最優解。

c1*rand()*(pBest-position):自我認知部分,粒子有回到自身歷代最好位置的意愿。假如沒有自我認知部分,粒子將很快向gBest移動,很容易陷入局部最優。

c2*rand()*(gBest-postion):社會認知部分,粒子有向種群中最好位置學習的意愿。假如沒有社會認知部分,所有的粒子都向各自的pBest移動,各自陷入自身的最優解,從而導致整個過程不收斂。

位置更新

位置更新公式

3. TSP問題

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

TSP問題是一個組合優化問題, 是一個NPC問題,分為兩類: 一類是對稱TSP問題(Symmetric TSP),另一類是非對稱問題(Asymmetric TSP)。

4. 粒子群算法解決TSP問題

算法的實現

粒子的表示:TSP問題的一個解為一個序列,可以表示為一個粒子;

速度的表示:用一個序列的交換序列表示粒子的速度。

適應度函數的定義: 當前序列的路徑長度即為適應度值,通過經緯度坐標計算。

慣性因子的定義:自身的交換序列即慣性因子

Java代碼實現

速度和位置的更新

更新公式:Vii=wVi+ra(Pid-Xid)+rb(Pgd-Xid)

private void evolution() {

for (int t = 0; t < MAX_GEN; t++) {

for (int k = 0; k < scale; k++) {

ArrayList vii = new ArrayList<>();

//第一部分:慣性保持部分,自身交換對

int len = (int) (w * listV.get(k).size());

for (int i = 0; i < len; i++) {

vii.add(listV.get(k).get(i));

}

//第二部分:自我認知部分,和當前粒子中出現最好的結果比較,得出交換序列

//ra(Pid-Xid)

ArrayList a = minus(mUnits.get(k).getPath(), Pd.get(k).getPath());

float ra = random.nextFloat();

len = (int) (ra * a.size());

for (int i = 0; i < len; i++) {

vii.add(a.get(i));

}

//第三部分:社會認知部分,和全局最優的結果比較,得出交換序列

//rb(Pgd-Xid)

ArrayList b = minus(mUnits.get(k).getPath(), Pgd.getPath());

float rb = random.nextFloat();

len = (int) (rb * b.size());

for (int i = 0; i < len; i++) {

vii.add(b.get(i));

}

listV.remove(0);

listV.add(vii);

//執行交換,生成下一個粒子

exchange(mUnits.get(k).getPath(), vii);

}

//更新適應度的值

for (int i = 0; i < scale; i++) {

mUnits.get(i).upDateFitness();

if (Pd.get(i).getFitness() > mUnits.get(i).getFitness()) {

Pd.put(i, mUnits.get(i));

}

if (Pgd.getFitness() > Pd.get(i).getFitness()) {

Pgd = Pd.get(i);

bestT = t;

}

}

}

}

總結

以上是生活随笔為你收集整理的粒子群算法tsp java_粒子群算法解决TSP问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。