@wuqi0616
2017-06-22T10:55:07.000000Z
字数 9293
阅读 1205
三轴运动平台
MATLAB命令窗输入
load data;(载入待辨识数据)
ident;(输入辨识箱gui调用函数)
三原则:
- Collision avoidance
- Velocity Matching
- Flock Centering
更新策略:
acceleration parameter :reflect the weighting of stochastic acceleration terms that pull each particle towards pbest and gbest positions.
PSO的优点:
high speed of convergence
PSO的缺点:
traps in local optimum (high dimensional problem)
convergence rate decreased when reaching a near optimal solution
PSO以往改进的策略
代码:
%% 清除上次程序
clear ; clc; format long;
%% 设置随机数
% ctime = datestr(now, 30);
% tseed = str2num(ctime((15 - 5) : end)) ;
rand('seed', 0);
%% 程序计时
tic ;
%% 导入数据
load matlab; clear y;
%% 参数配置
c1 = 2 ; %学习因子1
c2 = 2 ; %学习因子2
wmax = 0.7 ; wmin = 0.7 ;
Dimension=4; %搜索维度
Size=40; %种群大小
Tmax=1000; %最大迭代次数
Xmax=[5,5,5,5]; %位置上界
Xmin=[-5,-5,-5,-5]; %位置下界
Vmax=Xmax-Xmin; %速度上界
Vmin=Xmin-Xmax; %速度下界
Position=zeros(Dimension,Size);
Velocity=zeros(Dimension,Size);
fz=zeros(Size,1);
fitness_p=zeros(Size,1);
Best_fitness=zeros(Tmax,1);
%% 初始化粒子位置与速度
for i=1:Dimension
for j=1:Size
Position(i,j)=Xmin(i)+(Xmax(i)-Xmin(i))*rand;
Velocity(i,j)=Vmin(i)+(Vmax(i)-Vmin(i))*rand;
end
end
Pbest_position=Position;%粒子的历史最优位置,初始值为粒子的起始位置,存储每个粒子的历史最优位置
% Gbest_position=Position(:,1);%全局最优的那个粒子所在位置,初始值认为是第1个粒子
for k=1:Size
Pos=Position(:,k);
fz(k)=fitness(y2,u,Pos,Dimension);
end
[Gbest_Fitness,I]=min(fz);%求出所有适应值中最小的那个适应值,并获得该粒子的位置
Gbest_position=Position(:,I);%取最小适应值的那个粒子的位置,即I列
%% 主循环,迭代
for itrtn=1:Tmax
time(itrtn)=itrtn;
Weight= wmax - (wmax - wmin) / Tmax * itrtn ;
for i=1:Size
Velocity(:,i)=Weight*Velocity(:,i)+c1*rand*(Pbest_position(:,i)-Position(:,i))+c2*rand*(Gbest_position-Position(:,i));
end
% 限制速度边界
for i=1:Size
for row=1:Dimension
if Velocity(row,i)>Vmax(row)
Velocity(row,i)=Vmax(row);
elseif Velocity(row,i)<Vmin(row)
Velocity(row,i)=Vmin(row);
else
end
end
end
Position=Position+Velocity;
%限制位置边界
for i=1:Size
for row=1:Dimension
if Position(row,i)>Xmax(row)
Position(row,i)=Xmax(row);
elseif Position(row,i)<Xmin(row)
Position(row,i)=Xmin(row);
else
end
end
end
%% 更新个体最优值、全局最优值
for i=1:Size
P_position=Position(:,i);%取一个粒子的位置
fitness_p(i)=fitness(y2,u,P_position,Dimension);
if fitness_p(i)< fz(i) %粒子的适应值比运动之前的适应值要好,更新原来的适应值
Pbest_position(:,i)=Position(:,i);
fz(i)=fitness_p(i);
end
if fz(i)<Gbest_Fitness
Gbest_Fitness=fz(i);
end
end
[Gbest_Fitness_new,I]=min(fz);%更新后的所有粒子的适应值,取最小的那个,并求出其编号
Best_fitness(itrtn)=Gbest_Fitness_new; %记录每一代的最好适应值
Gbest_position=Pbest_position(:,I);%最好适应值对应的个体所在位置
end
plot(time,Best_fitness);
xlabel('迭代的次数');ylabel('适应度值P_g');
%% 显示计算结果
disp('*************************************************************')
disp('函数的全局最优位置为:')
Solution=Gbest_position
disp('最后得到的优化极值为:')
fitness(y2,u,Solution,Dimension)
disp('*************************************************************')
%% 计时
toc;
因为适应度值一开始比较大,所以对适应度值取了对数显示,另外参数辨识结果如下:
*************************************************************
函数的全局最优位置为:
Solution =
1.257807729246555
-0.257806797468069
-0.000128262063525
0.000437879444396
最后得到的优化极值为:
ans =
3.258610870353867
*************************************************************
Simulink 模型搭建:
第一张拟合图参数是由工具箱拟合得到的,第二张图为SPSO拟合得到的,
cor kernel: Taking emotions into consideration,every individual in SEM updates strategy adaptively during program iterations.
三种情绪
- depressed
- calm
- passionate
SEPSO的算法步骤:
Step1: 在算法开始执行前,设置所有粒子的情绪指标为1,
Step2: 更新粒子的速度:
flow chart of SEPSO algorithm:
这里我不是很理解SEPSO的三种更新策略,根据SPSO的更新策略,很容易就能理解其更新公式中每个粒子都朝向自己历史最优的位置和整个群落最优位置前进。而SEPSO的更新策略中,当该粒子属于积极情绪时,它的更新公式可以理解为朝着群落最优位置逼近;当该粒子属于沉稳和消极情绪时都出现了,这一项虽然体现出了该粒子与其他粒子之间的关系,但是它的物理意义是什么文献中没有提及,况且其数量级取决于粒子的数量L,如果粒子数量庞大,那么该值就会淹没公式中的其它两项起到决定性作用。实验中,由于粒子不可能次次都跑到历史最优位置而导致情绪不断下降,从而一直落入第一种情况(消极情绪),然而该情绪迭代公式下,粒子新位置和速度会超出位置、速度搜索范围而被固定在最远位置和最大速度,从而出现恶性循环。
综合学习策略的速度更新公式为:
这里的可能代表着粒子群中任何一个粒子,也就是每个粒子都有向群落中其它粒子的历史最优解进行学习。传统的综合学习的策略是取决于一个随机的学习概率因子,对于群落中的每个粒子,CLPSO都会产生一个对应的学习概率,当需要更新该粒子的任何一维参数时,都采用随机生成一个随机数与进行比较,如果大于那么对应的该维参数就从自己的历史最优解学习;反之,如果小于那么该维参数将会向群落中其它粒子的历史最优点学习。
传统CLPSO中粒子相互学习的过程采用了竞标赛的选取过程:
CLPSO与SPSO的三大不同之处:
对于的选择问题,文献 10 给出了经验公式:
其中:
:是群落中粒子的个数。
CLPSO算法流程图:
其中:
:为refreshing gap,它表示一个阈值(粒子有多少代没有比历史最优解优秀),文献 10 给出其经验值为7
统一粒子群策略的速度更新公式为:
其中:
:代表了迭代次数
:代表了整个群落最好粒子的角标(全局最优)
:代表了领域内最好粒子的角标(局部最优)
:(unification factor)联合因子,决定了两项等式的权重和影响程度。
:(constriction factor)收缩因子,控制速度的范围
:随机量,由均匀分布组成,
引入进化算法的变异因子,公式也可以改进为:
其中:
:是正态分布生成的随机数代表了变异因子
UPSO的核心思想:
传统标准PSO的算法速度更新策略采用让粒子同时向群落中全局历史最优粒子位置和自身历史最优位置学习,其中向全局历史最优粒子位置学习代表算法的探索能力(exploration),向自身历史最优位置学习代表算法挖掘能力(exploitation)。因为参考全局历史最优粒子位置,算法会快速收敛到特定位置,往往会收敛于局部最优解;而参考自身历史最优位置能够使得算法具有更好的挖掘能力,降低算法陷入局部最优解的概率。因此找到一个合适的因子能够权衡两者就是UPSO算法的核心思想。
文献11通过实验给出了参数的建议值:
0.6 | 2.833 | 2.833 |
0.729 | 2.05 | 2.05 |
在大量实验下,第一组参数的效果要好于第二组
另外:
- 在引入进化算法的变异因子情况下,并且的效果要好于
- 在不引入进化算法的变异因子情况下,数据显示的效果都能增强传统PSO算法
SPSO | N=2 | N=3 | N=4 |
---|---|---|---|
a1 | -1.180216286 | -0.639023055 | -0.817572776 |
a2 | 0.18021527 | -0.452952629 | -0.278681102 |
a3 | / | 0.09197423 | -0.141702215 |
a4 | / | / | 0.237955436 |
b1 | -0.000191005 | -0.000151685 | 0.000153011 |
b2 | 0.000532902 | 0.000351656 | -0.000655469 |
b3 | / | 0.000329096 | 0.001589188 |
b4 | / | / | -0.000733588 |
MSE | 6.68E-04 | 6.35E-04 | 5.87E-04 |
UPSO | N=2 | N=3 | N=4 |
---|---|---|---|
a1 | -1.180216246 | 0.055509731 | 0.047145491 |
a2 | 0.18021523 | -0.106962951 | -0.848271048 |
a3 | / | -0.948550468 | -0.502905578 |
a4 | / | / | 0.304029307 |
b1 | -0.000191005 | 0.000823798 | 0.000110134 |
b2 | 0.000532902 | -0.002478179 | -0.000648701 |
b3 | / | 0.002907084 | 0.001744603 |
b4 | / | / | -0.000397024 |
MSE | 6.68E-04 | 6.97E-04 | 5.97E-04 |
MATLAB | N=2 | N=3 | N=4 |
---|---|---|---|
MSE | 6.35E-04 | 6.98E-04 | 6.96E-04 |