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

摘要:
#include“stdio.h”#include“tdlib.h”#include“time.h”#include“math.h”constantNUM=40;//组成的粒子数DIM=30//维度constdoublec1=1.8//参数constdoublec2=1.8///参数doublexmin=-100.0///位置doublexmax的下限=100.0///位置duo的上限

#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 ", gbestf);

}

免责声明:文章转载自《超简洁的随机粒子群算法(PSO)程序(C/C++)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tomcat以服务形式开机启动Delphi中Indy 10的安装和老版本的卸载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

机器学习sklearn(四十):算法实例(九)回归(二)随机森林回归器 RandomForestRegressor

class sklearn.ensemble.RandomForestClassifier(n_estimators=’10’, criterion=’gini’, max_depth=None,min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_featur...

vb6如何将MSHFlexGrid控件中的内容导出为Excel

首先的是是准备工作 需要引用 Microsoft Excel 11.0 Object Library 需要添加控件Mircrosoft Hierarchical FlexGrid Control 6.0(SP4) (OLEDB) 我们来看一下代码 Private Sub cmdOut_Click() Dim xlApp As Object Dim...

R语言基础-数组和列表

数组(array) 一维数据是向量,二维数据是矩阵,数组是向量和矩阵的直接推广,是由三维或三维以上的数据构成的. 数组函数是array(),语法是:array(dadta, dim),当中data必须是同一类型的数据。dim是各维的长度组成的向量。 1、产生一个三维和四维数组。 例1:xx <- array(1:24, c(3, 4,...

ML基础06-数据不平衡问题

0、什么是数据不平衡问题 在机器学习的分类问题中,不同类别的样本数据量存在差异。在某些场景,比如网页点击率预估(网页点击率低),购物推荐(浏览产生的购买少),信用卡欺诈,网络攻击识别等,这种差异可能会较大。传统的学习算法,对不同类别的数据一视同仁地处理,会产生在多数类样本效果较好,但是在少数类样本上效果差的问题。而在上述的四种场景中,我们更关注的是少数类的...

java.security KeyPairGenerator

KeyPairGenerator 类用于生成公钥和私钥对。密钥对生成器是使用 getInstance 工厂方法(返回一个给定类的实例的静态方法)构造的。 特定算法的密钥对生成器可以创建能够与此算法一起使用的公钥/私钥对。它还可以将特定于算法的参数与每个生成的密钥关联。 有两种生成密钥对的方式:与算法无关的方式和特定于算法的方式。两种方式的唯一区别在于对象的...

Logistic模型原理详解以及Python项目实现

此文转载自:https://blog.csdn.net/master_hunter/article/details/111158447#commentBox 目录 前言 一、Logistic回归模型 二、Logit模型 三、几率 四、Logistic模型 五、基于最优化方法的最佳回归系数确定 5.1梯度上升算法 5.1.1梯度 5.1.2使用梯度上升找到最...