
案例一:利用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

最低0.47元/天 解锁文章
1341

被折叠的 条评论
为什么被折叠?



