粒子群算法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问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 如何判断一个函数执行完成_
- 下一篇: 手机html5雪花飘落,如何使用HTML