小白笔记 --粒子群优化算法(PSO)--python实现

PSO算法流程:

1.初始化粒子参数:

粒子群规模、粒子维度、迭代次数、惯性权重、学习因子、迭代步长范围

2.随机初始化每个粒子的(位置,速度):

个体、群体历史最优位置、适应值。

3.迭代:更新个体速度位置,个体最优适应值和位置--再更新群体;更新其他参数;

直到--两次迭代之间适应值最小差值()可接受的满意解/最大迭代次数。

4.速度更新公式

其中,\omega代表粒子自身惯性权重(较大有利于跳出局部最优,较小利于快速收敛找到最优,一般取值范围:(0.4,2),eg:0.9、1.2、1.5、1.8),d是粒子维度(自变量个数),c代表学习因子(一般取值(0,4)eg:1.6,1.8),r代表[0,1]的随机数,增加搜索随机性。

       线性变化策略:随着迭代次数的增加,惯性权重ω不断减小,从而使得粒子群算法在初期具有较强的全局收敛能力,在后期具有较强的局部收敛能力。

5.位置更新公式

python代码详解:Python粒子群优化算法实现(PSO)_python 优化算法库-CSDN博客

# coding: utf-8
import numpy as np
import random
import matplotlib.pyplot as plt


# ----------------------PSO参数设置---------------------------------
class PSO():                                     # 创建类:class
    def __init__(self, pN, dim, max_iter):       # 构造方法:__init__(self,参数) 
        self.w = 0.8
        self.c1 = 2                              # 给属性赋值
        self.c2 = 2
        self.r1 = 0.6
        self.r2 = 0.3
        self.pN = pN                             # 粒子数量
        self.dim = dim                           # 搜索维度
        self.max_iter = max_iter                 # 迭代次数
        self.X = np.zeros((self.pN, self.dim))   # 初始化所有粒子的位置和速度
        self.V = np.zeros((self.pN, self.dim))   # 形状为(self.pN, self.dim的全零数组)
        self.pbest = np.zeros((self.pN, self.dim))  # 个体经历的最佳位置和全局最佳位置
        self.gbest = np.zeros((1, self.dim))
        self.p_fit = np.zeros(self.pN)           # 每个个体的历史最佳适应值
        self.fit = 1e10                          # 全局最佳适应值

    # ---------------------目标函数-----------------------------
    def function(self, X):
        return X**2-4*X+3

    # ---------------------初始化种群----------------------------------
    def init_Population(self):
        for i in range(self.pN):
            for j in range(self.dim):
                self.X[i][j] = random.uniform(0, 1)   
                self.V[i][j] = random.uniform(0, 1)
            self.pbest[i] = self.X[i]
            tmp = self.function(self.X[i])        # 调用 self.function 方法
            self.p_fit[i] = tmp 
            if tmp < self.fit:                    
                self.fit = tmp
                self.gbest = self.X[i]

                # ----------------------更新粒子位置----------------------------------

    def iterator(self):
        fitness = []
        for t in range(self.max_iter):
            for i in range(self.pN):  # 更新gbest\pbest
                temp = self.function(self.X[i])
                if temp < self.p_fit[i]:  # 更新个体最优
                    self.p_fit[i] = temp
                    self.pbest[i] = self.X[i]
                    if self.p_fit[i] < self.fit:  # 更新全局最优
                        self.gbest = self.X[i]
                        self.fit = self.p_fit[i]
            for i in range(self.pN):
                self.V[i] = self.w * self.V[i] + self.c1 * self.r1 * (self.pbest[i] - self.X[i]) + \
                            self.c2 * self.r2 * (self.gbest - self.X[i])
                self.X[i] = self.X[i] + self.V[i]
            fitness.append(self.fit)
            print(self.X[0], end=" ")
            print(self.fit)  # 输出最优值
        return fitness

        # ----------------------程序执行-----------------------


my_pso = PSO(pN=30, dim=1, max_iter=100)
my_pso.init_Population()
fitness = my_pso.iterator()
# -------------------画图--------------------
plt.figure(1)
plt.title("Figure1")
plt.xlabel("iterators", size=14)
plt.ylabel("fitness", size=14)
t = np.array([t for t in range(0, 100)])
fitness = np.array(fitness)
plt.plot(t, fitness, color='b', linewidth=3)
plt.show()

参考文章:粒子群优化算法(Particle Swarm Optimization, PSO)的详细解读 - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值