PSO粒子群搜索算法步骤及应用实例(一)

在这里插入图片描述
案例一:利用PSO求解无约束连续函数优化问题
在这里插入图片描述
代码:
PSO_1.py

'''
#案例一:
# 求解Rastrigin函数的极小值,自变量取值范围为[-5,5]
# 函数:fun = 2*a+x**2-a*np.cos(2*np.pi*x) + y**2-a*np.cos(2*np.pi*y)
'''

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# 绘制三维图像和色图
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

mpl.rcParams['font.sans-serif'] = ['SimHei']#指定默认字体,可显示中文
mpl.rcParams['axes.unicode_minus'] = False#正常显示图像中的负号


def func(x, y, a=10):
    '''计算目标函数的值'''
    return 2*a+x**2-a*np.cos(2*np.pi*x) + y**2-a*np.cos(2*np.pi*y)



def show_picture():
    '''绘制函数图像'''
    x = np.arange(-5, 5, 0.1)  # [-5,5]
    y = np.arange(-5, 5, 0.1)  # [-5,5]
    x, y = np.meshgrid(x, y)  # 生成网格

    fig = plt.figure()
    ax = Axes3D(fig)
    _ = ax.plot_surface(x, y, func(x, y), cmap=cm.coolwarm)
    # return ax
    plt.show()

# 定义适应度函数,速度更新函数,位置更新函数
def fitness_func(x):
    '''通过矩阵的方式计算粒子的适应度值
    输入:X为 size * 2 维的矩阵,其中size为粒子种群大小
    输出:1*size 维的适应度值向量'''

    a = 10
    return func(x[:, 0], x[:, 1], a)


def velocity_update(v, x, p_best, g_best, c1, c2, w, max_val):
    '''更新每个粒子的速度向量
    输入:
    v-当前粒子群体的速度向量矩阵
    x-当前粒子群体的位置向量矩阵
    p_best-每个粒子历史最优的位置向量矩阵
    g_best-历史最优的粒子位置向量
    c1,c2-“自我认知”和“社会认知”系数
    w-惯性系数
    max_val-限制粒子的最大速度
    输出:
    更新后的粒子群体速度向量矩阵
    '''
    size = x.shape[0]  # 获取粒子个数
    r1 = np.random.random((size, 1))
    r2 = np.random.random((size, 1))
    v_update = w*v + c1*r1*(p_best-x) + c2*r2*(g_best-x)
    #检测并修改超出自变量取值范围的值
    v_update[v_update<-1*max_val] = -1*max_val
    v_update[v_update>max_val] = max_val

    return v_update

def position_update(x,v):
    '''更新粒子群体的位置矩阵'''
    return x + v

#粒子群算法主函数
def pso_solver():
    '''粒子群算法求解主函数'''
    #parameters
    w = 1
    c1 = 2
    c2 = 2
    dim = 2#自变量个数
    size = 20 #种群大小
    iter_num = 1000#算法迭代最大次数
    max_val = 0.5#限制粒子的最大速度为0.5
    fitness_value_list = []#记录搜索过程中全体最优适应度的变化
    fitness_value_position_list = []#记录搜索过程中最优粒子位置的变化
    #PSO算法迭代过程
    x = np.random.uniform(-5,5,size=(size,dim))
    v = np.random.uniform(-1*max_val,max_val,size=(size,dim))
    #每个粒子的局部最优和群体的历史最优
    p_best = x
    p_fitness = fitness_func(p_best)
    g_fit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值