粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]

粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]整个程序分为5个脚本pso1_mian.m:主程序,在此脚本内设置参数。pso1_im.m:画出函数图像(仅1维和2维)pso1_in.m:初始化pso1_in2.m:迭代寻优并输出结果另外还有一个目标函数,单独为一个脚本。推荐的测试函数—>这里先上运行结果图下面是源码1.pso1_mian.m这里的目标函数用函数句柄的形式调用(第15行)%%粒子群算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%pso1_im

大家好,又见面了,我是你们的朋友全栈君。

答疑:
我把答疑放在最前面了。很多小伙伴真的是零基础,既不懂matlab也不懂粒子群算法。因此我把最常问我的问题总结一下。


Q1:为什么我把直接把代码复制过去不能运行?
A1:因为这个代码没有目标函数,你需要设置求解的函数才能计算吧。下文有推荐的测试函数,copy过来可以直接用。


Q2:为什么设置了目标函数还是报错?
A2:设置目标函数后,需要针对目标更改参数。最起码你得把维度数和求解范围设置对(pso1_mian.m的第16行和第18行)。不然就很可能不能运行。


Q3:为什么每次运行的结果不一样?
A3:进化算法都会有这种现象,尤其是在目标函数很复杂的情况下,可能每次的结果差异都很大。调整参数也许能缓解这种情况,但是需要你对进化算法有很深的理解。


Q4:为什么我运行后没有函数图像,只有收敛过程图像?
A4:只有2维和3维的目标函数能画图,高维是没法画图的。

以下是正文:
如果你还不懂粒子群的原理,可以参考我这个博文:初探粒子群优化算法

整个程序分为5个脚本

  • pso1_mian.m:主程序,在此脚本内设置参数。
  • pso1_im.m:画出函数图像(仅1维和2维)
  • pso1_in.m:初始化
  • pso1_in2.m:迭代寻优并输出结果
  • 另外还有一个目标函数,单独为一个脚本。
  • 推荐的测试函数—>这里

  • 支持任意维度目标函数的寻优

  • 支持动态调整参数(惯性因子随迭代减小, c 1 , c 2 c_1,c_2 c1,c2的比值随迭代增大)

  • 可视化粒子运动位置


先上运行结果图

粒子的实时位置图迭代曲线图


下面是源码

1.pso1_mian.m
这里的目标函数用函数句柄的形式调用(第15行)

%% 粒子群算法
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% pso1_im.m:画出函数图像(仅1维和2维)。
% pso1_in.m:初始化
% pso1_in2.m:迭代寻优并输出结果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 可支持N维函数
% 可使用动态参数算法
% 多维目标函数的自变量输入格式为行向量
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clc,clear;close all;

% file = 'E:\日常工作\学习笔记\matlab代码\粒子群优化算法\pso1\数据shubert1.xlsx';
funct = @langer;                          %目标函数
fun_range = [0,3.08;0,2.1];    %每个维度的求解范围,行代表维度,第一列最小值,第二列最大值
density = 0.01;                         %图像中取点的密度
d = 2;                                  %维度
popsize = 10;                           %种群大小
maxgen = 100;                           %最大迭代次数
limit_v = 10;                          %每个维度的最大运动速度
maxormin = 0;                           %求最大值还是最小值。最大值为1,最小值为0
dynamic = 1;                            %是否采用动态参数
W = [0.7,1.4];                          %惯性因子。动态参数时为行向量,第一位是最小值,第二位是最大值
C2 = [0.5,2.5];
C1 = [0.5,2.5];                         %学习因子。动态参数时为行向量,第一位是最小值,第二位是最大值


Z = pso1_im(funct,fun_range,density,d);
[x,v,fitness,pbest,gbest,gbest_fitness,gbest_index,pbest_fitness] =...
   pso1_in(funct,popsize,d,fun_range,limit_v,maxormin);
[gbest_fitness,gbest_index,record] =...
    pso1_in2(funct,d,popsize,maxgen,dynamic,W,C1,C2,fun_range,limit_v,density...
    ,x,v,fitness,pbest,gbest,gbest_fitness,gbest_index,pbest_fitness,maxormin);

% canshu = {'惯性因子',W,'种群规模',popsize,'最大迭代次数',maxgen,'速度限制',limit_v,...
%     '最大值还是最小值',maxormin};
% xlswrite(file,record,'record');
% xlswrite(file,canshu,'参数');
  1. pso1_im.m
 function z = pso1_im(funct,fun_range,density,D)
%PSO1_IM 显示目标函数的图像(1维或2维)
%
%INPUT:
%   funct为目标函数
%   fun_range为求解区域矩阵,行代表维度,第一列最小值,第二列最大值
%   density为取值密度,为一个数字
%   D为空间维度,为正整数
if D == 2
    figure(1)
    [x1,x2] = meshgrid(fun_range(1,1):density:fun_range(1,2),fun_range(2,1):density:fun_range(2,2));
    for i = 1 : size(x1,1)
        for j = 1 : size(x1,2)
            z(i,j) = funct([x1(i,j),x2(i,j)]);
        end
    end
    mesh(x1,x2,z);title('目标函数图形');
    hold on;
elseif D == 1
    figure(1)
    x1 = fun_range(1):density:fun_range(2);
    for i = 1 : length(x1)
        z(i) = funct(x1(i));
    end
    plot(x1,z);
    hold on;
else 
    print('高维函数不能画出图像');
end
end


3.pso1_in.m

function [x,v,fitness,pbest,gbest,gbest_fitness,gbest_index,pbest_fitness] = pso1_in (funct,popsize,d,fun_range,limit_v,maxormin)
%PSO1_IN 进行初始化
%
%INPUT:
%   size:种群规模
%   maxgen:最大迭代次数
%   d:维数
%   fun_range:运动范围矩阵,行数为维数,第一列最小值,第二列最大值
%   limit_v:速度范围,为一个数字
%   maxormin:0为求最小值,1为求最大值

%位置和速度初始化
for i = 1 : popsize
    for j = 1 : d
        x(i,j) = (fun_range(j,2) - fun_range(j,1)) *  rand + fun_range(j,1); % 位置初始化
        v(i,j) = rand * limit_v;% 速度初始化
    end
end
for i = 1 : popsize
    fitness(i,:) = funct(x(i,:)); % 计算初始适应度
end

pbest = x;              % 个体最优值位置
pbest_fitness = fitness;% 个体最优值
if maxormin == 1
    [gbest_fitness,gbest_index] = max(fitness);
elseif maxormin == 0
    [gbest_fitness,gbest_index] = min(fitness);
else print('maxormin的值非法')
        return

end
gbest = x(gbest_index,:);

end


  1. pso1_in2.m
function [gbest_fitness,gbest_index,record] =...
    pso1_in2(funct,d,popsize,maxgen,dynamic,W,C1,C2,fun_range,limit_v,density...
    ,x,v,fitness,pbest,gbest,gbest_fitness,gbest_index,pbest_fitness,maxormin)
%PSO1_IN2 开始迭代计算
%   
%INPUT:
%   size:种群规模
%   maxgen:最大迭代次数
%   d:维数
%   fun_range:运动范围矩阵,行数为维数,第一列最小值,第二列最大值
%   limit_v:速度范围,为一个数字
%   maxormin:0为求最小值,1为求最大值
times = 1;

for i = 1 : maxgen      % i表示迭代次数
    if dynamic == 1
        w = W(2) - (W(2) - W(1)) * i/maxgen; % 动态调整学习因子
        c1 = (C1(1) - C1(2)) * i / maxgen + C1(2);
        c2 = (C2(2) - C2(1)) * i / maxgen + C2(1);
    elseif dynamic == 0
        w = W;
        c1 = C1;
        c2 = C2;
    end
    for j = 1 : popsize    % j表示粒子索引
        % 更新速度
        v(j,:) = w * v(j,:) + c1 * rand * (pbest(j,:) - x(j,:)) + c2 * rand * (gbest - x(j,:));
        % 限速
    for g=1:d           % g表示维度
        for k=1:popsize    % k表示粒子索引
        if  v(k,g) > limit_v
            v(k,g) = limit_v;
        end
        if  v(k,g) < (-1 * limit_v)
            v(k,g) = (-1 * limit_v);
        end
        end
    end     
        % 更新位置
        x(j,:) = x(j,:) + v(j,:);
        %限制运动范围
    for g=1:d           % g表示维度
        for k=1:popsize    % k表示粒子索引
        if  x(k,g) > fun_range(g,2)
            x(k,g) = fun_range(g,2);
        end
        if  x(k,g) < fun_range(g,1)
            x(k,g) = fun_range(g,1);
        end
        end
    end   
        % 更新适应度
        for u = 1 : popsize
            fitness(u,:) = funct(x(u,:)); % 计算初始适应度
        end
    % 更新全局最优
    if maxormin == 0
        if min(fitness) < gbest_fitness
            [gbest_fitness,gbest_index] = min(fitness);
            gbest = x(gbest_index,:);
        end
    elseif maxormin == 1
        if max(fitness) > gbest_fitness
            [gbest_fitness,gbest_index] = max(fitness);
            gbest = x(gbest_index,:);
        end
    end
    
    % 更新局部最优
    for k = 1 : popsize
      if maxormin == 0
        if fitness(k,:) < pbest_fitness(k,:)
            pbest_fitness(k,:) = fitness(k,:);
            pbest(k,:) = x(k,:);
        end
      elseif maxormin == 1 
        if fitness(k,:) > pbest_fitness(k,:)
            pbest_fitness(k,:) = fitness(k,:);
            pbest(k,:) = x(k,:);
        end
      end
    end
        record(i,:) = gbest_fitness; % record记录每代的全局最优
    end
    
    if d == 2
        if times >= 10
            cla;
            [x1,x2] = meshgrid(fun_range(1,1):density:fun_range(1,2),fun_range(2,1):density:fun_range(2,2));
            for i = 1 : size(x1,1)
                for j = 1 : size(x1,2)
                    z(i,j) = funct([x1(i,j),x2(i,j)]);
                end
            end
            mesh(x1, x2, z,'EdgeColor','none','FaceColor','flat','FaceAlpha','0.4');
            plot3(x(:,1),x(:,2),fitness, 'ro');title('状态位置变化');
            pause(0.5);
            times=0;
        end
    end
    times = times + 1;
end
disp( ['目标函数最小值:' num2str(gbest_fitness)]);
disp( ['最小值对应的(x,y):' num2str(x(gbest_index,:))]);
figure
plot(record,'LineWidth',2);title('收敛过程')
xlabel('迭代次数');
ylabel('得到的目标函数值');
end


写代码不容易,要拿去用的小伙伴来个三连吧!

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132990.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSM 项目 ——— 小米商城后台管理系统

    SSM 项目 ——— 小米商城后台管理系统目录一、项目名称二、使用技术三、开发步骤四、具体实现1、创建数据库表2、项目结构3、配置文件一、项目名称名称:小米商城后台管理系统本项目主要目的是使学员更深层的了解IT企业的文化和岗位需求、模拟企业的工作场景,分享研制成果,增加学员对今后工作岗位及计算机应用开发对客观世界影响的感性认识,使学员对技术有更深入的理解,在今后工作中能有更明确的目标和方向。并能为日后职业规划提供很好的指导作用。二、使用技术服务端:Spring+SpringMVC+MyBatis框架整合数据库:MySql8.0

    2022年6月27日
    58
  • SQL语句中 left join 后用 on 还是 where,区别大了!

    SQL语句中 left join 后用 on 还是 where,区别大了!

    2022年2月19日
    43
  • sklearn安装教程_cmd安装软件命令

    sklearn安装教程_cmd安装软件命令sklearn库sklearn是scikit-learn的简称,是一个基于Python的第三方模块。sklearn库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,只需要简单的调用sklearn库中提供的模块就能完成大多数的机器学习任务。sklearn库是在Numpy、Scipy和matplotlib的基础上开发而成的,因此在介绍sklearn的安装前,需要先安装这些依赖库。…

    2022年10月17日
    0
  • StretchBlt用法[通俗易懂]

    StretchBlt用法[通俗易懂]首先定义protected: BITMAPbmp;其次实现///////////////////////////////////////////////////////////////////////////////CExamineViewdrawingvoidCExamineView::OnDraw(CDC*pDC){ CExamineDoc*pDoc=GetDo

    2025年6月13日
    0
  • mfc wpf winform(工业用mfc还是qt)

    编程语言的组成编程语言做为一种语言自然和英语这些自然语言有类似的地方.学英语时我们知道要先记26个字母,然后单词及其发音,接下来就是词组,句子.反正简单的说就是记单词,熟悉词法,句法.接下来就是应用了,听说读写.而使用相同语言的人大脑里都有个翻译器,可以把自己的想法翻译成语言然后用说或写表达出来,而听和读则把接收来的语言翻译成自己大脑能理解的思想.那编程语言首先也是像英语一样会制定一些单词…

    2022年4月12日
    96
  • 可编辑的表格:jQuery+PHP实现实时编辑表格字段内容

    可编辑的表格:jQuery+PHP实现实时编辑表格字段内容

    2021年11月3日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号