找回密码
 立即注册
查看: 217|回复: 0

优化算法_粒子群算法_Matlab

[复制链接]
发表于 2022-8-5 11:52 | 显示全部楼层 |阅读模式
粒子群优化算法(Particle Swarm optimization,PSO)又翻译为粒子群算法、微粒群算法、或微粒群优化算法。是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。通常认为它是群集智能(Swarm intelligence, SI) 的一种。
在找到这两个最优值时,粒子根据如下的公式来更新自己的速度和新的位置:


v[] 是粒子的速度,present[] 是当前粒子的位置。pbest[] 和 gbest[] 如前定义。rand() 是介于(0,1)之间的随机数。c1,c2是学习因子。通常c1=c2=2。
此案例主要围绕使用matlab求y=sin(x)在[0,2*pi]上的最大值来编写。
首先编写此案例中所使用到计算粒子适应度值的函数,具体代码如下:

function y = fun(x)
% 函数用于计算粒子适应度值
    y = sin(x);
end以上即为主程序所用到的函数,下面来编写主程序main.m:

step1:清空环境

clc;
clear all;step2:绘制目标函数曲线图

x = linspace(0,2*pi,1000);
y = sin(x);
figure
plot(x, y)
hold on所绘制函数图像如图所示:


step3:参数初始化

c1 = 2;    %c一般初始化为2
c2 = 2;
ws = 0.9;
we = 0.4;
maxgen = 50;   % 进化次数  
sizepop = 10;   %种群规模,10个粒子
Vmax = 0.5;   %速度最大值
Vmin = -0.5;
popmax = 2*pi;  %根据x范围定义到1-2
popmin = 0;step4:产生初始粒子和速度

for i = 1:sizepop
    % 随机产生一个种群
    pop(i,:) = (rands(1) + 1) * pi;    %初始种群,x定义范围[0,2pi],rands函数的范围为-1到1
    V(i,:) = 0.5 * rands(1);  %初始化速度,与定义的速度最大值和最小值要一致
    % 计算适应度
    fitness(i) = fun(pop(i,:));   
endstep5:求出个体极值和群体极值

[bestfitness bestindex] = max(fitness);
zbest = pop(bestindex,:);   %全局
gbest = pop;    %个体
fitnessgbest = fitness;   %个体最佳适应度值
fitnesszbest = bestfitness;   %全局最佳适应度值step6:迭代寻优

for i = 1:maxgen
    w = ws - (ws-we)*(i/maxgen);
    for j = 1:sizepop
        % 速度更新
        %速度更新公式
        V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
        V(j,find(V(j,:)>Vmax)) = Vmax;       %边界约束
        V(j,find(V(j,:)<Vmin)) = Vmin;      
        
        % 种群更新
        pop(j,:) = pop(j,:) + V(j,:);        %位置更新公式
        pop(j,find(pop(j,:)>popmax)) = popmax;    %位置约束
        pop(j,find(pop(j,:)<popmin)) = popmin;
        
        % 适应度值更新
        fitness(j) = fun(pop(j,:));
    end
   
    for j = 1:sizepop   
        % 个体最优更新
        if fitness(j) > fitnessgbest(j)
            gbest(j,:) = pop(j,:);
            fitnessgbest(j) = fitness(j);
        end
        
        % 群体最优更新
        if fitness(j) > fitnesszbest
            zbest = pop(j,:);
            fitnesszbest = fitness(j);
        end
    end
    yy(i) = fitnesszbest;         
endstep7:输出结果并绘图

[fitnesszbest zbest]
plot(zbest, fitnesszbest,'r*')

figure
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);输出结果如图所示:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-5 15:40 , Processed in 0.417898 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表