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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/7/23 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 粒子群算法tsp java_粒子群算法解决TSP问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 粒子群算法簡(jiǎn)介

粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,屬于進(jìn)化算法的一種,是通過(guò)對(duì)模擬鳥(niǎo)群撲食行為設(shè)計(jì)的。

基本思想:

從隨機(jī)解出發(fā),通過(guò)迭代尋找最優(yōu)解,通過(guò)適應(yīng)度來(lái)評(píng)價(jià)解的品質(zhì)。

場(chǎng)景設(shè)定 :

一群鳥(niǎo)在隨機(jī)搜索食物。在這個(gè)區(qū)域里只有一塊食物。所有的鳥(niǎo)都不知道食物在那里。但是他們知道當(dāng)前的位置離食物還有多遠(yuǎn)。那么找到食物的最優(yōu)策略是什么呢。最簡(jiǎn)單有效的就是搜尋目前離食物最近的鳥(niǎo)的周?chē)鷧^(qū)域。

粒子群算法的幾個(gè)概念

粒子:場(chǎng)景中的一只鳥(niǎo);

種群:場(chǎng)景中的一群鳥(niǎo);

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

速度:鳥(niǎo)的飛行速度,粒子的移動(dòng)速度;

適應(yīng)度:鳥(niǎo)距離食物遠(yuǎn)近,粒子距離目標(biāo)的評(píng)價(jià)。

2. 算法分析

算法流程

粒子群算法流程.png

流程描述

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

2. 計(jì)算每個(gè)粒子的適應(yīng)度值;

3. 通過(guò)當(dāng)前適應(yīng)度值是pBest(當(dāng)前粒子的歷代最佳值)和gBest(種群的歷代最佳值)進(jìn)行對(duì)比,來(lái)更新當(dāng)前粒子的速度和位置;

4. 判斷是否滿(mǎn)足退出條件(達(dá)到迭代次數(shù)或者最優(yōu)解的誤差滿(mǎn)足設(shè)定的閾值),若不滿(mǎn)足則轉(zhuǎn)向 2.

速度與位置的更新

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

速度更新

速度更新公式

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

速度更新的三部分解讀

w*v : 慣性保持部分,粒子沿著當(dāng)前的速度和方向慣性飛行,不會(huì)偏移。假如沒(méi)有慣性部分,粒子會(huì)很快向pBest和gBest移動(dòng),很容易陷入局部最優(yōu)。有了慣性,粒子就會(huì)有在空間中自由飛行的趨勢(shì),能夠在整個(gè)空間尋找最優(yōu)解。

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

c2*rand()*(gBest-postion):社會(huì)認(rèn)知部分,粒子有向種群中最好位置學(xué)習(xí)的意愿。假如沒(méi)有社會(huì)認(rèn)知部分,所有的粒子都向各自的pBest移動(dòng),各自陷入自身的最優(yōu)解,從而導(dǎo)致整個(gè)過(guò)程不收斂。

位置更新

位置更新公式

3. TSP問(wèn)題

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

TSP問(wèn)題是一個(gè)組合優(yōu)化問(wèn)題, 是一個(gè)NPC問(wèn)題,分為兩類(lèi): 一類(lèi)是對(duì)稱(chēng)TSP問(wèn)題(Symmetric TSP),另一類(lèi)是非對(duì)稱(chēng)問(wèn)題(Asymmetric TSP)。

4. 粒子群算法解決TSP問(wèn)題

算法的實(shí)現(xiàn)

粒子的表示:TSP問(wèn)題的一個(gè)解為一個(gè)序列,可以表示為一個(gè)粒子;

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

適應(yīng)度函數(shù)的定義: 當(dāng)前序列的路徑長(zhǎng)度即為適應(yīng)度值,通過(guò)經(jīng)緯度坐標(biāo)計(jì)算。

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

Java代碼實(shí)現(xiàn)

速度和位置的更新

更新公式: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<>();

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

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

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

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

}

//第二部分:自我認(rèn)知部分,和當(dāng)前粒子中出現(xiàn)最好的結(jié)果比較,得出交換序列

//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));

}

//第三部分:社會(huì)認(rèn)知部分,和全局最優(yōu)的結(jié)果比較,得出交換序列

//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);

//執(zhí)行交換,生成下一個(gè)粒子

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

}

//更新適應(yīng)度的值

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;

}

}

}

}

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。