发新话题
打印

粒子群算法python实现,感兴趣的朋友可以看看!

粒子群算法python实现,感兴趣的朋友可以看看!

1、 概述
粒子群算法作为一种优化算法,在很多领域都有应用。所谓优化,我的理解是对一个问题求出它足够好的解,目前的优化算法有很多,如蚁群算法、遗传算法等。粒子群算法相对于这些算法来说,它更简单,而且有很快的收敛速度。
2、 算法描述
举一个优化问题的例子,若求的最小值,当然可以通过数学手段求出当向量时的最小值为0 ,但是对于更复杂的函数表达式来说,运用数学手段求解是复杂的,而且在实际应用中,并不一定要求出它的精确解,只要是满足足够精度的精确解就够了,这时通过一定的优化算法求解就很方便。
粒子群算法思想来源于实际生活中鸟捕食的过程。假设在一个n维的空间中,有一群鸟(m只)在捕食,食物位于n维空间的某个点上,对于第i只鸟某一时刻来说,有两个向量描述,一个是鸟的位置向量,第二个是鸟的速度(i=1,2...m)。假设鸟能够判断一个位置的好坏,所谓“好坏”,就是离食物更近了还是更远了。鸟在捕食的过程中会根据自己的经验以及鸟群中的其他鸟的位置决定自己的速度,根据当前的位置和速度,可以得到下一刻的位置,这样每只鸟通过向自己和鸟群学习不断的更新自己的速度位置,最终找到食物,或者离食物足够近的点。更新速度和位置的表达式如下。
更新速度:

对应的python实现如下:
[python]
import random
import copy

birds=int(raw_input('Enter count of bird: '))
xcount=int(raw_input('Enter count of x: '))
pos=[]
speed=[]
bestpos=[]
birdsbestpos=[]
w=0.8
c1=2  
c2=2
r1=0.6
r2=0.3
for i in range(birds):
    pos.append([])
    speed.append([])
    bestpos.append([])

def GenerateRandVec(list):
    for i in range(xcount):
        list.append(random.randrange(1,100))
         
def CalDis(list):
    dis=0.0
    for i in list:
        dis+=i**2
    return dis

for i in range(birds):          #initial all birds' pos,speed
    GenerateRandVec(pos)
    GenerateRandVec(speed)
    bestpos=copy.deepcopy(pos)

def FindBirdsMostPos():
    best=CalDis(bestpos[0])
    index=0
    for i in range(birds):
        temp=CalDis(bestpos)
        if temp<best:
            best=temp
            index=i
    return bestpos[index]

birdsbestpos=FindBirdsMostPos()   #initial birdsbestpos

def NumMulVec(num,list):         #result is in list
    for i in range(len(list)):
        list*=num
    return list

def VecSubVec(list1,list2):   #result is in list1
    for i in range(len(list1)):
        list1-=list2
    return list1

def VecAddVec(list1,list2):      #result is in list1
    for i in range(len(list1)):
        list1+=list2
    return list1

def UpdateSpeed():
    #global speed
    for i in range(birds):
        temp1=NumMulVec(w,speed[:])
        temp2=VecSubVec(bestpos[:],pos)
        temp2=NumMulVec(c1*r1,temp2[:])
        temp1=VecAddVec(temp1[:],temp2)
        temp2=VecSubVec(birdsbestpos[:],pos)
        temp2=NumMulVec(c2*r2,temp2[:])
        speed=VecAddVec(temp1,temp2)
         
def UpdatePos():
    global bestpos,birdsbestpos
    for i in range(birds):
        VecAddVec(pos,speed)
        if CalDis(pos)<CalDis(bestpos):
            bestpos=copy.deepcopy(pos)
    birdsbestpos=FindBirdsMostPos()
     
for i in range(100):
    #print birdsbestpos
    print CalDis(birdsbestpos)
    UpdateSpeed()
    UpdatePos()
    本文源自:ht tp://w w w.c svt.ne t/
            

raw_input()

TOP

发新话题