粒子群优化算法(C语言版本)

前言

  经历两小时,终于用C语言写完了算法,真是不容易。已经将近一年多没摸过C语言了,很多都忘了,之前计算机网络课的大作业CSMA-CD协议算法模拟因为要用C语言所以用了两天的空闲时间重新学了一遍C语言(仅仅学到了指针截止),现在也是很多不记得了,写的比较丑陋。希望大家不要笑话。之前本想用JS写的但是不好调试什么的,所以还是用了C语言。(附加一句:物联网专业真的好坑,大二最好就自学号JAVA或者C++不然大三真的比较老火.)

粒子群优化算法简介

&emm oniziranjiesp; 粒子群优化算法是进化计算的一个分支,是一种模拟自然界的生物活动的随机搜索算法。PSO(粒子群优化算法)模拟了自然界鸟群捕食和鱼群捕食的过程。它是1995年由美国学者Eberhat和Kennedy提出的,现在已经广泛应用于各种工程领域的优化问题之中。

核心

  • 速度与位置更新公式
  • 速度与位置更新公式

$$ v_i^d =wv_i^d+c_1r_1d*({pBest_id-x_id})+c_2*r_2d*({gBest_id-x_id}) $$
$$ x_i^d =x_id+v_id $$

基本流程

  • 初始化
  • 更新
  • 迭代
  • 满足条件后停止

源程序

用例

已知函数$ y=f(x_1,x_2)=x_12+x_22 $,其中$ -10<={ x_1,x_2 }<=10 $,用粒子群优化算法求解y的最小值。

源程序

/*******************************************************************************
*
*                    粒子群优化算法
*--------------------------------------------------------------------------------
* 算法题目       : 例题5.1
* 算法说明       :w是惯量权重,一般取0-1之间数字,这儿取0.5
*                  c1,c2为加速系数,通常取固定值2.0
*                  r1,r2为[0-1]随机数
* 注意             :对于越界的位置需要进行合法性的调整

                求最小值则只需要对函数f进行改动以及204行的update sum计算进行改动。
                如果求最大值,则不仅仅改动上述过程,还包括64行的判断以及204行的判断

                改动x域值则只需要手动输入,改变群体只需要define N 群体数
*******************************************************************************/

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define N 3


/********************************************************************
*函数名:init_helper()
*函数功能:初始化辅助函数
*函数输入:unsigned top ,unsigned bottom  上边界,下边界
*输出:无
**********************************************************************************/

void init_helper(int top,int bottom,float arr[N][6]) //位置 速度 个人历史最好位置6个数(x,y)形式
{

    int i,j;

    srand((unsigned)time(NULL));

    for(i = 0;i10)
                particle[i][j+k]=10;
            else if(particle[i][j+k]<-10)
            particle[i][j+k]=-10;
        }


        // 更新位置
        particle[i][0]+=particle[i][j];
        particle[i][1]+=particle[i][j+1];

         // 对越界数进行处理,大于大边界取top,小于下边界取bottom
        for(k=0;k<2;k++)
        {
            if(particle[i][k]>10)
                particle[i][k]=10;
            else if(particle[i][k]<-10)
            particle[i][k]=-10;
        }

   }
    printf("更新后位置速度为,此时个人历史最优尚未更新\n");
    for(i=0;i

注:以上为本人原创,转载请注明出处,谢谢。

你可能感兴趣的:(粒子群优化算法(C语言版本))