首页 > 编程语言 >粒子群优化算法-Python版本和Matlab函数调用

粒子群优化算法-Python版本和Matlab函数调用

时间:2022-10-19 10:46:50浏览次数:87  
标签:plt Python random pop Matlab fitness np 函数调用 最优

前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab下的粒子群函数。

前文参看:​​粒子群优化算法(PSO)​


以Ras函数(Rastrigin's Function)为目标函数,求其在x1,x2∈[-5,5]上的最小值。这个函数对模拟退火、进化计算等算法具有很强的欺骗性,因为它有非常多的局部最小值点和局部最大值点,很容易使算法陷入局部最优,而不能得到全局最优解。如下图所示,该函数只在(0,0)处存在全局最小值0。

粒子群优化算法-Python版本和Matlab函数调用_粒子群


粒子群优化算法-Python版本和Matlab函数调用_最小值_02

Python代码实现


import numpy as np
import matplotlib.pyplot as plt


# 目标函数定义
def ras(x):
y = 20 + x[0] ** 2 + x[1] ** 2 - 10 * (np.cos(2 * np.pi * x[0]) + np.cos(2 * np.pi * x[1]))
return y


# 参数初始化
w = 1.0
c1 = 1.49445
c2 = 1.49445

maxgen = 200 # 进化次数
sizepop = 20 # 种群规模

# 粒子速度和位置的范围
Vmax = 1
Vmin = -1
popmax = 5
popmin = -5

# 产生初始粒子和速度
pop = 5 * np.random.uniform(-1, 1, (2, sizepop))
v = np.random.uniform(-1, 1, (2, sizepop))

fitness = ras(pop) # 计算适应度
i = np.argmin(fitness) # 找最好的个体
gbest = pop # 记录个体最优位置
zbest = pop[:, i] # 记录群体最优位置
fitnessgbest = fitness # 个体最佳适应度值
fitnesszbest = fitness[i] # 全局最佳适应度值

# 迭代寻优
t = 0
record = np.zeros(maxgen)
while t < maxgen:

# 速度更新
v = w * v + c1 * np.random.random() * (gbest - pop) + c2 * np.random.random() * (zbest.reshape(2, 1) - pop)
v[v > Vmax] = Vmax # 限制速度
v[v < Vmin] = Vmin

# 位置更新
pop = pop + 0.5 * v
pop[pop > popmax] = popmax # 限制位置
pop[pop < popmin] = popmin

'''
# 自适应变异
p = np.random.random() # 随机生成一个0~1内的数
if p > 0.8: # 如果这个数落在变异概率区间内,则进行变异处理
k = np.random.randint(0,2) # 在[0,2)之间随机选一个整数
pop[:,k] = np.random.random() # 在选定的位置进行变异
'''

# 计算适应度值
fitness = ras(pop)

# 个体最优位置更新
index = fitness < fitnessgbest
fitnessgbest[index] = fitness[index]
gbest[:, index] = pop[:, index]

# 群体最优更新
j = np.argmin(fitness)
if fitness[j] < fitnesszbest:
zbest = pop[:, j]
fitnesszbest = fitness[j]

record[t] = fitnesszbest # 记录群体最优位置的变化

t = t + 1

# 结果分析
print(zbest)

plt.plot(record, 'b-')
plt.xlabel('generation')
plt.ylabel('fitness')
plt.title('fitness curve')
plt.show()

结果为

[0.99699579 0.00148844]

粒子群优化算法-Python版本和Matlab函数调用_最小值_03

可以知道求解的点非最小值,算法陷入了局部最小值。

删除自适应变异部分的注释,运行后结果如下,可以看出收敛到全局最优解。

[0.00022989 0.00014612]


粒子群优化算法-Python版本和Matlab函数调用_python_04


Matlab有个自带的粒子群优化函数particleswarm也可以使用。本例的代码如下:


y = @(x) 20 + x(1).^2 + x(2).^2 - 10*(cos(2*pi*x(1))+cos(2*pi*x(2)));
rng default
options = optimoptions('particleswarm','SwarmSize',200,'HybridFcn',@fmincon,'MaxIterations',200, 'Display','iter');
lb = [-5 -5]; % 这是变量的下限
ub = [5 5]; % 这是变量的上限
[x,fval,exitflag,output] = particleswarm(y,length(lb),lb,ub,options);

结果如下

粒子群优化算法-Python版本和Matlab函数调用_粒子群_05

particleswarm详细资料参考:


​https://www.mathworks.com/help/gads/particleswarm.html​


Matlab文档



标签:plt,Python,random,pop,Matlab,fitness,np,函数调用,最优
From: https://blog.51cto.com/domi/5764948

相关文章

  • Python 让图像变卡通图
    要创造卡通效果,我们需要注意两件事:边缘和调色板,这就是照片和卡通的不同之处。为了调整这两个主要组成部分,我们将经历四个主要步骤:加载图像创建边缘减少调色板将边缘掩模与......
  • Python中的枚举类enum
    0.本文来历上一篇文章,我写了Pytest插件pytest-order指定用例顺序我当时就比较好奇它的顺序和英文的对应关系,肯定是写死的,找了下就发现在源码sorter.py中定义了一......
  • Python教程Day03-Python输出、输入、转换数据类型、运算符
    一、输出作用:程序输出内容给用户print('helloPython')age=18print(age)#需求:输出“今年我的年龄是18岁”1、格式化输出格式化输出即按照一定的格式输出内容1.1格......
  • Python list 中删除元素的方法
    在python列表中删除元素主要分为以下3种场景:根据目标元素所在的索引位置进行删除,可以使用del关键字或pop()方法;根据元素本身的值进行删除,可使用列表(list类型)提供的remove(......
  • python 脚本实现bugly自动上传符号文件
    bugly更新之后,符号文件不再支持拖拽或者选择文件的方式上传了,官方提供了一个上传的工具包,通过buglyqq-upload-symbol.jar实现上传,每次上架app都需要手动去配置相关参数和组......
  • python当中map,reduce和filter函数用法和区别
    在python当中,关于map,reduce和filter函数用法。map:对任何可迭代序列中的每一个元素应用对应的函数。python3中返回的是迭代器。reduce:将序列中所有的元素进行合并运算......
  • python封装
    这种变形的特点:1,在类外部无法直接obj.__AttrName2,在类内部可以直接使用:obj.__AttrName3,子类无法覆盖父类__开头的属性0,classA:'类的封装啊'__x=1......
  • python类中的数据问题
    问题:1.)上面的__init__函数中,加*句我不写,为啥不可以?不理解里面怎么传递。。。初始化的时候不是先在内部调用了__init__,生成了L了吗?下面函数不能用这里的L,甚至是a,b这些变......
  • Selenium+Python系列 - 开发环境搭建
    一、写在前面我从未想过自己会写python系列的自动化文章,有些同学会问,那你现在为什么又开始写了?不止一个人找过我,问我可以写一些Python自动化的文章吗,答案是肯定的。笔......
  • GPS载波同步MATLAB仿真
     %载波跟踪算法仿真clcclearclf%输入信号参数定义fd=2.45e+3;f_ref=4.092e+6;fi=(4.092e+6)+fd;fs=16.368e+6;Ts=1/fs;N=16368;Repeat_Num=0.5000e+4;Freq_Step=500;......