粒子群优化算法

来源

  1. 粒子群优化算法是一种基于种群寻优的启发式搜索算法。在1995年由Kennedy 和Eberhart 首先提出来的。
  2. 它的主要启发来源于对鸟群群体运动行为的研究。我们经常可以观察到鸟群表现出来的同步性,虽然每只鸟的运动行为都是互相独立的,但是在整个鸟群的飞行过程中却表现出了高度一致性的复杂行为,并且可以自适应的调整飞行的状态和轨迹。
  3. 鸟群具有这样的复杂飞行行为的原因,可能是因为每只鸟在飞行过程中都遵循了一定的行为规则,并能够掌握邻域内其它鸟的飞行信息。

    模型

  4. 粒子群优化算法借鉴了这样的思想,每个粒子代表待求解问题搜索解空间中的一个潜在解,它相当于一只鸟,“飞行信息”包括粒子当前的位置和速度两个状态量。
  5. 每个粒子都可以获得其邻域内其它个体的信息,对所经过的位置进行评价,并根据这些信息和位置速度更新规则,改变自身的两个状态量,在“飞行”过程中传递信息和互相学习,去更好地适应环境。
  6. 随着这一过程的不断进行,粒子群最终能够找到问题的近似最优解。

    适用

    连续解空间的优化问题求解
    数值优化问题
    问题描述

    例子

    粒子群优化算法求解函数f(x)=x^3-5x^2-2x+3在[-2,5]的最大值

java源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class Pos {
public static void main(String args[])
{
Pos pos=new Pos();
pos.Initialize();
pos.Search();
}
public void Initialize()
{
for(int i=0;i<PosNum;i++)
{
if(i<PosNum*2/7)
p_pos[i]=(random.nextDouble()-1)*2;
else
p_pos[i]=random.nextDouble()*5;
p_v[i]=p_best[i]=p_pos[i];
if(function(g_best)<function(p_best[i]))
{
g_best=p_best[i];
}
}
}
public void Search()
{
for(int j=0;j<step;j++) //迭代
{
for(int i=0;i<PosNum;i++) //更新
{
p_v[i]=w*p_v[i]+c1*random.nextDouble()*(p_best[i]-p_pos[i])+c2*random.nextDouble()*(g_best-p_pos[i]);
if(-2<(p_pos[i]+p_v[i])&&(p_pos[i]+p_v[i])<5)
p_pos[i]+=p_v[i];
if(function(p_best[i])<function(p_pos[i]))
{
p_best[i]=p_pos[i];
}
if(function(g_best)<function(p_best[i]))
{
g_best=p_best[i];
}
System.out.print(p_pos[i]+" ");
}
System.out.println(" ");
}
System.out.println(g_best+" "+function(g_best));
}
public double function(double x)
{
double y=x*x*x-5*x*x-2*x+3;
return y;
}

private final int step=10000; //迭代次数
private final int PosNum=70; //粒子数
private final double w=0.9;//惯性权重
private final double c1=2;//局部权重参数
private final double c2=2;//全局权重参数

private double g_best; //全局最优解
private double p_best[]=new double[PosNum];;//粒子本身历史最优解
private double[] p_v=new double[PosNum];;//粒子速度
private double[] p_pos=new double[PosNum];//粒子位置

private Random random=new Random();
}

Contents
  1. 1. 来源
  2. 2. 模型
  3. 3. 适用
  4. 4. 例子
|