粒子群算法改进--自动退出迭代循环

news/2025/3/10 14:12:49/文章来源:https://www.cnblogs.com/MuxLz/p/18759946

前言

  • 当粒子已经找到最佳位置后,再增加迭代次数只会浪费计算时间,那么我们能否设计一个策略,能够自动退出迭代呢?

循环跳出策略

(1)初始化最大迭代次数、计数器以及最大计数值(例如分别取100, 0, 20)
(2)定义“函数变化量容忍度”,一般取非常小的正数;
(3)在迭代的过程中,每次计算出来最佳适应度后,都计算该适应度和上一次迭代时最佳适应度的变化量(取绝对值);
(4)判断这个变化量和“函数变化量容忍度”的相对大小,如果前者小,则计数器加1;否则计数器清0;
(5)不断重复这个过程,有以下两种可能:
① 此时还没有超过最大迭代次数,计数器的值超过了最大计数值,那么我们就跳出迭代循环,搜索结束。
② 此时已经达到了最大迭代次数,那么直接跳出循环,搜索结束。

代码实现

求解函数y = 7cos(5x) + 4*sin(x)在[-5,5]内的最大值

%% 改进:自动退出迭代循环
Count = 0; % 计数器初始化为0
max_Count = 30;  % 最大计数值初始化为30
tolerance = 1e-2;  % 函数变化量容忍度,取10^(-2)%% 绘制函数的图形
x = -5:0.01:5;
y = 7*cos(5*x) + 4*sin(x);
figure(1)
plot(x,y,'b-')
title('y = 7*cos(5*x) + 4*sin(x)')
hold on  % 不关闭图形,继续在上面画图%% 粒子群算法中的预设参数(参数的设置不是固定的,可以适当修改)
n = 10; % 粒子数量
narvs = 1; % 变量个数
c1 = 2;  % 每个粒子的个体学习因子
c2 = 2;  % 每个粒子的社会学习因子
w = 0.9;  % 惯性权重
K = 100;  % 迭代的次数
vmax = 1.2; % 粒子的最大速度
x_lb = -3; % x的下界
x_ub = 3; % x的上界%% 初始化粒子的位置和速度
x = zeros(n,narvs);
x = x_lb + (x_ub-x_lb).*rand(n,narvs)    % 随机初始化粒子所在的位置
v = -vmax + 2*vmax .* rand(n,narvs);  % 随机初始化粒子的速度%% 计算适应度
fit = zeros(n,1);  % 初始化这n个粒子的适应度全为0
for i = 1:n  % 循环整个粒子群,计算每一个粒子的适应度fit(i) = Obj_fun1(x(i,:));   % 调用Obj_fun1函数来计算适应度
end
pbest = x;   % 初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)
ind = find(fit == max(fit), 1);  % 找到适应度最大的那个粒子的下标
gbest = x(ind,:);  % 定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)%% 在图上标上这n个粒子的位置用于演示
h = scatter(x,fit,80,'*r');  % scatter是绘制二维散点图的函数%% 迭代K次来更新速度与位置
% fitnessbest = ones(K,1);  % 初始化每次迭代得到的最佳的适应度
for d = 1:K  % 开始迭代,一共迭代K次tem = gbest; % 将上一步找到的最佳位置保存为临时变量for i = 1:n   % 依次更新第i个粒子的速度与位置v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:));  % 更新第i个粒子的速度% 如果粒子的速度超过了最大速度限制,就对其进行调整for j = 1: narvsif v(i,j) < -vmax(j)v(i,j) = -vmax(j);elseif v(i,j) > vmax(j)v(i,j) = vmax(j);endendx(i,:) = x(i,:) + v(i,:); % 更新第i个粒子的位置% 如果粒子的位置超出了定义域,就对其进行调整for j = 1: narvsif x(i,j) < x_lb(j)x(i,j) = x_lb(j);elseif x(i,j) > x_ub(j)x(i,j) = x_ub(j);endendfit(i) = Obj_fun1(x(i,:));  % 重新计算第i个粒子的适应度if fit(i) > Obj_fun1(pbest(i,:))   % 如果第i个粒子的适应度大于这个粒子迄今为止找到的最佳位置对应的适应度pbest(i,:) = x(i,:);   % 更新第i个粒子迄今为止找到的最佳位置endif  fit(i) > Obj_fun1(gbest)  % 如果第i个粒子的适应度大于所有的粒子迄今为止找到的最佳位置对应的适应度gbest = pbest(i,:);   % 更新所有粒子迄今为止找到的最佳位置endendfitnessbest(d) = Obj_fun1(gbest);  % 更新第d次迭代得到的最佳的适应度delta_fit = abs(Obj_fun1(gbest) - Obj_fun1(tem));   % 计算相邻两次迭代适应度的变化量if delta_fit < tolerance  % 判断这个变化量和“函数变化量容忍度”的相对大小,如果前者小,则计数器加1Count = Count + 1;elseCount = 0;  % 否则计数器清0end   if Count > max_Count  % 如果计数器的值达到了最大计数值break;  % 跳出循环endpause(0.1)  % 暂停0.1sh.XData = x;  % 更新散点图句柄的x轴的数据h.YData = fit; % 更新散点图句柄的y轴的数据
endfigure(2)
plot(fitnessbest)  % 绘制出每次迭代最佳适应度的变化图
xlabel('迭代次数');
disp('最佳的位置是:'); disp(gbest)
disp('此时最优值是:'); disp(Obj_fun1(gbest))
function y = Obj_fun1(x)y = 7*cos(5*x) + 4*sin(x);
end

迭代一百次的情况下优化与未优化的对比如下

自动退出迭代循环
在这里插入图片描述
基本粒子群算法

在这里插入图片描述
对比可知,未经优化的粒子群算法会浪费大量时间在无明显变化的搜索中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/895663.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

粒子群算法改进--线性递减惯性权重

惯性权重回顾 惯性权重w体现的是粒子继承先前的速度的能力 Shi,Y最先将惯性权重w引入到粒子群算法中,并且分析指出一个较大的惯性权值有利于全局搜索一个较小的权值则更利于局部搜索线性递减惯性权重在搜索初期,增强全局搜索能力可以更大可能遍历解空间,避免陷入局部最优解 &…

粒子群算法改进--压缩因子法

前言概述 粒子速度更新公式如下: vid = wvid-1 + c1r1(pbestid-xid)+ c2r2(gbestd-xid) 在研究完粒子群算法中有关惯性权重的优化之后,我们把目光转向速度更新公式的后两项,根据之前所学可知:个体学习因子c1和社会学习因子c2决定了粒子本身经验信息和其他粒子的经验信息对粒…

Mybatis-Plus异常处理

返回结果为2 ,我从Controller层中写的返回是一个floor实体,到Mapper层中返回的也是floor实体,但是Mapper返回是2条数据。 把controller层的返回值改为List。

关于sqlserver空间占用问题(.bak文件占用)

sqlserver跑项目的时候很可能涉及到较大的数据量(一开始占我c盘70GB!!!然后删了,然后就出事儿了,二次安装恶心至极,需要二次安装的话建议看我的上一篇文章)先打开ssms(SQL Server Management Studio)并连接,然后右击服务器找到属性 点击数据库设置,建议!!!直接改…

最近发现git bash运行很慢?

最近发现git bash打开运行后,键入命令,通常要五六秒,甚至十几秒才会响应。 打开上面这个后,比如输入git status要好久才会响应。 我的是双显卡导致的,解决办法:打开设备管理器,禁用其中一个显示适配器,速度就会快很多。 具体步骤截图: 1.搜索设备管理器 2.找到显示适…

sqlserver的二次安装!!

注意!!!建议在你看到这一条的时候,果断去淘宝找客服,sqlserver重新安装,十几块钱,不要自己搞,太煎熬了,折腾我3天!! 那么开始 首先得确保防火墙关闭!!例如火绒等安全卫士也要先退下去!! sqlserver这个东西,二次安装真的恶心,需要把所有东西删了重下,包括但不…

编程作业第一次

github仓库链接:3123004747/cheaker at main lwy8852/3123004747 Psp表格psp阶段 预估耗时 实际耗时 计划 (Planning) 15 15 估计任务时间 (Estimate) 40 55 开发 (Development) 200 220 需求分析 (Analysis) 30 25 生成设计文档 (Design Spec) 20 20 设计复审 (Design Revie…

【Kakfa】初识Kafka

简介Kafka是一个分布式消息系统,有LinkedIn公司开发,现已成为Apache基金顶级开源项目。 是一种快速、可扩展的、分布式的消息发布-订阅系统基础组成producer consumer broker topic partition消息和批次消息:Kafka把数据单元称之为消息,可以把数据消息看成数据库中的一个“…

算子 get_contour_attrib_xld - 返回 XLD 轮廓的点属性值

算子 get_contour_attrib_xld 名称 get_contour_attrib_xld — 返回 XLD 轮廓的点属性值。 签名 get_contour_attrib_xld(Contour : : Name : Attrib) 描述 get_contour_attrib_xld 算子将 XLD 轮廓 Contour 中属性 Name 的值返回到 Attrib 中。轮廓点属性是为每个轮廓点定义的…

川大网安挑战赛游记

会赢吗部分在手机上完成,格式可能有误,见谅。前:可能是最后的比赛了,还是记一下吧Day -1 下午三点半就走了,吃了汉堡王上火车,路上看网课,听歌。 到家快十点了,最终后半夜前睡了。 Day 0 早起,7:30 的飞机。发现手机没电了,不过还是顽强的让我听了一路的歌。 酒店严格…

win11开启22端口ssh服务器

步骤按win,输入可选功能条读完后,搜索service找到ssh然后进行设置,或者也可以使用命令。启动后端口就打开了。 配置默认shell 按win,搜索regedit,打开注册表编辑器。 导航到以下路径: HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH 在右侧窗口中,找到或创建一个名为 DefaultShel…