1 简介

1.1 粒子群算法

粒子群优化算法(Particle Swarm Optimization,PSO)是一种模拟自然界中生物群觅 食行为相互合作机制从而找到问题最优解的群体智算法。该算法具有原理简单、易实现、 控制参数较少等优点,从而在不同领域都得到了广泛应用。PSO 算法通过群体中各粒 子间的相互合作及竞争,实现对区域内最优解的寻找,其基本思想是在解空间中随机选 择一群粒子并将它们随机分布至解空间,每个粒子的运动速度和方向决定粒子的下一位 置,粒子本身目前找到的历史最优解和整个群体找到的历史最优解影响着每个粒子下一 次的运动速度和方向,每个粒子都看作是目标函数的一个可行解,将粒子的位置值带入 适应度函数计算并评价解的好坏,最终得到全局最优解。

【路径规划】基于粒子群算法求解二维最短路径matlab源码_最优解

【路径规划】基于粒子群算法求解二维最短路径matlab源码_最优解_02

2 部分代码

clc;
  • 1.
clear;
  • 1.
close all;
  • 1.
%% Problem Definition
  • 1.
model=CreateModel();
  • 1.
model.n=3; % number of Handle Points
  • 1.
CostFunction=@(x) MyCost(x,model); % Cost Function
  • 1.
nVar=model.n; % Number of Decision Variables
  • 1.
VarSize=[1 nVar]; % Size of Decision Variables Matrix
  • 1.
VarMin.x=model.xmin; % Lower Bound of Variables
  • 1.
VarMax.x=model.xmax; % Upper Bound of Variables
  • 1.
VarMin.y=model.ymin; % Lower Bound of Variables
  • 1.
VarMax.y=model.ymax; % Upper Bound of Variables
  • 1.
%% PSO Parameters
  • 1.
MaxIt=500; % Maximum Number of Iterations
  • 1.
nPop=150; % Population Size (Swarm Size)
  • 1.
w=1; % Inertia Weight
  • 1.
wdamp=0.98; % Inertia Weight Damping Ratio
  • 1.
c1=1.5; % Personal Learning Coefficient
  • 1.
c2=1.5; % Global Learning Coefficient
  • 1.
% % Constriction Coefficient
  • 1.
% phi1=2.05;
  • 1.
% phi2=2.05;
  • 1.
% phi=phi1+phi2;
  • 1.
% chi=2/(phi-2+sqrt(phi^2-4*phi));
  • 1.
% w=chi; % Inertia Weight
  • 1.
% wdamp=1; % Inertia Weight Damping Ratio
  • 1.
% c1=chi*phi1; % Personal Learning Coefficient
  • 1.
% c2=chi*phi2; % Global Learning Coefficient
  • 1.
alpha=0.1;
  • 1.
VelMax.x=alpha*(VarMax.x-VarMin.x); % Maximum Velocity
  • 1.
VelMin.x=-VelMax.x; % Minimum Velocity
  • 1.
VelMax.y=alpha*(VarMax.y-VarMin.y); % Maximum Velocity
  • 1.
VelMin.y=-VelMax.y; % Minimum Velocity
  • 1.
%% Initialization
  • 1.
% Create Empty Particle Structure
  • 1.
empty_particle.Position=[];
  • 1.
empty_particle.Velocity=[];
  • 1.
empty_particle.Cost=[];
  • 1.
empty_particle.Sol=[];
  • 1.
empty_particle.Best.Position=[];
  • 1.
empty_particle.Best.Cost=[];
  • 1.
empty_particle.Best.Sol=[];
  • 1.
% Initialize Global Best
  • 1.
GlobalBest.Cost=inf;
  • 1.
% Create Particles Matrix
  • 1.
particle=repmat(empty_particle,nPop,1);
  • 1.
% Initialization Loop
  • 1.
for i=1:nPop
  • 1.
% Initialize Position
  • 1.
if i > 1
  • 1.
particle(i).Position=CreateRandomSolution(model);
  • 1.
else
  • 1.
% Straight line from source to destination
  • 1.
xx = linspace(model.xs, model.xt, model.n+2);
  • 1.
yy = linspace(model.ys, model.yt, model.n+2);
  • 1.
particle(i).Position.x = xx(2:end-1);
  • 1.
particle(i).Position.y = yy(2:end-1);
  • 1.
end
  • 1.
% Initialize Velocity
  • 1.
particle(i).Velocity.x=zeros(VarSize);
  • 1.
particle(i).Velocity.y=zeros(VarSize);
  • 1.
% Evaluation
  • 1.
[particle(i).Cost, particle(i).Sol]=CostFunction(particle(i).Position);
  • 1.
% Update Personal Best
  • 1.
particle(i).Best.Position=particle(i).Position;
  • 1.
particle(i).Best.Cost=particle(i).Cost;
  • 1.
particle(i).Best.Sol=particle(i).Sol;
  • 1.
% Update Global Best
  • 1.
if particle(i).Best.Cost<GlobalBest.Cost
  • 1.
GlobalBest=particle(i).Best;
  • 1.
end
  • 1.
end
  • 1.
% Array to Hold Best Cost Values at Each Iteration
  • 1.
BestCost=zeros(MaxIt,1);
  • 1.
%% PSO Main Loop
  • 1.
for it=1:MaxIt
  • 1.
for i=1:nPop
  • 1.
% x Part
  • 1.
% Update Velocity
  • 1.
particle(i).Velocity.x = w*particle(i).Velocity.x ...
  • 1.
+ c1*rand(VarSize).*(particle(i).Best.Position.x-particle(i).Position.x) ...
  • 1.
+ c2*rand(VarSize).*(GlobalBest.Position.x-particle(i).Position.x);
  • 1.
% Update Velocity Bounds
  • 1.
particle(i).Velocity.x = max(particle(i).Velocity.x,VelMin.x);
  • 1.
particle(i).Velocity.x = min(particle(i).Velocity.x,VelMax.x);
  • 1.
% Update Position
  • 1.
particle(i).Position.x = particle(i).Position.x + particle(i).Velocity.x;
  • 1.
% Velocity Mirroring
  • 1.
OutOfTheRange=(particle(i).Position.x<VarMin.x | particle(i).Position.x>VarMax.x);
  • 1.
particle(i).Velocity.x(OutOfTheRange)=-particle(i).Velocity.x(OutOfTheRange);
  • 1.
% Update Position Bounds
  • 1.
particle(i).Position.x = max(particle(i).Position.x,VarMin.x);
  • 1.
particle(i).Position.x = min(particle(i).Position.x,VarMax.x);
  • 1.
% y Part
  • 1.
% Update Velocity
  • 1.
particle(i).Velocity.y = w*particle(i).Velocity.y ...
  • 1.
+ c1*rand(VarSize).*(particle(i).Best.Position.y-particle(i).Position.y) ...
  • 1.
+ c2*rand(VarSize).*(GlobalBest.Position.y-particle(i).Position.y);
  • 1.
% Update Velocity Bounds
  • 1.
particle(i).Velocity.y = max(particle(i).Velocity.y,VelMin.y);
  • 1.
particle(i).Velocity.y = min(particle(i).Velocity.y,VelMax.y);
  • 1.
% Update Position
  • 1.
particle(i).Position.y = particle(i).Position.y + particle(i).Velocity.y;
  • 1.
% Velocity Mirroring
  • 1.
OutOfTheRange=(particle(i).Position.y<VarMin.y | particle(i).Position.y>VarMax.y);
  • 1.
particle(i).Velocity.y(OutOfTheRange)=-particle(i).Velocity.y(OutOfTheRange);
  • 1.
% Update Position Bounds
  • 1.
particle(i).Position.y = max(particle(i).Position.y,VarMin.y);
  • 1.
particle(i).Position.y = min(particle(i).Position.y,VarMax.y);
  • 1.
% Evaluation
  • 1.
[particle(i).Cost, particle(i).Sol]=CostFunction(particle(i).Position);
  • 1.
% Update Personal Best
  • 1.
if particle(i).Cost<particle(i).Best.Cost
  • 1.
particle(i).Best.Position=particle(i).Position;
  • 1.
particle(i).Best.Cost=particle(i).Cost;
  • 1.
particle(i).Best.Sol=particle(i).Sol;
  • 1.
% Update Global Best
  • 1.
if particle(i).Best.Cost<GlobalBest.Cost
  • 1.
GlobalBest=particle(i).Best;
  • 1.
end
  • 1.
end
  • 1.
end
  • 1.
% Update Best Cost Ever Found
  • 1.
BestCost(it)=GlobalBest.Cost;
  • 1.
% Inertia Weight Damping
  • 1.
w=w*wdamp;
  • 1.
% Show Iteration Information
  • 1.
if GlobalBest.Sol.IsFeasible
  • 1.
Flag=' *';
  • 1.
else
  • 1.
Flag=[', Violation = ' num2str(GlobalBest.Sol.Violation)];
  • 1.
end
  • 1.
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it)) Flag]);
  • 1.
% Plot Solution
  • 1.
figure(1);
  • 1.
PlotSolution(GlobalBest.Sol,model);
  • 1.
pause(0.01);
  • 1.
end
  • 1.
%% Results
  • 1.
figure;
  • 1.
plot(BestCost,'LineWidth',2);
  • 1.
xlabel('Iteration');
  • 1.
ylabel('Best Cost');
  • 1.
grid on;
  • 1.

3 仿真结果

【路径规划】基于粒子群算法求解二维最短路径matlab源码_lua_03

【路径规划】基于粒子群算法求解二维最短路径matlab源码_最优解_04

4 参考文献

[1]秦元庆, 孙德宝, 李宁,等. 基于粒子群算法的移动机器人路径规划[J]. 机器人, 2004, 26(003):222-225.

【路径规划】基于粒子群算法求解二维最短路径matlab源码_粒子群算法_05