粒子群演算法是由鳥類覓食啟發而來,鳥類會朝著食物豐盛的地方移動,鳥類移動的指導思想有兩點。1是每只鳥自身的移動過程中記下了自己曾遇到過的最好的食物所在的位置。2是整個鳥群中的鳥類在覓食過程中會交流自己所遇到的最好食物所在位置,會通知其他鳥過來。這兩點就是鳥類的移動規則。
有了基本思想,那鳥類覓食過程中的移動方式也就是優化演算法的迭代公式被總結如下:
v(i+1) = w * v(i) + c1 * rand(0, 1) * (pbest - x(i)) + c2 * rand(0, 1) * (gbest - x(i))
x(i + 1) = x(i) + v(i + 1)
w = (wini - wend) * (gk - g) / gk + wend
v 代表了鳥個體的移動方向和移動距離,x 代表了鳥個體所處的位置。
式1中,是鳥速度和方向的更新公式。w 是慣性因子,用式3計算。c1, c2是學習因子,通常都等於2。rand(0, 1) 是 (0, 1) 之間的隨機數。pbest 是鳥個體歷史移動過程中的最優位置,和x同型別。gbest 是整個鳥群的位置最優值,和 x 同型別。
式2中,是鳥位置的更新公式。
式3中,是2慣性因子的更新公式。wini 是初始慣性權值,一般取0.9。wend 是迭代之最大代數時的慣性權值,一般取0.4。gk 是最大迭代代數。g 是當前迭代代數。
演算法流程:
根據基本思想和移動公式,抽象出鳥類個體資料結構和演算法引數結構:
struct particle
;struct psopara
;
以計算函式 f(x) = x1 ^ 2 + x2 ^ 2 的最小值為例,設計**如下:
初始化種群
/* func: 初始化種群
* argu: 種群大小
* retu: 種群陣列
* date: 2019-11-29
*/struct particle *
particle_init
(int n)
return p;
}
粒子更新
/* func: 粒子更新
* argu: 引數,粒子,迭代代數
* retu: 無,以傳位址的方式對粒子進行更新
* date: 2019-11-29
*/void
mypso_x_v_type
(struct psopara *pp,
struct particle *pt,
int g)
}
全域性極值計算
/* func: 更新全域性極值
* argu: 種群陣列
* retu: 無,以傳位址的方式改變全域性極值
* date: 2019-11-29
*/void
mypso_gbest
(struct psopara *pp,
struct particle *pt)
}// mypso_display_fitness(pp->g, pp->f);
}
適應度計算
/* func: 計算適應度函式
* argu: 位置
* retu: 適應度
* date: 2019-11-29
*/fitness mypso_cal_fitness
(xtype x)
主迴圈
int
main
(int argc,
char
const
*ar**)
mypso_gbest
(&pp, pt)
;mypso_display_fitness
(pp.g, pp.f, i);}
mypso_end
(pt)
;return0;
}
實驗結果
共迭代一百次,90代左右找到全域性最優值。
參考:link.
C語言實現粒子群演算法 PSO 一
最近在溫習c語言,看的書是 c primer plus 忽然想起來以前在參加數學建模的時候,用過的一些智慧型演算法,比如遺傳演算法 粒子群演算法 蟻群演算法等等。當時是使用matlab來實現的,而且有些matlab自帶了工具箱,當時有些只是利用工具箱求最優解問題,沒有自己動手親自去實現一遍,現在都忘...
粒子群演算法 C 語言的實現
最近開始重新學習c語言,在研究生期間,坐在dspa實驗室編寫了基本的粒子群演算法,當時是matlab語言實現的,相對而言比較簡單,c語言是比較原始的基礎性的語言,所以執行速度是非常快的,因此貼上c實現基本粒子群演算法的程式,有不對的地方請指教。particle swarm algorithm aut...
C語言 粒子群演算法(PSO)
for int i 0 ifor int j 0 j0,1 population i his best j population i location j c2 randvar 0,1 global best j population i location j population i locati...