粒子群算法tsp java_粒子群算法解决TSP问题
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)題。
- 上一篇: python 如何判断一个函数执行完成_
- 下一篇: 如何侦听网线数据_网络工程师 | 七类网