您现在的位置:首页 >> 智能优化 >> 内容

基于PSO优化的路径规划避障系统仿真,沿着障碍物边缘平滑的进行转向

时间:2023/1/15 22:50:04 点击:

  核心提示:A237,包括程序操作录像...

1.完整项目描述和程序获取

>面包多安全交易平台:https://mbd.pub/o/bread/Y56Wk5Zw

>如果链接失效,可以直接打开本站店铺搜索相关店铺:

点击店铺

>如果链接失效,程序调试报错或者项目合作可以加微信或者QQ联系。

2.部分仿真图预览



3.算法概述

        在求解TSP这种整数规划问题的时候, PSO显然与ACO不同, PSO需要对算法本身进行一定的修改, 毕竟PSO刚开始是应用在求解连续优化问题上的. 在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的个数,每 个点(染色体)又有两个维度(x,y),在代码中用 posx 和 posy 表示一个种群。 通过每一代的演化,对粒子群进行演化操作,选择合适个体(最优路径)。

4.部分源码

...........................................................................

MaxIt=200;          % 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

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

        % 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

A237

作者:我爱C编程 来源:我爱C编程
本站最新成功开发工程项目案例
相关评论
发表我的评论
  • 大名:
  • 内容:
本类固顶
  • 没有
  • FPGA/MATLAB商业/科研类项目合作(www.store718.com) © 2025 版权所有 All Rights Reserved.
  • Email:1480526168@qq.com 站长QQ: 1480526168