标准粒子群算法的简易实现。

标准粒子群算法的简易实现。

http://blog.csdn.net/laviewpbt/article/details/4224731

    设想这样一个场景:一群鸟在随机的搜索食物。在这个区域里只有一块食物,所有的鸟都不知道食物在那。但是它们知道自己当前的位置距离食物还有多远。

那么找到食物的最优策略是什么?

 

最简单有效的就是搜寻目前离食物最近的鸟的周围区域。

 

    那么在粒子群算法中鸟被抽象为没有质量和体积的微粒(点),并延伸到N维空间,粒子I 在N维空间的位置表示为矢量Xi=(x1,x2,…,xN),飞行速度表示为矢量Vi=(v1,v2,…,vN).每个粒子都有一个由目标函数决定的适应值(fitness value),并且知道自己到目前为止发现的最好位置(pbest)和现在的位置Xi.这个可以看作是粒子自己的飞行经验.除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好位置(gbest)(gbest是pbest中的最好值).这个可以看作是粒子同伴的经验.粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。  

     

具体的算法过程可以参考相关书籍。

扫描二维码关注公众号,回复: 13121391 查看本文章

 我们以一个简单的求最大值的过程来用代码描述上述算法的实现过程:

Option Explicit
Option Base 1

'程序实现功能:标准粒子群算法
'作    者: laviewpbt
'联系方式: [email protected]
'QQ:33184777
'版本:Version 1.1.0
'说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议

 种群大小
Private Dimensions          As Long         '维数
Private InitInertia         As Double       '初始惯性权重
Private CurrentInertia      As Double       '当前的惯性
Private MaxVelocity         As Double       '容许的最大速度
Private MaxIter             As Long         '最多迭代次数
Private MinError            As Double       '当系统到达这个误差时自动停止
Private LocalSize           As Long         '领域范围的大小


Private PopSize             As Long         '

Private CurrentIter         As Long         ' Number of iterations

Private Position()          As Double       ' 每个粒子的位置数组
Private Velocity()          As Double       ' 每个例子的速度
Private BestPosition()      As Double       ' 每个粒子之前的最好的位置
Private Adaptability()      As Double       ' 每个粒子当前的适应度
Private BestAdaptability()  As Double       ' 每个粒子在迭代中的最佳适应值
Private SubjectTo()         As Double
Private GlobalBest          As Long         '全局最佳的粒子的索引
Private localBest           As Long         '局部最佳粒子的索引

 

Private Sub Form_load()
    Dim i               As Long
    Dim j               As Long
    Dim k               As Long
    
    MaxIter = 100
    MaxVelocity = 2
    InitInertia = 0.9
    PopSize = 10
    Dimensions = 2
    ReDim Position(PopSize, Dimensions) As Double
    ReDim Velocity(PopSize, Dimensions) As Double
    ReDim BestPosition(PopSize, Dimensions) As Double
    ReDim Adaptability(PopSize) As Double
    ReDim BestAdaptability(PopSize) As Double
    
    ReDim SubjectTo(3, 2) As Double
    SubjectTo(1, 1) = 0
    SubjectTo(1, 2) = 12.1
    SubjectTo(2, 1) = 4.1
    SubjectTo(2, 2) = 5.8

 
    Randomize
    For i = 1 To PopSize
        For j = 1 To Dimensions
            Position(i, j) = Int(Rnd * (SubjectTo(j, 2) - SubjectTo(j, 1) + 1)) + SubjectTo(j, 1)
            BestPosition(i, j) = Position(i, j)
            Velocity(i, j) = Rnd * MaxVelocity
        Next
    Next
    
    For k = 1 To MaxIter
        CurrentInertia = ((InitInertia - 0.4) * (MaxIter - k) / MaxIter) + 0.4  '学习惯性
        For i = 1 To PopSize
            Adaptability(i) = 21.5 + Position(i, 1) * Sin(4 * Position(i, 1) * 3.14) + Position(i, 2) * Sin(20 * Position(i, 2) * 3.14)
            
            If k = 1 Then                                       '如果是第一次迭代
                BestAdaptability(i) = Adaptability(i)           '则把最佳适应值设置为我们计算得到的适应值
                GlobalBest = 1                                  '最佳的位置当然也就是当前点
            End If
            
            If Adaptability(i) > BestAdaptability(i) Then       '如果在当前位置的适应度原先记录的最小适应度还要小,则更新
                BestAdaptability(i) = Adaptability(i)
                For j = 1 To Dimensions
                    BestPosition(i, j) = Position(i, j)         '重新记录最佳位置,即把最佳位置改为当前位置
                Next
                
                If BestAdaptability(i) > BestAdaptability(GlobalBest) Then  '如果新计算的当前点的适应度比群体的整体适应度还要小,则重新设置整体最佳适应度
                    GlobalBest = i
                End If
            End If
         Next
        For i = 1 To PopSize
            For j = 1 To Dimensions          '更新位置和速度


            Velocity(i, j) = CurrentInertia * Velocity(i, j) + _
                             2 * Rnd * (BestPosition(i, j) - Position(i, j)) + _
                             2 * Rnd * ((BestPosition(GlobalBest, j) - Position(i, j)))
            If Velocity(i, j) > MaxVelocity Then
                Velocity(i, j) = MaxVelocity
            ElseIf Velocity(i, j) < -MaxVelocity Then
                Velocity(i, j) = -MaxVelocity
            End If
        Next
        Next
                
        For i = 1 To PopSize
            For j = 1 To Dimensions          '更新位置和速度
                Position(i, j) = Position(i, j) + Velocity(i, j)
                If Position(i, j) > SubjectTo(j, 2) Then  '保证范围
                     Position(i, j) = SubjectTo(j, 2)
                ElseIf Position(i, j) < SubjectTo(j, 1) Then
                     Position(i, j) = SubjectTo(j, 1)
                End If
            Next
        Next
        
    Next
    MsgBox BestAdaptability(GlobalBest)
End Sub

 

这个函数21.5 + x1* Sin(4 * x1 * 3.14) + x2 * Sin(20 * x2* 3.14)是常被用来测试某一优化方法时候有效的函数,有很多优化算法对这个函数都难以获得正确的结果,而本程序中我们由最后的结果可知获得了正确的结果。


猜你喜欢

转载自blog.csdn.net/lihongmao5911/article/details/44031857