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

1 简介

1.1 粒子群算法

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

2 部分代码

clc;
clear;
close all;

%% Problem Definition

model=CreateModel();

model.n=3;  % number of Handle Points

CostFunction=@(x) MyCost(x,model);    % Cost Function

nVar=model.n;       % Number of Decision Variables

VarSize=[1 nVar];   % Size of Decision Variables Matrix

VarMin.x=model.xmin;           % Lower Bound of Variables
VarMax.x=model.xmax;           % Upper Bound of Variables
VarMin.y=model.ymin;           % Lower Bound of Variables
VarMax.y=model.ymax;           % Upper Bound of Variables


%% PSO Parameters

MaxIt=500;          % Maximum Number of Iterations

nPop=150;           % Population Size (Swarm Size)

w=1;                % Inertia Weight
wdamp=0.98;         % Inertia Weight Damping Ratio
c1=1.5;             % Personal Learning Coefficient
c2=1.5;             % Global Learning Coefficient

% % Constriction Coefficient
% phi1=2.05;
% phi2=2.05;
% phi=phi1+phi2;
% chi=2/(phi-2+sqrt(phi^2-4*phi));
% w=chi;               % Inertia Weight
% wdamp=1;             % Inertia Weight Damping Ratio
% c1=chi*phi1;         % Personal Learning Coefficient
% c2=chi*phi2;         % Global Learning Coefficient

alpha=0.1;
VelMax.x=alpha*(VarMax.x-VarMin.x);    % Maximum Velocity
VelMin.x=-VelMax.x;                    % Minimum Velocity
VelMax.y=alpha*(VarMax.y-VarMin.y);    % Maximum Velocity
VelMin.y=-VelMax.y;                    % Minimum Velocity

%% Initialization

% Create Empty Particle Structure
empty_particle.Position=[];
empty_particle.Velocity=[];
empty_particle.Cost=[];
empty_particle.Sol=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];
empty_particle.Best.Sol=[];

% Initialize Global Best
GlobalBest.Cost=inf;

% Create Particles Matrix
particle=repmat(empty_particle,nPop,1);

% Initialization Loop
for i=1:nPop
   
   % Initialize Position
   if i > 1
       particle(i).Position=CreateRandomSolution(model);
   else
       % Straight line from source to destination
       xx = linspace(model.xs, model.xt, model.n+2);
       yy = linspace(model.ys, model.yt, model.n+2);
       particle(i).Position.x = xx(2:end-1);
       particle(i).Position.y = yy(2:end-1);
   end
   
   % Initialize Velocity
   particle(i).Velocity.x=zeros(VarSize);
   particle(i).Velocity.y=zeros(VarSize);
   
   % Evaluation
  [particle(i).Cost, particle(i).Sol]=CostFunction(particle(i).Position);
   
   % Update Personal Best
   particle(i).Best.Position=particle(i).Position;
   particle(i).Best.Cost=particle(i).Cost;
   particle(i).Best.Sol=particle(i).Sol;
   
   % 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
       
       % x Part
       
       % Update Velocity
       particle(i).Velocity.x = w*particle(i).Velocity.x ...
           + c1*rand(VarSize).*(particle(i).Best.Position.x-particle(i).Position.x) ...
           + c2*rand(VarSize).*(GlobalBest.Position.x-particle(i).Position.x);
       
       % Update Velocity Bounds
       particle(i).Velocity.x = max(particle(i).Velocity.x,VelMin.x);
       particle(i).Velocity.x = min(particle(i).Velocity.x,VelMax.x);
       
       % Update Position
       particle(i).Position.x = particle(i).Position.x + particle(i).Velocity.x;
       
       % Velocity Mirroring
       OutOfTheRange=(particle(i).Position.x<VarMin.x | particle(i).Position.x>VarMax.x);
       particle(i).Velocity.x(OutOfTheRange)=-particle(i).Velocity.x(OutOfTheRange);
       
       % Update Position Bounds
       particle(i).Position.x = max(particle(i).Position.x,VarMin.x);
       particle(i).Position.x = min(particle(i).Position.x,VarMax.x);
       
       % y Part
       
       % Update Velocity
       particle(i).Velocity.y = w*particle(i).Velocity.y ...
           + c1*rand(VarSize).*(particle(i).Best.Position.y-particle(i).Position.y) ...
           + c2*rand(VarSize).*(GlobalBest.Position.y-particle(i).Position.y);
       
       % Update Velocity Bounds
       particle(i).Velocity.y = max(particle(i).Velocity.y,VelMin.y);
       particle(i).Velocity.y = min(particle(i).Velocity.y,VelMax.y);
       
       % Update Position
       particle(i).Position.y = particle(i).Position.y + particle(i).Velocity.y;
       
       % Velocity Mirroring
       OutOfTheRange=(particle(i).Position.y<VarMin.y | particle(i).Position.y>VarMax.y);
       particle(i).Velocity.y(OutOfTheRange)=-particle(i).Velocity.y(OutOfTheRange);
       
       % Update Position Bounds
       particle(i).Position.y = max(particle(i).Position.y,VarMin.y);
       particle(i).Position.y = min(particle(i).Position.y,VarMax.y);
       
       % Evaluation
      [particle(i).Cost, particle(i).Sol]=CostFunction(particle(i).Position);
       
       % 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;
           particle(i).Best.Sol=particle(i).Sol;
           
           % 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
   if GlobalBest.Sol.IsFeasible
       Flag=' *';
   else
       Flag=[', Violation = ' num2str(GlobalBest.Sol.Violation)];
   end
   disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it)) Flag]);
   
   % Plot Solution
   figure(1);
   PlotSolution(GlobalBest.Sol,model);
   pause(0.01);
   
end

%% Results

figure;
plot(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;

3 仿真结果

4 参考文献

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

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab科研辅导帮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值