基于粒子群优化的无约束50维Rosenbrock函数求解

一、问题重述

无约束50维的Rosenbrock函数可以描述如下:

其中, 0

要求按PSO算法思想设计一个该问题的求解算法。

Rosenbrock是一个著名的测试函数,也叫香蕉函数,其特点是该函数虽然是单峰函数,在[100,100]n上只有一个全局极小点,但它在全局极小点临近的狭长区域内取值变化极为缓慢,常用于评价算法的搜索性能。这种实优化问题非常适合于使用粒子群优化算法来求解。

二、算法

2.1算法设计:

编码

因为问题的维数为50,且可以取[-30,30]范围内的所有实数。所以每个粒子拥有速度和位置的50维的实数向量,每个x的范围都在[-30,30]。

初始化范围

根据问题要求,设定为[-30,30]。因为最大移动范围为60,我们知道,可以将最大速度设定为Vmax=60。

种群大小

查找资料说种群大小在20-40之间,这里设定总群大小n=40。

停止准则

设定为最大迭代次数1000次。当达到迭代次数时,停止运算。

惯性权重

采用固定权重0.5。惯性权重比较重要,最后在算法实现后,多测试几个权重。

学习因子

查找资料有三种说法,一种是两个学习因子相等,C1=C2=2。一种是两个学习因子不等,C1=2.8,C2=1.3。准备在算法里都试一试。

邻域拓扑结构

使用星形拓扑结构,即全局版本的粒子群优化算法。

2.2算法求解

粒子群优化的实施步骤:

第一步:初始化粒子群。产生n个粒子,每个粒子随机生成其50维向量的位置和速度。此时设置进化代数为1。

第二步:评价每一个粒子。计算每一个粒子Rosenbrock函数的值,并记录粒子历史最优解和粒子群历史最优解。

第三步:移动值。每一个粒子根据自己的历史最优解和粒子群的历史最优解设置自己的移动速度。并根据移动速度移动到下一个位置。并返回重新评价。

第四步:终止条件判断。当进化代数达到终止代数时,终止运算。输出最优解。

三、算法实现

本文使用C++进行算法实现。编写了两个类,分别是粒子类,和粒子群类。下面分别介绍两个类。

3.1粒子类

粒子类主要描述单个粒子对象。

粒子类成员主要包括:粒子维数,粒子位置,粒子速度,粒子自身历史最优解,位置限制范围,速度限制范围,学习因子,惯性权重。

粒子类函数主要包括:粒子初始化函数,粒子移动函数,粒子评价函数,粒子速度更新函数,打印函数和一些成员读取函数。

初始化函数根据给定维数,约束。随机生成d维位置和速度。

移动函数根据速度变量将粒子移动到下一个位置,并且使移动范围不超过限制范围。

粒子评价函数负责计算当前粒子所在位置Rosenbrock函数的数值,并和自身历史最优解进行比较,若小于最优解,则更新最优解。

速度更新函数根据粒子群最优解和自身最优解更新下一次运动的速度,具体公式为: 。

打印函数负责输出当前粒子的信息。粒子位置,速度和Rosenbrock函数值。

以下为粒子类的声明部分代码。

class Particle

{

protected:

int d;          //维数

//TODO:试试用智能指针写

double *x;      //粒子位置

double *v;      //粒子速度

double *bestx;  //记录最优一次位置

double value;

double bestvalue;    //记录最优值

double xmin;

double xmax;

double vmax;

double vmin;

double c1;

double c2;

double omega;

public:

Particle();

~Particle();

void print();

void init(int dsize, double min, double max);//初始化粒子,dsize是维数

void move();            //粒子移动

double UpdateValue();   //更新粒子值

void UpdateSpeed(double *bestpx, double omega);

double *getx();

};

3.2粒子群类

粒子群类描述整个粒子群对象。

粒子群类成员包括粒子数,粒子群,粒子群最优解,进化代数,粒子维数,粒子位置约束。

粒子群类函数包括初始化,寻找最优,粒子群移动,粒子群更新速度,运行,打印和访问粒子群类成员函数。

初始化函数根据给定的种群大小,粒子维数,粒子限制,最大代数生成粒子群。

寻找最优函数,函数调用每个粒子的评价函数,并且把每个粒子的最优值和粒子群的最优值做比对,若更小,则更新粒子群最优值和最优位置。

粒子群移动函数,调用每个粒子移动函数。

打印函数打印粒子群的信息,打印最优解,最优解位置,运行代数。

运行函数根据运行代数,循环执行粒子移动,寻找最优,更新速度。并且在达到最大代数使停止工作。

class PSO

{

protected:

int n;          //粒子数

Particle *p;    //粒子群

double *bestpx; //最优粒子

double bestpvalue;

int maxgen;

int gen;

int dsize;      //粒子维数

int min;        //粒子最小、最大取值范围

int max;

public:

PSO();

~PSO();

void init(int nsize, int dsize, int min, int max, int maxgen);

void print(int i);

void findbest();

void SwarmMove();

void SwarmUpdateSpeed();

void run();

double getbestpvalue();

};

3.3主函数调用

执行整个算法,主函数中需要定义一个粒子群类,并且初始化类。这里使用种群数40,例子维数50,限制[-30,30],运行代数1000来初始化对象。之后调用粒子类的运行函数即可。

四、算法评价

4.1编译和运行环境

代码使用C++进行编写,在Windows 10平台进行编译。编译平台使用VS2013,使用release方式编译可执行程序。

运行平台介绍。

软件环境:

Windows10版本1709。

硬件环境:

CPU: Intel E3-1230 V3 4核心8线程 @3.3GHz

内存:16GB DDR3 1600MHz

4.2算法运行结果

根据Rosenbrock函数的公式,可以很清楚的看出最优点为50个点均为1时,最优解为0。这里设置运行代数分别为10,100,1000,1000。各运行100次。观察计算出的最优解。时间为运行100次所用时间。

表1 计算结果

 

最小值

平均值

最大值

时间/s

n=10

2.981e+008

4.63e+008

5.82e+008

0.122

n=100

1.45e+007

5.36e+007

1.18e+008

1.06

n=1000

264.51

1.62e+006

8.00e+007

9.74

n=10000

47.23

8.00e+007

819889

27.02

可以看出,进化代数增大可以带来求解平均值下降。但是进化代数1000变为10000时,进化效果不明显。本文当前的求解结果跟查到的最优解差距较大,之后会去再寻找原因,之后可以采用变惯性系数,变学习因子的方法改进算法。

代码运行结果:

基于粒子群优化的无约束50维Rosenbrock函数求解的更多相关文章

  1. 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(二)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:Geppetto 前面我们介绍了特征选择(Feature S ...

  2. 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:Geppetto 在机器学习中,离散化(Discretiza ...

  3. 数值计算:粒子群优化算法(PSO)

    PSO 最近需要用上一点最优化相关的理论,特地去查了些PSO算法相关资料,在此记录下学习笔记,附上程序代码.基础知识参考知乎大佬文章,写得很棒! 传送门 背景 起源:1995年,受到鸟群觅食行为的规律 ...

  4. [Algorithm] 群体智能优化算法之粒子群优化算法

    同进化算法(见博客<[Evolutionary Algorithm] 进化算法简介>,进化算法是受生物进化机制启发而产生的一系列算法)和人工神经网络算法(Neural Networks,简 ...

  5. MATLAB粒子群优化算法(PSO)

    MATLAB粒子群优化算法(PSO) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.介绍 粒子群优化算法(Particle Swarm Optim ...

  6. ARIMA模型--粒子群优化算法(PSO)和遗传算法(GA)

    ARIMA模型(完整的Word文件可以去我的博客里面下载) ARIMA模型(英语:AutoregressiveIntegratedMovingAverage model),差分整合移动平均自回归模型, ...

  7. 计算智能(CI)之粒子群优化算法(PSO)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 计算智能(Computational Intelligence , ...

  8. 基于粒子群算法求解求解TSP问题(JAVA)

    一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  9. MOPSO 多目标粒子群优化算法

    近年来,基于启发式的多目标优化技术得到了很大的发展,研究表明该技术比经典方法更实用和高效.有代表性的多目标优化算法主要有NSGA.NSGA-II.SPEA.SPEA2.PAES和PESA等.粒子群优化 ...

随机推荐

  1. java开始到熟悉103-104

    本次内容:linkedlist() 此次是承接上次arraylist(),自己实现linkedlist()(内容较少) package list; /** * 自定义linkedlist类 * @au ...

  2. IO模式——同步(堵塞、非堵塞)、异步

    为什么IO模式非常重要?由于现代的计算机和操作系统的架构决定了CPU是稀缺资源,大家都要来一起竞争.而IO(特别是网络相关的IO)的速度往往较慢.所以怎样进行IO就有了多种模式,包含同步.异步.堵塞. ...

  3. Java EJB JBoss

    JBoss:JBoss是web服务器的一种,主要做EJB容器,和tomcat集成就可以jsp,servlet,ejb通吃了JBoss有两种版本,一种是独立的,一种是和tomcat集成的,当然都是免费的 ...

  4. Java内部类之间的闭包和回调详解

    前言 闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自 ...

  5. 当CSDN携手Markdown

    当CSDN携手Markdown Tags: CSDN Markdown 当CSDN携手Markdown Markdown CSDN-Markdown 也不知道是不是基于 Github 崛起的因素,Ma ...

  6. CSS伪类:before 和 :after

    CSS用了许久,对一些伪类熟视无睹,从不想着去搞清楚一下.比如说这个 :before :after 其实,:before 表示该标记前面的样式,反之 :after 代表设置后面的样式.网页上常常看到有 ...

  7. linux杂谈(十三):代理server

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/linux_player_c/article/details/24707457 1.代理server的 ...

  8. java web service

    1.编写服务代码 服务代码提供了两个函数,分别为sayHello和sayHelloToPerson,源代码如下: /* * File name: HelloService.java * * Versi ...

  9. leetcode 790. Domino and Tromino Tiling

    We have two types of tiles: a 2x1 domino shape, and an "L" tromino shape. These shapes may ...

  10. Windows程序设计(1)——Win32运行原理(一)

    CPU保护模式与Windows系统 1 Windows多任务 2 虚拟内存 3 处理器的特权级别 内核对象 1 内核对象有什么用 2 对象句柄 3 使用计数 1 CPU保护模式与Windows系统 8 ...