粒子群算法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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea 2021.5.3 删除之前的激活码(最新序列号破解)

    idea 2021.5.3 删除之前的激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    427
  • java -jar 启动程序/设置classpath

    java -jar 启动程序/设置classpath前言在java-jar命令执行java程序时,制定classpath解决方案Java命令行提供了如何扩展bootStrap级别class的简单方法.-Xbootclasspath:完全取代基本核心的Javaclass搜索路径.不常用,否则要重新写所有Java核心class-Xbootclasspath/a:后缀。将classpath添加在核心cl…

    2022年6月1日
    198
  • 添加网页背景音乐的两种方法是什么_html怎么添加背景音乐

    添加网页背景音乐的两种方法是什么_html怎么添加背景音乐为网页添加背景音乐的方法一般有两种,第一种是通过普通的标签来添加,另一种是通过标签来添加 1.其中,loop=”-1″表示音乐无限循环播放,如果你要设置播放次数,则改为相应的数字即可2.。 第一种方法当页面打开时音乐播放,如果将页面最小化以后播放音乐会自动暂停,第二种方法则不会出现这种情况,只要不将窗口关闭,它会一直播放 ■  :    是用以插入背景音

    2022年9月16日
    0
  • 基于Python的OpenCV人脸检测

    基于Python的OpenCV人脸检测本文将要讲述的是Python环境下如何用OpenCV检测人脸,本文的主要内容分为:1、检测图片中的人脸2、实时检测视频中出现的人脸3、用运设备的摄像头实时检测人脸提前做的准备:安装好Python3下载安装OpenCV库,方法是pipinstallopencv-python-ihttps://mirrors.aliyun.com/pypi/simple/–trusted-host=mirrors.aliyun.com/pypi/simple下载特征数据HAAR和LBP,这两种数

    2022年6月7日
    31
  • hi3531dv200开发板_hi3516dv300参数

    hi3531dv200开发板_hi3516dv300参数前言安装环境,默认你是有Linux系统的,不管是VM虚拟机还是docker还是WSL,也不对系统进行要求。此教程默认环境如下:Ubuntu18.04、Anaconda(Python3.8.5)、Anaconda安装不同版本Python

    2022年9月23日
    0
  • 文件上传的三种方式-Java「建议收藏」

    文件上传的三种方式-Java「建议收藏」前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对Http协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践。该博客重在实践。一.Http协议原理简介   HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,

    2022年5月14日
    109

发表回复

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

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