python螢火蟲演算法 粒子群演算法

2021-10-12 10:51:54 字數 4438 閱讀 1099

演算法背景

粒子群演算法(particle swarm optimization,pso)是計算智慧型領域中的一種生物啟發式方法,屬於群體智慧型優化演算法的一種,常見的群體智慧型優化演算法主要有如下幾類:

(1)蟻群演算法(ant colony optimization,簡稱aco)[2023年提出];

(2)粒子群優化演算法(particle swarm optimization,簡稱pso)[2023年提出](簡單易於實現,也是目前應用最為廣泛的群體智慧型優化演算法);

(3)菌群優化演算法(bacterial foraging optimization,簡稱bfo)[2023年提出];

(4)蛙跳演算法(shuffled frog leading algorithm,簡稱sfla)[2023年提出];

(5)人工蜂群演算法(artificial bee colony algorithm,簡稱abc)[2023年提出];

除了上述幾種常見的群體智慧型演算法以外,還有一些並不是廣泛應用的群體智慧型演算法,比如螢火蟲演算法、布穀鳥演算法、蝙蝠演算法以及磷蝦群演算法等等。

而其中的粒子群優化演算法(pso)源於對鳥類捕食行為的研究,鳥類捕食時,找到食物最簡單有限的策略就是搜尋當前距離食物最近的鳥的周圍。

相較於傳統演算法計算速度非常快,全域性搜尋能力也很強;

pso對於種群大小不十分敏感,所以初始種群設為500-1000,速度影響也不大;

粒子群演算法適用於連續函式極值問題,對於非線性、多峰問題均有較強的全域性搜尋能力。

設想這樣乙個場景:一群鳥在隨機的搜尋食物。在這個區域裡只有一塊食物,所有的鳥都不知道食物在哪。但是它們知道自己當前的位置距離食物還有多遠。那麼找到食物的最優策略是什麼?最簡單有效的就是搜尋目前離食物最近的鳥的周圍區域。

演算法實現

演算法流程圖

step1:確定乙個粒子的運動狀態是利用位置和速度兩個引數描述的,因此初始化的也是這兩個引數;

step2:每次搜尋的結果(函式值)即為粒子適應度,然後記錄每個粒子的個體歷史最優位置和群體的歷史最優位置;

step3:個體歷史最優位置和群體的歷史最優位置相當於產生了兩個力,結合粒子本身的慣性共同影響粒子的運動狀態,由此來更新粒子的位置和速度。

粒子群演算法流程圖

初始化種群

位置和速度的初始化即在位置和速度限制內隨機生成乙個n x d 的矩陣,而對於速度則不用考慮約束,一般直接在0~1內隨機生成乙個50x1的資料矩陣。

此處的位置約束也可以理解為位置限制,而速度限制是保證粒子步長不超限制的,一般設定速度限制為[-1,1]。

粒子群的另乙個特點就是記錄每個個體的歷史最優和種群的歷史最優,因此而二者對應的最優位置和最優值也需要初始化。其中每個個體的歷史最優位置可以先初始化為當前位置,而種群的歷史最優位置則可初始化為原點。對於最優值,如果求最大值則初始化為負無窮,相反地初始化為正無窮。

每次搜尋都需要將當前的適應度和最優解同歷史的記錄值進行對比,如果超過歷史最優值,則更新個體和種群的歷史最優位置和最優解。

速度與位置更新

速度和位置更新是粒子群演算法的核心,其原理表示式和更新方式:

速度和位置更新表示式

上面公式中:i表示粒子編號;d表示時刻,反映在迭代次數上;w是慣性權重,一般設定在0.4左右;c1、c2為學習因子,一般取2;pid表示的是粒子i的經驗最佳位置;gid代表的是全域性粒子的最優位置;r1、r2是0到1之間的隨機值

每次更新完速度和位置都需要考慮速度和位置的限制,需要將其限制在規定範圍內,此處僅舉出乙個常規方法,即將超約束的資料約束到邊界(當位置或者速度超出初始化限制時,將其拉回靠近的邊界處)。當然,你不用擔心他會停住不動,因為每個粒子還有慣性和其他兩個引數的影響。

**實現

源程式粒子群演算法求平方和函式最小值,由於沒有特意指定函式自變數量綱,不進行資料歸一化。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import math

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import axes3d

class pso(object):

def __init__(self, population_size, max_steps):

self.w = 0.6 # 慣性權重

self.c1 = self.c2 = 2

self.population_size = population_size # 粒子群數量

self.dim = 3 # 搜尋空間的維度

self.max_steps = max_steps # 迭代次數

self.x_bound = [-10, 10] # 解空間範圍

self.x = np.random.uniform(self.x_bound[0], self.x_bound[1],size= (self.population_size, self.dim)) # 初始化粒子群位置

self.v = np.random.rand(self.population_size, self.dim) # 初始化粒子群速度

fitness = self.function_fitness(self.x)

self.p = self.x # 個體的歷史最佳位置

self.pg = self.x[np.argmin(fitness)] # 全域性最佳位置

self.individual_best_fitness = fitness # 個體的歷史最優適應度

self.global_best_fitness = np.max(fitness) # 全域性最佳適應度

def function_fitness(self, x):

return np.sum(np.square(x), axis=1)

# return np.sin(np.sqrt(x[0]**2+x[1]**2))

def evolve(self):

fig = plt.figure()

for step in range(self.max_steps):

r1 = np.random.rand(self.population_size, self.dim)

r2 = np.random.rand(self.population_size, self.dim)

# 更新速度和權重

self.v = self.w*self.v+self.c1*r1*(self.p-self.x)+self.c2*r2*(self.pg-self.x)

self.x = self.v + self.x

plt.clf()

plt.subplot(111, projection='3d')

plt.scatter(self.x[:, 0], self.x[:, 1], self.x[:, 2], color='k')

plt.xlim(self.x_bound[0], self.x_bound[1])

plt.ylim(self.x_bound[0], self.x_bound[1])

plt.pause(0.01)

fitness = self.function_fitness(self.x)

# 需要更新的個體

update_bool = np.greater(self.individual_best_fitness, fitness) # np.greater(a,b)相當於》,返回乙個bool值

update_id = np.argwhere(update_bool == true)

self.p[update_id] = self.x[update_id]

self.individual_best_fitness[update_id] = fitness[update_id]

# 新一代出現了更小的fitness,所以更新全域性最優fitness和位置

if np.min(fitness) < self.global_best_fitness:

self.pg = self.x[np.argmin(fitness)]

self.global_best_fitness = np.min(fitness)

# print('best fitness: %.5f, mean fitness: %.5f' % (self.global_best_fitness, np.mean(fitness)))

pso = pso(100, 100)

pso.evolve()

plt.show()

python庫呼叫

np.greater(a,b)相當於a>b的判斷語句,返回乙個bool值

np.argwhere()返回符合條件的元素的位址

3d圖形的繪製通過呼叫mpl_tookits下的mplot3d類進行,

ax.plot_su***ce(x, y, z, rstride=1, cstride=1, cmap='rainbow') #繪面

ax.scatter(x, y, z, c='r') #繪點

FA 螢火蟲演算法的測試及Python實現

一 python中傳遞函式 def test a,b print a,b class test def init self,fitnessfunction self.fitnessfunction fitnessfunction def initial self self.fitnessfuncti...

粒子群演算法python實現

1 概述 粒子群演算法作為一種優化演算法,在很多領域都有應用。所謂優化,我的理解是對乙個問題求出它足夠好的解,目前的優化演算法有很多,如蟻群演算法 遺傳演算法等。粒子群演算法相對於這些演算法來說,它更簡單,而且有很快的收斂速度。2 演算法描述 舉乙個優化問題的例子,若求 粒子群演算法思想 於實際生活...

粒子群演算法實現之python

python實現粒子群演算法 粒子群演算法 pso 又可以叫做鳥群演算法,是學者觀察模仿鳥群的行為而發展的一種智慧型搜尋演算法,和遺傳演算法一樣,也是一種群智慧型演算法。總的來說,粒子群演算法也是一種進化演算法,粒子分布在空間中,粒子在空間中的座標組成的向量可以看做成遺傳演算法中的個體,或者是鳥群中...