粒子群算法【python实现】

概要

提示:这里可以添加技术概要

原理参考:
https://zhuanlan.zhihu.com/p/346355572
编程参考:
https://github.com/Tonghui-Wang/Adaptive_Admittance_Control
https://blog.csdn.net/xyisv/article/details/79058574

完整代码

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


# ----------------------PSO参数设置---------------------------------
class PSO:
    def __init__(self, pN, dim, max_iter):
        self.wlimit = np.array([0.4, 2]) # w范围
        self.c1 = 2
        self.c2 = 2
        self.max_iter = max_iter  # 进化次数
        self.pN = pN  # 种群规模
        self.dim = dim  # 粒子维度,即目标函数的自变量个数
        self.cost = np.array([np.inf] * self.pN)  # 个体适应度代价
        self.pbest = np.zeros((self.pN, self.dim))  # 个体最值
        self.gbest = np.zeros((1, self.dim))  # 群体最值
        self.particle = np.zeros((self.pN, 2, self.dim))  # n个粒子,粒子每行分别表示位置、速度
        self.xlimit = np.array([[-5, -5], [5, 5]])  # 目标函数自变量的取值范围
        self.vmax = np.array([1, 1])  # 最大进化速度

    # ---------------------目标函数-----------------------------
    def function(self, x, y):
        return x * x + y * y - 25

    # ---------------------初始化种群----------------------------------
    def init_Population(self):
        for i in range(self.pN):
        		 # 位置初始化
            self.particle[i, 0, :] = np.random.rand(1, self.dim) * (
                    self.xlimit[1, :] - self.xlimit[0, :]) + self.xlimit[0, :]
             # 速度初始化
            self.particle[i, 1, :] = np.random.rand(1, self.dim) * self.vmax

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

    def iterator(self):
        fitness = np.zeros((self.dim, self.max_iter)) # 保存每次迭代的种群最佳位置
        for t in range(self.max_iter):
            # 更新粒子群参数
            w = self.wlimit[1] - (self.wlimit[1] - self.wlimit[0]) * t / self.max_iter
            # 适应度评价
            for i in range(self.pN):  # 循环n个粒子
                error = np.absolute(self.function(self.particle[i, 0, 0], self.particle[i, 0, 1]))
                if error < self.cost[i]:  # 粒子当前代价小于粒子最小代价
                    self.cost[i] = error  # 更新粒子最小代价
                    self.pbest[i, :] = self.particle[i, 0, :]  # 更新粒子最优位置
                i = np.argmin(self.cost)  # 找到最小代价索引
                self.gbest = self.pbest[i, :]  # 将最小代价的个体最优位置赋值给群体最优位置
            fitness[0][t] = self.gbest[0]
            fitness[1][t] = self.gbest[1]
            # 更新粒子状态
            for i in range(self.pN):
                self.particle[i, 1, :] = w * self.particle[i, 1, :] + self.c1 * np.random.rand(self.dim) * \
                                         (self.pbest[i, :] - self.particle[i, 0, :]) + self.c2 * np.random.rand(
                    self.dim) * \
                                         (self.gbest[:] - self.particle[i, 0, :])  # 个体速度进化
                self.particle[i, 1, :] = np.minimum(self.particle[i, 1, :], self.vmax)  # 最大速度进化约束
                self.particle[i, 0, :] = self.particle[i, 0, :] + self.particle[i, 1, :]  # 个体位置进化
                self.particle[i, 0, :] = np.maximum(self.particle[i, 0, :], self.xlimit[0, :])  # 最小位置进化约束
                self.particle[i, 0, :] = np.minimum(self.particle[i, 0, :], self.xlimit[1, :])  # 最大位置进化约束
        return fitness

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


my_pso = PSO(pN=30, dim=2, max_iter=100)
my_pso.init_Population()
fitness = my_pso.iterator()
print("x = ", fitness[0][99])
print("y = ", fitness[1][99])
# -------------------画图--------------------
plt.figure()
plt.subplot(2, 1, 1)
plt.title("Fitness over iterations")
plt.xlabel("Iterations")
plt.ylabel("x")
plt.plot(range(1, my_pso.max_iter + 1), fitness[0])
# plt.yticks(np.arange(min(fitness[0]), max(fitness[0]), step=1))  # 设置y轴刻度

plt.subplot(2, 1, 2)
plt.title("Fitness over iterations")
plt.xlabel("Iterations")
plt.ylabel("y")
plt.plot(range(1, my_pso.max_iter + 1), fitness[1])
# plt.yticks(np.arange(min(fitness[1]), max(fitness[1]), step=1))  # 设置y轴刻度

plt.tight_layout()
plt.show()

提示:这里可以添加技术整体架构

运行结果

提示:这里可以添加技术名词解释
在这里插入图片描述

在这里插入图片描述

解释

这里利用粒子群算法完成对目标函数x2+y2=25的优化求解。
实现了较标准的粒子群算法,包括r1、r2在0到1的随机化,w的渐变。最大粒子速度推荐自变量范围的10%~20%,这里取20%。
在这里插入图片描述

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值