超简洁的随机粒子群算法(PSO)程序(C/C++)

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

#include"math.h"

 

const int NUM=40;//粒子数

const int DIM=30;//维数

const double c1=1.8;//参数

const double c2=1.8;//参数

 

double xmin=-100.0;//位置下限

double xmax=100.0;//位置上限

double gbestx[DIM];//全局最优位置

double gbestf;//全局最优适应度

 

struct particle {//定义一个粒子

    double x[DIM];//当前位置矢量

    double bestx[DIM];//历史最优位置

    double f;//当前适应度

    double bestf;//历史最优适应度

}swarm[NUM];//定义粒子群

 

#define randf ((rand()%10000+rand()%10000*10000)/100000000.0) //产生-1随机浮点数

double f1(double x[]) {//测试函数:超球函数

    float z=0;              

    for(int i=0;i<DIM;i++)

        z+=(x[i])*(x[i]);

    return z;

}

 

void main() {

    for(int i=0; i<DIM; i++)//初始化全局最优

        gbestx[i]=randf*(xmax-xmin)+xmin;

    gbestf=100000000000000.0;

    for(int i=0; i<NUM; i++) {//初始化粒子群

        particle* p1=&swarm[i];

        for(int j=0; j<DIM; j++)

            p1->x[j]=randf*(xmax-xmin)+xmin;

        p1->f=f1(p1->x);

        p1->bestf=100000000000000.0;

    }

    for(int t=0; t<5000; t++) {

        for(int i=0; i<NUM; i++) {

            particle* p1=&swarm[i];

            for(int j=0; j<DIM; j++)//进化方程

                p1->x[j]+=c1*randf*(p1->bestx[j]-p1->x[j])

                +c2*randf*(gbestx[j]-p1->x[j]);

            p1->f=f1(p1->x);

            if(p1->f<p1->bestf) {//改变历史最优

                for(int j=0;j<DIM;j++)

                    p1->bestx[j]=p1->x[j];

                p1->bestf=p1->f;

            }

            if(p1->f<gbestf) {//改变全局最优

                for(int j=0;j<DIM;j++)

                    gbestx[j]=p1->x[j];

                for(int j=0; j<DIM; j++)//把当前全局最优的粒子随机放到另一位置

                    p1->x[j]=randf*(xmax-xmin)+xmin;

                gbestf=p1->f;

            }

        }

    }

    printf("%g\n", gbestf);

}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值