目录
基于运动编码粒子群优化(MPSO)的目标路径搜索算法是一种有效的路径规划方法,它通过模拟鸟群、鱼群等生物的社会行为,寻找最优的路径。该算法将粒子群的运动模型与粒子的位置、速度、加速度等运动学参数相结合,通过不断迭代更新粒子的位置和速度,寻找最优解。
一、MPSO算法的数学公式
MPSO算法的数学公式如下:
-
粒子的速度更新公式:
v^t = wv^(t-1) + c1r1(pbest^t - present^t) + c2r2(gbest^t - present^t)(1)
其中,v^t表示第t次迭代时粒子的速度;w表示粒子的惯性权重;c1和c2表示粒子的个体和群体加速常数;r1和r2表示[0,1]之间的随机数;pbest^t表示第t次迭代时粒子的个体最优位置;gbest^t表示第t次迭代时粒子群的全局最优位置;present^t表示第t次迭代时粒子的当前位置。 -
粒子的位置更新公式:
x^t = x^(t-1) + v^(t)(2)
其中,x^t表示第t次迭代时粒子的位置。
在MPSO算法中,粒子的运动轨迹不仅受到自身惯性的影响,还受到个体和群体行为的引导。其中,惯性权重w模拟了粒子保持自身速度和方向运动的趋势,个体和群体加速常数c1和c2模拟了粒子向个体最优和群体最优方向运动的趋势。随机数r1和r2模拟了粒子在运动过程中的随机性。
二、MPSO算法的实现步骤
MPSO算法的实现步骤如下:
- 初始化粒子群的位置和速度,设定惯性权重w、个体和群体加速常数c1和c2等参数。
- 计算每个粒子的适应度值,根据适应度值更新粒子的个体最优位置pbest和全局最优位置gbest。
- 根据公式(1)和公式(2)更新粒子的速度和位置。
- 判断是否达到终止条件,如达到则结束迭代,否则返回步骤2。
- 输出全局最优位置gbest以及对应的路径。
在实现过程中,需要注意以下几点:
- 适应度函数的设定:根据目标路径搜索问题的特点,设计合适的适应度函数,用于评估粒子的优劣。适应度函数应该能够充分考虑路径的长度、安全性、时间等因素。
- 粒子群的初始化:初始化粒子群的位置和速度,应该保证粒子群的多样性,避免过早陷入局部最优解。
- 惯性权重的选择:惯性权重w对粒子群的搜索能力有着重要影响。较小的w会使粒子更快地收敛到最优解附近,但可能会过早停止搜索;较大的w会使粒子在搜索过程中保持较大的步长,有利于探索更广阔的搜索空间,但可能会浪费时间在无效的搜索区域。需要根据具体情况进行调整。
- 个体和群体加速常数的选择:个体和群体加速常数c1和c2也影响着粒子群的搜索能力。较小的c1和c2会使粒子更倾向于向个体和群体最优位置靠近,有利于快速收敛到最优解,但可能会过早停止搜索;较大的c1和c2会使粒子更倾向于随机搜索,有利于探索更广阔的搜索空间,但可能会浪费时间在无效的搜索区域。需要根据具体情况进行调整。
- 终止条件的设定:根据问题的特点设定合适的终止条件,如最大迭代次数、最小适应度值等。
三、MPSO的核心程序
clc;
clear;
close all;
%% Create the search scenario
model = CreateModel(); % Create search map and parameters
CostFunction=@(x) MyCost(x,model); % Cost Function
nVar = model.n; % Number of Decision Variables = searching dimension of PSO = number of movements
VarSize=[nVar 2]; % Size of Decision Variables Matrix
VarMin=-model.MRANGE; % Lower Bound of particles (Variables)
VarMax = model.MRANGE; % Upper Bound of particles
%% PSO Parameters
MaxIt=100; % Maximum Number of Iterations
nPop=1000; % Population Size (Swarm Size)
w=1; % Inertia Weight
wdamp=0.98; % Inertia Weight Damping Ratio
c1=2.5; % Personal Learning Coefficient
c2=2.5; % Global Learning Coefficient
alpha= 2;
VelMax=alpha*(VarMax-VarMin); % Maximum Velocity
VelMin=-VelMax; % Minimum Velocity
%% Initialization
% Create an Empty Particle Structure
empty_particle.Position=[];
empty_particle.Velocity=[];
empty_particle.Cost=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];
% Initialize Global Best
GlobalBest.Cost = -1; % Maximization problem
% Create an empty particle matrix, each particle is a solution (searching path)
particle=repmat(empty_particle,nPop,1);
% Initialization Loop
for i=1:nPop
% Initialize Position
particle(i).Position=CreateRandomSolution(model);
% Initialize Velocity
particle(i).Velocity=zeros(VarSize);
% Evaluation
costP = CostFunction(particle(i).Position);
particle(i).Cost= costP;
% Update Personal Best
particle(i).Best.Position=particle(i).Position;
particle(i).Best.Cost=particle(i).Cost;
% Update Global Best
if particle(i).Best.Cost>GlobalBest.Cost
GlobalBest=particle(i).Best;
end
end
% Array to Hold Best Cost Values at Each Iteration
BestCost=zeros(MaxIt,1);
%% PSO Main Loop
for it=1:MaxIt
for i=1:nPop
% Update Velocity
particle(i).Velocity = w*particle(i).Velocity ...
+ c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
+ c2*rand(VarSize).*(GlobalBest.Position-particle(i).Position);
% Update Velocity Bounds
particle(i).Velocity = max(particle(i).Velocity,VelMin);
particle(i).Velocity = min(particle(i).Velocity,VelMax);
% Update Position
particle(i).Position = particle(i).Position + particle(i).Velocity;
% Update Position Bounds
particle(i).Position = max(particle(i).Position,VarMin);
particle(i).Position = min(particle(i).Position,VarMax);
% Evaluation
costP = CostFunction(particle(i).Position);
particle(i).Cost = costP;
% Update Personal Best
if particle(i).Cost > particle(i).Best.Cost
particle(i).Best.Position=particle(i).Position;
particle(i).Best.Cost=particle(i).Cost;
% Update Global Best
if particle(i).Best.Cost > GlobalBest.Cost
GlobalBest=particle(i).Best;
end
end
end
% Update Best Cost Ever Found
BestCost(it)=GlobalBest.Cost;
% Inertia Weight Damping
w=w*wdamp;
% Show Iteration Information
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
end
%% Results
% Updade Map in Accordance to the Target Moves
targetMoves = model.targetMoves; % Number of Target Moves (Zero means static)
moveDir = DirToMove(model.targetDir); % Direction of the Target Movement
moveArr = targetMoves*moveDir;
updatedMap = noncircshift(model.Pmap, moveArr);
newModel = model;
newModel.Pmap = updatedMap;
% Plot Solution
figure(1);
path=PathFromMotion(GlobalBest.Position,model); % Convert from Motion to Cartesian Space
PlotSolution(path,newModel);
% Plot Best Cost Over Iterations
figure(2);
plot(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
up2202