粒子群算法的改进策略综述(及MATLAB代码实现)

一:粒子群优化算法(Partical Swarm Optimization PSO),粒子群中的每一个粒子都代表一个问题的可能解,通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。同时,PSO算法的缺点也是显而易见的:经典的粒子群算法随着粒子种群的进化,其多样性不断减小,导致了过早的快速收敛到局部最优。以下主要通过两个方面增强粒子群的迭代寻优能力。

二:经典的粒子群算法的寻优性能在很大程度上依赖于其惯性权重、学习因子参数的设置选择。由此,初始粒子的每一次迭代都进行了空间位置、速度的更新,忽略了不同代粒子间的差异性,应用了统一的固定参数 。

针对于这一问题在参数设置上:采用了线性递减的参数设置,以较大的惯性权重和学习因子为开局,有利于增加初始粒子群的全局迭代寻优能力;以较小的惯性权重和学习因子为结束,有利于加强最终粒子群跳出局部最好解。

(1)通常对粒子群算法的参数设置(惯性权重和学习因子进行改进):

1:线性递减的惯性权重和学习因子

下列公式为动态线性递减的惯性权重和学习因子,一般来讲w_{max}=0.9w_{min}=0.4;c_{max}=1.5,c_{min}=0.5,由此可以得到线性递减的惯性权重和学习因子,其递减情况如下图所示。


w=w_{max}-\frac{w_{max}-w_{min}}{t_{max}}*t

c_{1}=c_{2}=c_{max}-\frac{c_{max}-c_{min}}{t_{max}}*t

2:非线性递减的惯性权重和学习因子

同理可以得到非线性递减的惯性权重和学习因子:

w=(w_{max}-w_{min}-d_{1})e^{\frac{1}{1+d_{2}*t/t_{max}}}

c_{1}=c_{2}=(c_{max}-c_{min}-d_{1})e^{\frac{1}{1+d_{2}*t/t_{max}}}

 (2)融合其他算法,形成混合算法(以遗传算法为例):

针对于经典的粒子群优化算法易陷入局部最好解,在迭代后期粒子种群多样性减少的
问题,将遗传算法中的遗传操作与动态参数的粒子群算法结合起来 ,提出改进的粒子群
优化算法(简写为GW-PSO算法),通过交叉因子更新当前粒子群的空间位置,这个过程产生新的粒子群更加符合目标优化函数,得到了更好的适应度,进而提高了经典的粒子群算法的局部搜索能力;利用变异因子对影响新的粒子种群的产生,提高粒子的多样性和全局搜索能力。在进行交叉因子操作时,将每一代的粒子的交叉概率设置为𝑝𝑐,每次交叉与上一代的全局最优粒子进行交叉,得到的后一代即为新产生的更符合目标优化函数的粒子种群。(以下为数学公式依据)

GApop_{id}^{n+1}=\varepsilon \times GApop_{id}^{n}+(1-\varepsilon )\times gbest_{id}^{n}

 参考以上公式对粒子群进行交叉操作,以下公式对粒子群进行变异操作,增强粒子群在迭代后期的突变能力,有利于其突破局部最优解。

GApop_{id}^{n+1}=GApop_{id}^{n}+r_{id}^{n}

#############交叉变异因子部分代码
for z=1:N
   GApop1(z,:)=GApop(e(z),:);
 end
[n1 m1]=size(GApop1);
thebest=gbest'*ones(1,n1);
 GApops=0.5*GApop1+0.5*thebest';
 %进行变异操作
 %max1=max(max(gbest));
% min1=min(min(gbest));
% % max2=round(max1);
% % min2=round(min1);
c3=randperm(sizepop);
b1=c3(1:M);
e1=b1';
for z1=1:M
  GApop2(z1,:)=GApop(e1(z1),:);
end
GApops1=GApop2+randi([popmin,popmax],M,Dim);
GApops2=[GApops;GApops1];
pop=GApops2;

三:调用经典函数进行测试,检验优化效果。

主函数调用命令,以及待测试函数声明:

maxgen=100;popmax=200;popmin=-200;index=1;esp=10^-10;
[fitnessgbest,gen]= pso1( maxgen,popmax,popmin,index,esp);   
zuicha=max(fitnessgbest)
zuihao=min(fitnessgbest)
pingjun=mean(fitnessgbest)
fangcha=std(fitnessgbest)
[bestfitness bestindex] = min(fitnessgbest)
gen(bestindex)
mean(gen)

    case 1 %Sphere函数
        y=sum(x.^2);

    case 2 %Rosenbrock函数
        y=0;
        for i=2:length(x)
        	y=y+100*(x(i)-x(i-1)^2)^2+(x(i-1)-1)^2;
        end
    case 3 %Rastrigin函数
        s = 0;
        for j = 1:length(x)
            s = s+(x(j)^2-10*cos(2*pi*x(j)));
        end
        y = 10*length(x)+s;
    case 4 %Griewank函数
        fr = 4000;
        s = 0;
        p = 1;
        for j = 1:length(x); s = s+x(j)^2; end
        for j = 1:length(x); p = p*cos(x(j)/sqrt(j)); end
        y = s/fr-p+1;

end

选取一个为例作图分析,横坐标为迭代次数,纵坐标为适应度:

 ddhttps://download.csdn.net/download/qq_42430957/85460865?spm=1001.2014.3001.5503

欢迎交流,微信:gzry3360

  • 10
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
以下是一个简单的粒子群算法改进的遗传算法MATLAB 代码示例: ```matlab % 遗传算法参数 populationSize = 50; % 种群大小 chromosomeLength = 10; % 染色体长度 mutationRate = 0.01; % 变异率 tournamentSize = 5; % 锦标赛选择中的竞争个体数量 maxGenerations = 100; % 最大迭代次数 % 粒子群算法参数 particleSize = populationSize; % 粒子数量 inertiaWeight = 0.8; % 惯性权重 cognitiveWeight = 2; % 认知权重 socialWeight = 2; % 社会权重 % 初始化种群和粒子位置 population = randi([0, 1], populationSize, chromosomeLength); particles = population; % 初始化速度和个体历史最优位置 velocities = zeros(size(particles)); personalBests = particles; % 计算适应度值 fitness = calculateFitness(population); % 初始化全局最优位置和适应度值 globalBest = particles(fitness == max(fitness), :); globalFitness = max(fitness); % 迭代优化过程 for generation = 1:maxGenerations % 遗传算法操作 parents = tournamentSelection(population, fitness, tournamentSize); offspring = crossover(parents); offspring = mutation(offspring, mutationRate); % 更新种群 population = [parents; offspring]; % 更新适应度值 fitness = calculateFitness(population); % 更新个体历史最优位置 for i = 1:particleSize if fitness(i) > calculateFitness(personalBests(i, :)) personalBests(i, :) = particles(i, :); end end % 更新全局最优位置 [maxFitness, index] = max(fitness); if maxFitness > globalFitness globalBest = particles(index, :); globalFitness = maxFitness; end % 粒子群算法操作 r1 = rand(size(particles)); r2 = rand(size(particles)); velocities = inertiaWeight * velocities + cognitiveWeight * r1 .* (personalBests - particles) + socialWeight * r2 .* (globalBest - particles); particles = particles + velocities; % 边界约束处理 particles(particles < 0) = 0; particles(particles > 1) = 1; end % 输出全局最优解 disp('Global Best Solution:'); disp(globalBest); % 适应度函数示例(此处为一个简单的多峰函数) function fitness = calculateFitness(population) fitness = sum(population, 2); end % 锦标赛选择函数 function parents = tournamentSelection(population, fitness, tournamentSize) parents = zeros(size(population)); for i = 1:size(population, 1) competitors = randperm(size(population, 1), tournamentSize); [~, index] = max(fitness(competitors)); parents(i, :) = population(competitors(index), :); end end % 单点交叉函数 function offspring = crossover(parents) offspring = zeros(size(parents)); for i = 1:2:size(parents, 1) crossoverPoint = randi([1, size(parents, 2)]); offspring(i, :) = [parents(i, 1:crossoverPoint), parents(i+1, crossoverPoint+1:end)]; offspring(i+1, :) = [parents(i+1, 1:crossoverPoint), parents(i, crossoverPoint+1:end)]; end end % 变异函数 function mutatedOffspring = mutation(offspring, mutationRate) mutatedOffspring = offspring; for i = 1:size(mutatedOffspring, 1) for j = 1:size(mutatedOffspring, 2) if rand < mutationRate mutatedOffspring(i, j) = 1 - mutatedOffspring(i, j); end end end end ``` 请注意,这只是一个示例代码,适应度函数是一个简单的多峰函数。你可以根据你的具体问题和适应度函数进行相应的修改和调整。此外,该代码中的遗传算法粒子群算法的参数也可以根据你的需求进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空集是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值