粒子群最优化_粒子群算法MATLAB

粒子群最优化_粒子群算法MATLAB粒子群最优化(ParticleSwarmOptimization、PSO)_粒子群优化

粒子群最適化(Particle Swarm Optimization、PSO)是一种进化算法,通过模拟鸟群的捕食行为而设计出来的。从随机解开始,通过迭代来寻找最优解,并通过适应度评估解的质量。

如果将最优化问题视为在空中寻找食物的鸟群,那么粒子群最优化问题的潜在解就是探索空间中的鸟,也称为“粒子”,而“食物”是最优化问题的最优解。每个粒子都有一个由最优化问题确定的适应度,用于评估粒子的“好坏”程度。每个粒子都有速度,决定了它的飞行方向和距离,它会根据自己的飞行经验和同伴的飞行经验来调整自己的飞行。

粒子群被初始化为一群随机粒子(随机解),然后通过迭代来寻找最优解。在每次迭代中,粒子通过跟踪两个“极值”来更新自己,第一个是粒子自己经历的最佳位置,即个人极值(pbest),另一个是整个群体经历的最佳位置,即全局极值(gbest)。每个粒子都会通过这两个极值不断地更新自己,并生成下一代群体。

粒子”(Particle)i的第d维速度更新式:

粒子群最优化_粒子群算法MATLAB

 「粒子」(Particle)i的第d次元位置更新公式:

粒子群最优化_粒子群算法MATLAB

 c 1和c 2是粒子群最適化中的两个参数,它们分别称为个体学习因子和社会学习因子。c 1的值越大,粒子越倾向于向其个体最佳位置移动。c 2的值越大,粒子越倾向于向整个群体的最佳位置移动。

粒子群最优化_粒子群算法MATLAB

PSO算法的步骤如下:

〔Step 1〕 使用随机数初始化个体的位置xi和速度Vi。 〔Step 2〕 评估要最小化的目标函数值f(xi)。 〔Step 3〕 将f(xi)与个体之前的最佳值f(pbesti)进行比较。如果f(xi) < f(pbesti),则更新f(pbesti) = f(xi)和pbesti = xi。 〔Step 4〕 将f(xi)与群体中的最佳值f(gbest)进行比较。如果f(xi) < f(gbest),则更新gbest = xi。 〔Step 5〕 使用公式(1)更新速度,使用公式(2)更新位置。 〔Step 6〕 返回到Step 2,重复执行直到满足收敛条件。

 

实验设计

目标函数:z = x^2+y^2 (-10<=x,y<=10) 寻找最优解 初始粒子群:随机生成一组粒子的位置和速度 最终结果:所有粒子基本上都收敛到了(0,0)点。

粒子群最优化_粒子群算法MATLAB粒子群最优化_粒子群算法MATLAB

 代码:

 

import numpy as np
import random
import matplotlib.pyplot as plt


class PSO():
    # PSO参数设置
    def __init__(self, population_size, step):
        self.w = 0.6
        self.c1 = 2
        self.c2 = 2
        # self.r1 = 0.6
        # self.r2 = 0.3
        self.pN = population_size  # 粒子数量
        self.dim = 2  # 搜索维度
        self.r1 = np.random.rand(self.pN, self.dim)
        self.r2 = np.random.rand(self.pN, self.dim)


        self.step = step  # 迭代次数
        self.X = np.zeros((self.pN, self.dim))  # 所有粒子的位置和速度
        self.V = np.zeros((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.g_fit = 1e10  # 全局最佳适应值

    #目标函数
    def function(self, X):
        # k = [i * i for i in X]
        # return sum(k)
        x1 = X[0]
        x2 = X[1]
        return x1**2 + x2**2
        # return np.sum(np.square(X))

    #初始化种群
    def init_Population(self):
        for i in range(self.pN):  # 因为要随机生成pN个数据,所以需要循环pN次
            for j in range(self.dim):  # 每一个维度都需要生成速度和位置,故循环dim次
                self.X[i][j] = random.uniform(-10, 10)
                self.V[i][j] = random.uniform(0, 1)
            self.pbest[i] = self.X[i]  # 其实就是给self.pbest定值
            tmp = self.function(self.X[i])  # 得到现在最优
            #更新局部最优
            self.p_fit[i] = tmp

            #跟新全局最优
            if tmp < self.g_fit:  # 得到现在最优和历史最优比较大小,如果现在最优大于历史最优,则更新历史最优
                self.g_fit = tmp
                self.gbest = self.X[i]

    def evolve(self):
        # fitness = []
        fig = plt.figure()
        for t in range(self.step):
            for i in range(self.pN):
                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.g_fit:  # 更新全局最优
                        self.gbest = self.X[i]
                        self.g_fit = self.p_fit[i]

            #更新数度,位置

            for i in range(self.pN):
                self.V[i] = self.w * self.V[i] + self.c1 * self.r1[i] * (self.pbest[i] - self.X[i]) + \
                            self.c2 * self.r2[i] * (self.gbest - self.X[i])
                self.X[i] = self.X[i] + self.V[i]
            plt.clf()
            plt.scatter(self.X[:, 0], self.X[:, 1], s=30, color='red')
            plt.xlim(-10, 10)
            plt.ylim(-10, 10)
            plt.pause(0.05)


pso = PSO(100, 150)
pso.init_Population()
pso.evolve()
plt.show()

今天的文章粒子群最优化_粒子群算法MATLAB分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83286.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注