综合学习的粒子群优化算法(CLPSO)(附MATLAB代码)

clpso综合学习的粒子群优化算法

在学习clpso前,最好先了解一下粒子群优化算法(pso)
粒子群优化算法(附MATLAB源码)

1.使用新的学习策略

  • 粒子不再使用自身的pbest和gbest来规划速度飞行。所有粒子的pbest都可能被用作指导粒子飞行的精英粒子样本

  • 有与pso不同的 p b e s t f i d pbest_{fi}^d pbestfid寻找策略

  • 每个粒子可以从不同粒子对应维度的pbest学习几代。不必学习某粒子的全部维度。(向相同的粒子学习所有维度)

  • 不像pso每一代都同时向pbest和gbest学习,clpso每个维度只在几代中向一个样本学习

  • 与PSO中的每个粒子同时学习两个范例(pbest,gbest)不同,CLPSO中的一个粒子的每个维度只会向一个范例学习。

2.算法公式

v i j = w ∗ v i j + c 1 ∗ r a n d ∗ ( p b e s t f i ( d ) d − x i j ) v_{ij}=w*v_{ij}+c_1*rand*(pbest_{fi(d)}^d-x_{ij}) vij=wvij+c1rand(pbestfi(d)dxij)

f i = [ f i ( 1 ) , f i ( 2 ) , . . . f i ( D ) ] f_i=[f_i(1),f_i(2),...f_i(D)] fi=[fi(1),fi(2),...fi(D)],定义了第i个粒子维度d应该学习哪个粒子的pbest p b e s t f i ( d ) d pbest_{fi(d)}^d pbestfi(d)d可以是包括自己在内的任何粒子相应维度(维度d)的pbest值。根据粒子的Pc值来决定选哪个粒子的pbest,Pc是学习概率,可以为粒子提供不同的值。

如何选择 p b e s t f i ( d ) d pbest_{fi(d)}^d pbestfi(d)d,即如何求 f i d f_{i}^d fid

​ 对粒子i的每个维度,我们提供一个随机值,如果这个随机值大于粒子i在该维度的Pc值,则向自身的pbest学习;随机值小于学习概率Pc,则向其他粒子的pbest学习。向其他粒子学习时,根据以下来判断哪个粒子:

  1. 从种群中速度没更新的粒子中随机寻找两个粒子

  2. 对比两个粒子的pbest的适应值,并选择更好的那个粒子的pbest。在clpso中,定义适应值越大越好,所以求极小化问题时,使用负函数值作为适应值

  3. 将更好的那个粒子的pbest作为该维度的学习粒子.如果是全是学习自己维度,则随机找一个维度,再随机找一个其他粒子在该维度的pbest学习

  4. 为了粒子更好的学习,减少浪费的时间。当粒子对一个pbest学习,在一定代内停止改进时,我们为粒子重新分配另一个粒子供学习。

    f i d f_i^d fid选择流程图

请添加图片描述

3.学习概率Pc

​ Pc,用在判断粒子是否需要选择其他粒子学习时使用。

公式:

请添加图片描述

图像:

请添加图片描述

​ 对同一问题,不同Pc值可能会有不同的结果。给每个粒子设置PC值,粒子在种群中具有不同程度的探索和开采能力,能够解决不同的问题。

​ 未旋转问题适用较小Pc值;旋转问题比不同Pc值对不同问题都有较好结果;简单单峰问题,不同Pc值有近似结果,但对多峰问题运行性能有较大影响。

4.算法流程

请添加图片描述

ps:种群数 k:当前代数 max_gen:最大代数 d:维度d

w:惯性权重 i :当前粒子,1-ps m:刷新间隔

f l a g i flag_i flagi:粒子没有进化的代数,超过m代则分配新的粒子

对比:

1.速度更新公式:

pso: v i j ( t + 1 ) = w v i j ( t ) + c 1 ∗ r a n d 1 ( t ) [ p b e s t i j ( t ) − x i j ( t ) ] + c 2 ∗ r a n d 2 ( t ) [ g b e s t g j ( t ) − x i j ( t ) ] v_{ij}(t+1)=wv_{ij}(t)+c_1*rand_1(t)[pbest_{ij}(t)-x_{ij}(t)]+c_2*rand_2(t)[gbest_{gj}(t)-x_{ij}(t)] vij(t+1)=wvij(t)+c1rand1(t)[pbestij(t)xij(t)]+c2rand2(t)[gbestgj(t)xij(t)]

clpso: v i j = w ∗ v i j + c 1 ∗ r a n d ∗ ( p b e s t f i ( d ) d − x i j ) v_{ij}=w*v_{ij}+c_1*rand*(pbest_{fi(d)}^d-x_{ij}) vij=wvij+c1rand(pbestfi(d)dxij)

2.学习策略

pso使用pbest和gbest学习,pbest为个体历史最优,gbest为当前全局历史最优。

clpso使用 p b e s t f i ( d ) d pbest_{fi(d)}^d pbestfi(d)d学习 , p b e s t f i ( d ) d pbest_{fi(d)}^d pbestfi(d)d可以是包括自身在内的所有粒子。根据学习概率Pc判断是否向自身学习。

3.可搜索范围

请添加图片描述

pso : r 1 i d = L 1 i d + L 2 i d = ∣ g b e s t d − X i d ∣ + ∣ p b e s t i d − X i d ∣ r_{1i}^d=L_{1i}^d+L_{2i}^d=|gbest^d-X_i^d|+|pbest_i^d-X_i^d| r1id=L1id+L2id=gbestdXid+pbestidXid

clpso : r 2 i d = m a x ( p b e s t j d , X i d ) − m i n ( p b e s t j d , X i d ) r_{2i}^d=max(pbest_j^d,X_i^d)-min(pbest_j^d,X_i^d) r2id=max(pbestjd,Xid)min(pbestjd,Xid)

简单来说,pso搜索范围就是粒子的位置和gbest,pbest差的和;clpso的搜索范围是 所有粒子的历史最优位置该粒子当前位置中,绝对值最大的差

4.跳出局部最优能力

clpso因为在停止进化几代后,会主动向随机其他粒子的pbest学习,所以有可能借助这个变量跳出局部最优。

pso由于同时受gbest和pbest的影响,当gbest和pbest位置接近时,粒子陷进去后,很难跳出局部最优区域。

5.源码

源码文件太多了不太好放,直接上传了。没积分要求,应该可以直接下
pso&clpso源码MATLAB

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
这里提供一个简单的粒子群优化算法图像融合的 MATLAB 代码,仅供参考: ```matlab clc; clear; % 读入需要融合的两幅图像 I1 = imread('image1.jpg'); I2 = imread('image2.jpg'); % 将两幅图像转化为灰度图像 I1_gray = rgb2gray(I1); I2_gray = rgb2gray(I2); % 初始化粒子群算法参数 num_particles = 50; % 粒子数量 max_iterations = 100; % 迭代次数 w = 0.729; % 惯性因子 c1 = 1.49445; % 学习因子1 c2 = 1.49445; % 学习因子2 % 随机生成粒子位置和速度 positions = rand(num_particles, 2) .* size(I1_gray); velocities = rand(num_particles, 2) .* size(I1_gray) - size(I1_gray) / 2; % 初始化全局最优位置和适应值 global_best_position = positions(1, :); global_best_fitness = Inf; % 粒子群迭代 for i = 1:max_iterations % 计算每个粒子的适应值 fitness_values = zeros(num_particles, 1); for j = 1:num_particles % 计算融合后图像的均方误差 T = imtranslate(I2_gray, positions(j, :) - size(I1_gray) / 2); fitness_values(j) = sum(sum((double(I1_gray) - double(T)).^2)) / numel(I1_gray); % 更新局部最优位置 if fitness_values(j) < global_best_fitness global_best_fitness = fitness_values(j); global_best_position = positions(j, :); end end % 更新粒子速度和位置 for j = 1:num_particles % 更新速度 velocities(j, :) = w * velocities(j, :) ... + c1 * rand(1) .* (global_best_position - positions(j, :)) ... + c2 * rand(1) .* (rand(1, 2) .* size(I1_gray) - positions(j, :)); % 更新位置 positions(j, :) = positions(j, :) + velocities(j, :); % 边界处理 positions(j, 1) = max(1, positions(j, 1)); positions(j, 2) = max(1, positions(j, 2)); positions(j, 1) = min(size(I1_gray, 2), positions(j, 1)); positions(j, 2) = min(size(I1_gray, 1), positions(j, 2)); end % 显示迭代过程 T = imtranslate(I2_gray, global_best_position - size(I1_gray) / 2); fused_image = uint8(0.5 * double(I1) + 0.5 * double(T)); imshow(fused_image); pause(0.1); end % 显示融合后的图像 T = imtranslate(I2_gray, global_best_position - size(I1_gray) / 2); fused_image = uint8(0.5 * double(I1) + 0.5 * double(T)); imshow(fused_image); ``` 需要注意的是,这个代码仅仅是一个简单的示例,实际上粒子群优化算法图像融合需要更加复杂的处理方法和更加精细的参数调整,如果需要更加专业的算法实现,建议参考相关文献或者寻求专业的图像处理公司的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值