粒子群算法优化Sphere函数(MATLAB代码实现)

粒子群算法代码:

%% 
% 粒子群算法(Particle Swarm Optimization, PSO)
% 文献引用:Kennedy J, Eberhart R. Particle swarm optimization[C]//Proceedings of ICNN'95-international conference on neural networks. IEEE, 1995, 4: 1942-1948.
%%
% 输入:NP(种群大小),max_iter(最大迭代次数),dim(问题的维度),fobj(目标函数),搜索空间上界(ub),搜索空间下界(lb)
% 输出:gbest_fit(全局最优适应度值),gbest(全局最优解),cg_curve(收敛曲线)
function [gbest_fit,gbest,cg_curve]=PSO(NP,max_iter,dim,fobj,ub,lb)
%% 参数设置
v_max=5;           %最大速度
v_min=-5;          %最小速度
w_max=0.9;         %最大权重
w_min=0.4;         %最小权重
c1=1.5;            %个体学习因子
c2=1.5;            %社会学习因子
cg_curve=zeros(max_iter,1);  %预分配内存
%% 种群初始化
[pop,fit]=Initialization(NP,dim,fobj,ub,lb);  
%% 速度初始化
pop_v=v_min+(v_max-v_min)*rand(NP,dim);
%% 记录全局和个体最优
[gbest_fit,index]=min(fit);
gbest=pop(index,:);
pbest=pop;
pbest_fit=fit;
%% 开始迭代
for t=1:max_iter
    for i=1:NP
        r1=rand(1,dim);
        r2=rand(1,dim);
        w=w_max-t*(w_max-w_min)/max_iter; %更新权重
        pop_v(i,:)=w*pop_v(i,:)+c1.*r1.*(pbest(i,:)-pop(i,:))+c2.*r2.*(gbest -pop(i,:)); %粒子速度更新
        pop_v(i,:)=BoundaryCheck(pop_v(i,:),dim,v_max,v_min);  %检查速度是否越界
        pop(i,:)=pop(i,:)+pop_v(i,:);    %粒子位置更新
        pop(i,:)=BoundaryCheck(pop(i,:),dim,ub,lb);  %粒子位置越界检查
        fit(i)=fobj(pop(i,:));   %计算新个体的适应度值
        if fit(i)<pbest_fit(i)   %更新个体历史最优
            pbest(i,:)=pop(i,:);
            pbest_fit(i)=fit(i);
        end
        if fit(i)<gbest_fit      %更新全局最优
            gbest=pop(i,:);
            gbest_fit=fit(i);
        end
    end
    cg_curve(t)=gbest_fit;
end
end
%% 
% 种群初始化函数
% 输入:NP(种群大小),dim(问题的维度),fobj(目标函数),搜索空间上界(ub),搜索空间下界(lb)
% 输出:init_pop(种群矩阵),fit(种群适应度矩阵)
function [init_pop,fit]=Initialization(NP,dim,fobj,ub,lb)
fit=ones(NP,1);    %分配初始内存
init_pop=lb+(ub-lb)*rand(NP,dim);
for i=1:NP
    fit(i)=fobj(init_pop(i,:));
end
end
%%
% 边界检查函数
% 输入:x(种群个体),dim(问题的维度),搜索空间上界(ub),搜索空间下界(lb)
% 输出:y(调整后的个体)
function [y]=BoundaryCheck(x,dim,ub,lb)
for i=1:dim
    if x(i)>ub
        x(i)=ub;
    end
    if x(i)<lb
        x(i)=lb;
    end
end
y=x;
end

main函数代码:

clear  %清空工作区
clc    %清空命令行
close all %关闭所有图形窗口
%%
% main函数
% 参数设置
NP=20;          %种群大小
dim=30;         %维度
max_iter=500;   %最大迭代次数
lb=-100;        %下界
ub=100;         %上界
fobj=@Sphere;   %目标函数
%% 算法调用
[gbest_fit,gbest,cg_curve]=PSO(NP,max_iter,dim,fobj,ub,lb);
disp(['gbest_fit=',num2str(gbest_fit)]);  %输出最优值
plot(cg_curve);
%%
% 目标函数定义
function o =Sphere(x)
o=sum(x.^2);
end

优化效果:(存在一定的随机性,追求效果可扩大迭代次数)

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子群算法(Particle Swarm Optimization,PSO)是一种优化算法,它通过模拟鸟群捕食行为的方式来寻找最优解。下面是用MATLAB实现粒子群算法代码示例: ```matlab function [bestpos, bestfitness] = pso(fobj, dim, lb, ub, maxiter, npop, c1, c2, w) % fobj: 目标函数 % dim: 变量维度 % lb: 变量下界 % ub: 变量上界 % maxiter: 最大迭代次数 % npop: 粒子数 % c1: 学习因子1 % c2: 学习因子2 % w: 惯性权重 % 初始化粒子群 pos = repmat(lb, npop, 1) + rand(npop, dim) .* repmat((ub-lb), npop, 1); vel = zeros(npop, dim); pbestpos = pos; pbestfitness = ones(npop, 1) * inf; % 寻找全局最优解 [gbestfitness, gbestid] = min(pbestfitness); gbestpos = pbestpos(gbestid, :); % 迭代 for iter = 1:maxiter % 更新粒子速度和位置 vel = w * vel + c1 * rand(npop, dim) .* (pbestpos - pos) + c2 * rand(npop, dim) .* repmat((gbestpos - pos), npop, 1); pos = pos + vel; % 越界处理 pos(pos<lb) = lb(pos<lb); pos(pos>ub) = ub(pos>ub); % 更新每个粒子的最优解 fitness = feval(fobj, pos'); update = fitness < pbestfitness; pbestpos(update, :) = pos(update, :); pbestfitness(update) = fitness(update); % 更新全局最优解 [tempgbestfitness, tempgbestid] = min(pbestfitness); if tempgbestfitness < gbestfitness gbestfitness = tempgbestfitness; gbestpos = pbestpos(tempgbestid, :); end % 输出结果 fprintf('Iteration %d: Best fitness = %f\n', iter, gbestfitness); end bestpos = gbestpos; bestfitness = gbestfitness; end ``` 使用方法: 定义一个目标函数,例如: ```matlab function y = sphere(x) y = sum(x.^2); end ``` 然后调用`pso`函数: ```matlab fobj = @sphere; dim = 10; lb = -100; ub = 100; maxiter = 100; npop = 50; c1 = 2; c2 = 2; w = 0.7; [bestpos, bestfitness] = pso(fobj, dim, lb, ub, maxiter, npop, c1, c2, w); ``` 其中,`dim`是变量维度,`lb`和`ub`分别是变量的下界和上界,`maxiter`是最大迭代次数,`npop`是粒子数,`c1`和`c2`是学习因子,`w`是惯性权重。`bestpos`是最优解,`bestfitness`是最优解对应的目标函数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值