粒子群优化算法(MATLAB代码)


%% 初始化种群  
clear
%% Sphere
clear
f= @(x) x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x) +3 * x .* sin(4 * x); % 函数表达式      


N = 20;                         % 初始种群个数  
d = 1;                          % 可行解维数 ,x:一维优化变量 
ger = 100;                      % 最大迭代次数       
limit = [0, 50];               % 设置位置参数限制  
vlimit = [-10, 10];               % 设置速度限制  
w = 0.8;                        % 惯性权重  
c1 = 0.5;                       % 自我学习因子  
c2 = 0.5;                       % 群体学习因子   
figure(1);
ezplot(f,[0,0.01,limit(2)]);   %曲线

x = limit(1) + (  limit( 2 ) -  limit( 1)  ) .* rand(N, d);%初始种群的位置  

v = rand(N, d);                  % 初始种群的速度  
xm = x;                          % 每个个体的历史最佳位置  
ym = zeros(1, d);                % 种群的历史最佳位置  
fxm = ones(N, 1)*inf;               % 每个个体的历史最佳适应度  
fym = inf;                       % 种群历史最佳适应度  初始表示无穷大
hold on  
plot(xm, f(xm), 'ro');title('初始状态图');  
figure(2)  
%% 群体更新  
iter = 1;  
% record = zeros(ger, 1);          % 记录器  
while iter <= ger  
     fx = f(x) ; % 个体当前适应度     
     for i = 1:N        
        if fx(i)  <fxm(i) %更新个体
            fxm(i) = fx(i);     % 更新个体历史最佳适应度  
            xm(i,:) = x(i,:);   % 更新个体历史最佳位置(取值)  
        end   
     end  
    if  min(fxm)  < fym %更新群体
        [fym, nmin] = min(fxm);   % 更新群体历史最佳适应度  :值,索引
        ym = xm(nmin, :);      % 更新群体历史最佳位置  
    end  
    v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);% 速度更新  
    % 边界速度处理  
    v(v > vlimit(2)) = vlimit(2);  
    v(v < vlimit(1)) = vlimit(1);  
    x = x + v;% 位置更新  
    % 边界位置处理  
    x(x > limit(2)) = limit(2);  
    x(x < limit(1)) = limit(1);  
    record(iter) = fym;%最大值记录  
    x0 = 0 : 0.01 : limit(2);  
    subplot(1,2,1)
    plot(x0, f(x0), 'b-', x, f(x), 'ro');title('状态位置变化')
    subplot(1,2,2);plot(record);title('最优适应度进化过程')  
    pause(0.01)  
    iter = iter+1;  

end  

% x0 = 0 : 0.01 : limit(2);  
% figure(4);plot(x0, f(x0), 'b-', x, f(x), 'ro');title('最终状态位置')  
disp(['最小值:',num2str(fym)]);  
disp(['变量取值:',num2str(ym)]);  

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的粒子群优化算法MATLAB 代码示例: ```matlab function [gbest, fit_gbest] = PSO(fun, dim, lb, ub, max_iter, pop_size) % 初始化种群 pop = lb + (ub - lb) .* rand(pop_size, dim); % 初始化速度 v = zeros(pop_size, dim); % 初始化个体最优位置和适应度 pbest = pop; fit_pbest = feval(fun, pbest); % 初始化全局最优位置和适应度 [fit_gbest, gbest_idx] = min(fit_pbest); gbest = pbest(gbest_idx,:); % 迭代 for i = 1:max_iter % 更新速度和位置 v = v + rand(pop_size, dim) .* (pbest - pop) + rand(pop_size, dim) .* (gbest - pop); pop = pop + v; % 边界处理 pop(pop < lb) = lb(pop < lb); pop(pop > ub) = ub(pop > ub); % 计算适应度 fit_pop = feval(fun, pop); % 更新个体最优位置和适应度 idx = fit_pop < fit_pbest; pbest(idx,:) = pop(idx,:); fit_pbest(idx) = fit_pop(idx); % 更新全局最优位置和适应度 [tmp_fit, tmp_idx] = min(fit_pbest); if tmp_fit < fit_gbest fit_gbest = tmp_fit; gbest = pbest(tmp_idx,:); end end end ``` 其中,`fun` 是要优化的目标函数,`dim` 是变量的维度,`lb` 和 `ub` 分别是变量的下界和上界,`max_iter` 是最大迭代次数,`pop_size` 是种群大小。 使用时只需要将优化目标函数写成 MATLAB 函数形式,并调用 `PSO` 函数即可。例如,要优化的目标函数为 Rosenbrock 函数,则代码如下: ```matlab function f = rosenbrock(x) f = sum(100 * (x(2:end) - x(1:end-1).^2).^2 + (1 - x(1:end-1)).^2); end [gbest, fit_gbest] = PSO(@rosenbrock, 2, [-5,-5], [5,5], 100, 50); ``` 其中,`@rosenbrock` 表示 Rosenbrock 函数,`2` 表示变量的维度,`[-5,-5]` 和 `[5,5]` 分别是变量的下界和上界,`100` 是最大迭代次数,`50` 是种群大小。优化结果保存在 `gbest` 和 `fit_gbest` 中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值