粒子群算法PSO的python实现

1.背景

实际上网上关于pso算法的这个呢有很多,也不乏代码实现,包括matlab和python实现。但是查看各位大佬的代码,发现或多或少存在一些问题,下面就基于@大灰狼学编程的博客,对其代码进行部分纠正,希望大家多批评指正(ps:对于原理的讲解,我更推荐博客https://blog.csdn.net/m0_60307882/article/details/123864693)。

2.修改后的代码

# 使用粒子群算法计算:f(x)=x^2+y^2+x的最小值

import numpy as np

X = np.arange(-5, 5, 0.1)
Y = np.arange(-5, 5, 0.1)
X, Y = np.meshgrid(X, Y)

Z = X ** 2 + Y ** 2 + X

def fitness_func(X):
    """适应度,也就是函数的值"""
    x = X[:, 0]
    y = X[:, 1]
    return x ** 2 + y ** 2 + x


#更新速度,根据公式V(t+1)=w*V(t)+c1*r1*(pbest_i-xi)+c2*r2*(gbest_xi)
def v_update(V, X, c1, c2, pbest, gbest, w, max_val):
    """

    Parameters
    ----------
    V:公式中的V(t),t时刻的粒子的速度(这里好像是批处理)
    X:批样本的t时刻的位置
    c1:惯性系数
    c2:惯性系数
    pbest:单个粒子i历史最优位置
    gbest:群体粒子的历史最优位置
    w:惯性系数
    max_val:防止速度过大而设定的最大值

    Returns
    -------
    更新后的速度V
    """
    size = X.shape[0]  # 样本个数
    r1 = np.random.random((size, 1))
    r2 = np.random.random((size, 1))

    V_ = w * V + c1 * r1 * (pbest - X) + c2 * r2 * (gbest - X)
    V_[V_ < -max_val] = -max_val
    V_[V_ > max_val] = max_val

    return V_


def p_update(X, V):
    """更新粒子位置"""
    return X + V


def pso():
    """粒子群算法主函数"""
    w = 1
    c1 = 2
    c2 = 2
    r1 = None
    r2 = None
    dim = 2
    size = 20  # 使用20个粒子
    iter_num = 1000  # 最大迭代次数
    max_val = 0.5
    best_fitness = float(9e10)
    fitness_val_list_group = []  # 存放每次的全局最优位置

    # 初始化各个粒子的位置
    X = np.random.uniform(-5, 5, size=(size, dim))
    # 初始化各个粒子的初试速度
    V = np.random.uniform(-0.5, 0.5, size=(size, dim))

    p_fitness = fitness_func(X)  # 初始化个体适应度
    g_fitness = p_fitness.min()  # 初始化集体适应度
    fitness_val_list_group.append(g_fitness)  # 初始化群体最优位置列表

    pbest = X  # 初始化个体最优位置,每行对应一个个体的最优位置
    gbest = X[p_fitness.argmin()]  # 初始化种群最优位置,为标量

    # 迭代
    for i in range(1, iter_num):
        # 更新粒子位置与速度
        V = v_update(V, X, c1, c2, pbest, gbest, w, max_val=max_val)
        X = p_update(X, V)
        p_fitness2 = fitness_func(X)  # 更新后的粒子的适应度,针对这一次中的所有群体
        g_fitness2 = p_fitness2.min()  # 更新后的种群的最佳适应度,针对这一次中的所有群体

        # 现在需要与之前所有迭代中的个体最优位置和群体最优位置作对比,对二者进行更新
        # 这里直接与上一次的结果进行比较即可:
        for j in range(size):  # 对每个样本做遍历
            if p_fitness[j] > p_fitness2[j]:
                pbest[j] = X[j]  # 更新各个个体的最优位置,所有次数
                p_fitness[j] = p_fitness2[j]  # 各个个体的最优位置更新了,其对应的适应度也要跟上

        if g_fitness > g_fitness2:
            gbest = X[p_fitness2.argmin()]  # 更新后的群体最优点,所有次数
            g_fitness = g_fitness2  # 对应的适应度跟上

        # 记录最佳迭代记录
        fitness_val_list_group.append(g_fitness)

        # 输出迭代结果
    print("最优值是:%.5f" % fitness_val_list_group[-1])
    print("最优解是:x=%.5f,y=%.5f" % (gbest[0], gbest[1]))


pso()

by——神采的二舅

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

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340