标准粒子群优化算法 PSO
1、基本思想
粒子群算法通過設計一種無質量的粒子來模擬鳥群中的鳥,粒子僅具有兩個屬性:速度和位置,速度代表移動的快慢,位置代表移動的方向。每個粒子在搜索空間中單獨的搜尋最優解,并將其記為當前個體極值,并將個體極值與整個粒子群里的其他粒子共享,找到最優的那個個體極值作為整個粒子群的當前全局最優解,粒子群中的所有粒子根據自己找到的當前個體極值和整個粒子群共享的當前全局最優解來調整自己的速度和位置。下面的動圖很形象地展示了PSO算法的過程:
2、更新規則
PSO初始化為一群隨機粒子(隨機解)。然后通過迭代找到最優解。在每一次的迭代中,粒子通過跟蹤兩個“極值”(pbest,gbest)來更新自己。在找到這兩個最優值后,粒子通過下面的公式來更新自己的速度和位置。?
基本粒子群優化算法中的的更新是基于等式(1)和等式(2),等式(1)根據每個粒子
公式(1)的第一部分稱為【記憶項】,表示上次速度大小和方向的影響;公式(1)的第二部分稱為【自身認知項】,是從當前點指向粒子自身最好點的一個矢量,表示粒子的動作來源于自己經驗的部分;公式(1)的第三部分稱為【群體認知項】,是一個從當前點指向種群最好點的矢量,反映了粒子間的協同合作和知識共享。粒子就是通過自己的經驗和同伴中最好的經驗來決定下一步的運動。以上面兩個公式為基礎,形成了PSO的標準形式。
3、PSO算法的流程和偽代碼
4、PSO算法舉例
5、PSO算法的demo
#include <iostream> #include <vector> #include <cmath> #include <map> #include <algorithm> #include <random> #include <ctime> #include <Eigen/Dense> using namespace Eigen; using namespace std;const int dim = 1;//維數 const int p_num = 10;//粒子數量 const int iters = 100;//迭代次數 const int inf = 999999;//極大值 const double pi = 3.1415; //定義粒子的位置和速度的范圍 const double v_max = 4; const double v_min = -2; const double pos_max = 2; const double pos_min = -1; //定義位置向量和速度向量 vector<double> pos; vector<double> spd; //定義粒子的歷史最優位置和全局最優位置 vector<double> p_best; double g_best; //使用eigen庫定義函數值矩陣和位置矩陣 Matrix<double, iters, p_num> f_test; Matrix<double, iters, p_num> pos_mat;//定義適應度函數 double fun_test(double x) {double res = x * x + 1;return res; }//初始化粒子群的位置和速度 void init() {//矩陣中所有元素初始化為極大值f_test.fill(inf);pos_mat.fill(inf);//生成范圍隨機數static std::mt19937 rng;static std::uniform_real_distribution<double> distribution1(-1, 2);static std::uniform_real_distribution<double> distribution2(-2, 4);for (int i = 0; i < p_num; ++i){pos.push_back(distribution1(rng));spd.push_back(distribution2(rng));}vector<double> vec;for (int i = 0; i < p_num; ++i){auto temp = fun_test(pos[i]);//計算函數值//初始化函數值矩陣和位置矩陣f_test(0, i) = temp;pos_mat(0, i) = pos[i];p_best.push_back(pos[i]);//初始化粒子的歷史最優位置}std::ptrdiff_t minRow, minCol;f_test.row(0).minCoeff(&minRow, &minCol);//返回函數值矩陣第一行中極小值對應的位置g_best = pos_mat(minRow, minCol);//初始化全局最優位置 }void PSO() {static std::mt19937 rng;static std::uniform_real_distribution<double> distribution(0, 1);for (int step = 1; step < iters; ++step){for (int i = 0; i < p_num; ++i){//更新速度向量和位置向量spd[i] = 0.5 * spd[i] + 2 * distribution(rng) * (p_best[i] - pos[i]) +2 * distribution(rng) * (g_best - pos[i]);pos[i] = pos[i] + spd[i];//如果越界則取邊界值if (spd[i] < -2 || spd[i] > 4)spd[i] = 4;if (pos[i] < -1 || pos[i] > 2)pos[i] = -1;//更新位置矩陣pos_mat(step, i) = pos[i];}//更新函數值矩陣for (int i = 0; i < p_num; ++i){auto temp = fun_test(pos[i]);f_test(step, i) = temp;}for (int i = 0; i < p_num; ++i){MatrixXd temp_test;temp_test = f_test.col(i);//取函數值矩陣的每一列std::ptrdiff_t minRow, minCol;temp_test.minCoeff(&minRow, &minCol);//獲取每一列的極小值對應的位置p_best[i] = pos_mat(minRow, i);//獲取每一列的極小值,即每個粒子的歷史最優位置}g_best = *min_element(p_best.begin(), p_best.end());//獲取全局最優位置}cout << fun_test(g_best); }int main() {init();PSO();system("pause");return 0; }?
總結
以上是生活随笔為你收集整理的标准粒子群优化算法 PSO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下生成源程序控制流图,Linu
- 下一篇: 初识SolrJ开发, schema.xm