Matlab粒子群算法(PSO)优化程序——调整权重、改进学习因子

粒子群算法( Particle Swarm Optimization, PSO)在应用的过程中主要调整权重,学习因子,才能对解决的问题有所针对性。下面有6种调整权重和学习因子:
一、调整粒子群算法的权重
1.线性递减权重
2.自适应调整权重
3.随机权重
二、调整粒子群算法的学习因子
1.收缩因子
2.同步学习因子
3.异步学习因子
目标函数如下:

function y=A11_01(x)

y=x(1)^2+x(2)^2-x(1)*x(2)-10*x(1)-4*x(2)+60;

一、调整粒子群算法的权重
1.线性递减权重
Shi.Y认为较大的权重惯性有利于全局搜索,较小的权重有利于局部搜索,他提出的线性递减权重刚好满足这样的需求。
在这里插入图片描述
一般而言,在这里插入图片描述k为当前迭代次数,T为最大迭代次数。

%粒子群 PSO  线性递减权重
clear 
clc

%%预设参数
n=100;
d=2; %变量个数
c1=2;
c2=2;
w=0.9;
K=100;
ws=0.9;
we=0.4;

%%分布粒子
x=-10+20*rand(n,d);
v=-5+10*rand(n,d);

%%计算适应度
fit=zeros(n,1);
for j=1:n
    fit(j)=A11_01(x(j,:));
end
%计算个体极值
pbest=x;
ind=find(min(fit)==fit);
gbest=x(ind,:);

%%更新速度与位置
for i=1:K
    for m=1:n
       v(m,:)=w*v(m,:) + c1*rand*(pbest(m,:)-x(m,:)) + c2*rand*(gbest-x(m,:));
       w=ws-(ws-we)*(i/K);
       
       v(m,find(v(m,:)<-10))=-10;
       v(m,find(v(m,:)>10))=10;
       
       x(m,:)=x(m,:)+0.5*v(m,:);
       x(m,find(x(m,:)<-10))=-10;
       x(m,find(x(m,:)>10))=10;
       
       %重新计算适应度
       fit(m)=A11_01(x(m,:));
       if x(m,:)<A11_01(pbest(m,:))
           pbest(m,:)=x(m,:);
       end
       if A11_01(pbest(m,:))<A11_01(gbest)
           gbest=pbest(m,:);
       end
    end
    fitnessbest(i)=A11_01(gbest);
end
plot(fitnessbest);
xlabel('迭代次数');
ylabel('适应度值');
title('迭代优化过程');

### 自适应惯性权重粒子群优化算法MATLAB实现 为了提高粒子群优化(Particle Swarm Optimization, PSO)算法性能,在调整粒子速度时引入自适应惯性权重可以有效平衡全局搜索能力和局部搜索能力。下面展示了一个基于自适应惯性权重策略的PSO算法MATLAB代码示例。 ```matlab function [bestPosition,bestFitness]=pso_adaptive_inertia_weight(fitnessfcn,nvars,LB,UB,popsize,maxiter) % 初始化种群位置和速度 pop = rand(popsize,nvars)*(UB-LB)+LB; v = zeros(size(pop)); % 记录个体历史最佳位置和个人最好成绩 pBestPos=pop; pBestScore=arrayfun(@(i)fitnessfcn(pop(i,:)),1:popsize); % 寻找群体当前的最佳解 [~,idx]=min(pBestScore); gBestPos=pBestPos(idx,:); gBestScore=min(pBestScore); w_max = 0.9; % 惯性权重重的最大 w_min = 0.4; % 惯性权重最小 c1 = 2; % 学习因子c1 c2 = 2; % 学习因子c2 for iter=1:maxiter % 更新惯性权重w w=w_max-(w_max-w_min)*iter/maxiter; for i=1:popsize r1=rand(); % 随机数r1用于计算认知部分 r2=rand(); % 随机数r2用于社会部分 % 更新第i个粒子的速度向量v[i] v(i,:) = ... w*v(i,:) + ... % 惯性项 c1*r1*(pBestPos(i,:)-pop(i,:)) +...% 认知项(个人经验) c2*r2*(gBestPos-pop(i,:)); % 社会项(群体共享信息) % 应用边界条件处理 pop(i,:) = max(min(pop(i,:)+v(i,:), UB), LB); % 如果新位置更优,则更新该粒子的历史记录 score=fitnessfcn(pop(i,:)); if score<pBestScore(i) pBestPos(i,:)=pop(i,:); pBestScore(i)=score; if score<gBestScore gBestPos=pop(i,:); gBestScore=score; end end end fprintf('Iteration:%d Best Fitness Value=%.8f\n',iter,gBestScore); end bestPosition=gBestPos; bestFitness=gBestScore; end ``` 此段程序实现了带有自适应惯性权重机制的标准PSO流程,其中`w_max` 和 `w_min`分别代表最大和最小惯性权重参数;通过迭代次数动态改变惯性权重来控制探索与开发之间的转换过程[^3]。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值