【路径规划】基于萤火虫算法求解带路障路径规划问题matlab源码 仿生群智能优化算法是近些年来国内外学者研究的热点问题其主要的思想是研究或者模仿自然界群体生活的生物的社会行为而构造的随机搜索方法。目前研究比较多的有两种算法蚁群算法(ACO)和粒子群算法(PSO)。有研究结果表明仿生群智能优化算法为许多应用领域提供了新思路和新方法。\ 2005年印度学者K.N.Krishnanand和D.Ghose在IEEE群体智能会议上提出了一种新的群智能优化算法人工萤火虫群优化(Glowworm Swarm Optimization, GSO)算法。2009年剑桥学者Xin-She Yang根据自然界中萤火虫的发光行为提出萤火虫算法(Firefly Algorithm, FA)。自这两种萤火虫算法提出以来各国学者对这两种算法进行了研究、改进和应用。经过几年的发展在连续空间的寻优过程和一些生产调度方面萤火虫算法具有良好的应用前景。\ GSO和FA有相似的方面但在具体实现方面有一定差异。本文具体介绍和分析了这两种算法及其改进算法。GSO算法在GSO算法中每一只人工萤火虫散步在解空间中这些萤火虫带着荧光并且拥有各自的视线范围称为决策域(local-decision range)。它们的亮度与自己所在位置上的目标值有关。越亮的萤火虫表示它所在的位置越好即有较优的目标函数值。萤火虫会在决策域范围内寻找邻居集合在集合当中越亮的邻居拥有越高的吸引力吸引此萤火虫往这个方向移动每一次的飞行方向会随着挑选的邻居不同而改变。此外决策域范围的大小会受到邻居数量的影响当邻居密度越低萤火虫的决策半径会加大以寻找更多的邻居当邻居密度越高它的决策半径会缩小。最后大部分萤火虫会聚集在多个位置上即达到极值点。简单的说GSO算法主要包含四个阶段萤火虫的部署(初始化)、荧光素更新、位置更新阶段和决策半径更新阶段。7.1.1 闪光模式随着进化萤火虫已经进化到可以通过多种方式控制光的发射从而产生不同的交配信号。它们通过改变如下参数来产生不同的信号发光的颜色发光的亮度雄性闪光和雌性闪光-相位差每次闪光持续时间每周期闪光次数闪光时间连续发光或闪光脉冲序列。Kaipa和Ghose (2017)用不同的例子来描述这些闪光模式例如使用Lampyrus萤火虫一种在欧洲常见的萤火虫只有雌性才有发光的能力。她在草地上扭动着身体把光线从一个方向扫到另一个方向以吸引四处游荡的雄性萤火虫的注意。对于Lamprophorustenebrosus萤火虫雄性和雌性都具有发光能力但雌性没有翅膀其类似于Lampyrus利用光线吸引配偶。在一些物种中雌性使用不同的模式如长闪光发光在间隔时间内并不完全熄灭。当雄性在10英尺远的地方能感觉到这种模式时它们就会飞向雌性。这些闪光模式是物种特有的例如在Photinus这一类萤火虫中雄性通过在地面上爬行开始交配发出各种各样的光并观察附近雌性的反应信号。在Photinus consanguineus中雄萤火虫发出两道闪光雄萤火虫停顿一下接着又发出两道闪光它重复这个模式。在雄性发出第二次闪光后雌性会在一秒钟内做出回应。在Photinus castus中雄萤火虫发出长长的闪光雌萤火虫立即做出回应。尽管P. consanguineus和P. castus的结构非常类似但根据它们发光的模式不同它们被认为是不同的物种。尽管它们经常一起飞行但是不会出现杂交的情况但根据它们发光的模式不同它们被认为是不同的物种但它们经常一起飞行。群体交配上面提到的物种有一个共同点不管是雄性还是雌性不管是谁在吸引另一个都需要一个不间断的视线这样他们才能感知到信号并做出回应。在一些视觉杂乱的地区比如东南亚的红树林沼泽要获得如此不间断的视线并不容易。因此在这些地区发现的物种没有选择个体求偶。这里的萤火虫而是在树上或洞穴里成群结队因为这样游走的萤火虫就很容易找到交配对象。如果最初没有群体那么通过相互的光吸引萤火虫可能会形成一个核团。在形成这些群体的过程中存在着竞争这就导致了不止一个更大的群体而这些更大的群体会进一步吸引附近更小的核因为它们的平均光发射量更高这意味着找到配偶的可能性更高。萤火虫群优化算法针对萤火虫和萤火虫群的行为Krishnanand和Ghose(2005)[1]提出了萤火虫群优化算法(Glowworm Swarm OptimizationGSO)并使用于诸多应用。最初GSO的开发目标是提供数值优化问题的解决方案而不是确定全局最优但是由于GSO的分散决策和移动协议它在机器人等领域做出了更多的贡献。最初受萤火虫启发GSO在随机搜索空间中随机分布一组或一群代理代理间通过其他行为机制相互影响而这些机制在其自然界中的对应物中是不存在的。算法的基本工作基于以下三种机制适应度广播\ 萤火虫有一种叫做荧光素(luciferin)的色素可以使萤火虫发光。萤火虫体内荧光素的含量决定了它们在目标空间中的位置的适应度。正趋性\ 萤火虫被比自己亮的邻居吸引因此开始向它移动。当有多个这样的邻居时它利用概率机制来选择一个。自适应邻域\ 每个萤火虫利用一个自适应邻域来识别邻居该邻域由一个具有可变范围rdi的局部决策域定义该域的边界是一个硬限制的感知范围rs(0\算法虽然该算法被解释为寻找多峰函数的多个最优解但可以通过简单修改用于最小化问题。最初GSO将萤火虫随机地放置在搜索空间中使它们分布得很好。初始时每只萤火虫体内的荧光素含量为零。该算法的单位周期包括荧光素更新阶段、移动阶段和邻域范围更新阶段如图1所示。图1 GSO算法流程 clc; clear; close all;%% Problem DefinitionmodelCreateModel();model.n3; % number of Handle PointsCostFunction(x) MyCost(x,model); % Cost FunctionnVarmodel.n; % Number of Decision VariablesVarSize[1 nVar]; % Size of Decision Variables MatrixVarMin.xmodel.xmin; % Lower Bound of Variables VarMax.xmodel.xmax; % Upper Bound of Variables VarMin.ymodel.ymin; % Lower Bound of Variables VarMax.ymodel.ymax; % Upper Bound of Variables%% GSO ParametersMaxIt50; % Maximum Number of IterationsnPop100; % Population Size (Swarm Size)w1; % Inertia Weight wdamp0.98; % Inertia Weight Damping Ratio c11.5; % Personal Learning Coefficient c21.5; % Global Learning Coefficient%RANGE rangeinit 5.0; rangeboundary 50.2;%LUCIFERIN luciferininit 25; luciferindecay 0.4; luciferin_enhancement 0.6;%Neighbors k_neigh 20; beta 0.5;step_size 5;%% Initialization% Create Empty Glowworm Structure emptyglowworm.Position[]; emptyglowworm.range[]; emptyglowworm.luciferin[]; emptyglowworm.Cost[]; emptyglowworm.Sol[]; emptyglowworm.neighbors[]; emptyglowworm.Best.Position[]; emptyglowworm.Best.Cost[]; empty_glowworm.Best.Sol[];% Initialize Global Best GlobalBest.Costinf;% Create glowworms Matrix glowwormrepmat(empty_glowworm,nPop,1);% Initialization Loop for i1:nPop % Initialize Position if i 1 glowworm(i).PositionCreateRandomSolution(model); else % Straight line from source to destination xx linspace(model.xs, model.xt, model.n2); yy linspace(model.ys, model.yt, model.n2); glowworm(i).Position.x xx(2:end-1); glowworm(i).Position.y yy(2:end-1); end% Initialize luciferin glowworm(i).luciferin.xrepmat( luciferin_init , 1 , nVar); glowworm(i).luciferin.yrepmat( luciferin_init , 1 , nVar); %Initialize range glowworm(i).range.x repmat( range_init , 1 , nVar); glowworm(i).range.y repmat( range_init , 1 , nVar); neighbors []; % Evaluation [glowworm(i).Cost, glowworm(i).Sol]CostFunction(glowworm(i).Position); % Update Personal Best glowworm(i).Best.Positionglowworm(i).Position; glowworm(i).Best.Costglowworm(i).Cost; glowworm(i).Best.Solglowworm(i).Sol; % Update Global Best if glowworm(i).Best.CostGlobalBest.Cost GlobalBestglowworm(i).Best; endend% Array to Hold Best Cost Values at Each Iteration BestCostzeros(MaxIt,1);for it1:MaxItfor i1:nPop % x Part % Update luciferin %disp(glowworm(i).luciferin.x); glowworm(i).luciferin.x (1-luciferin_decay).*glowworm(i).luciferin.x luciferin_enhancement.*(glowworm(i).Cost/10); %disp(glowworm(i).luciferin.x); for p 1:nVar glowworm(i).range.y(p) min(range_boundary,max(0.1,glowworm(i).range.y(p) (beta*(k_neigh-size(neighbors.y,1))))); end %disp(glowworm(i).range.y); % Evaluation [glowworm(i).Cost, glowworm(i).Sol]CostFunction(glowworm(i).Position); % Update Personal Best if glowworm(i).Costglowworm(i).Best.Cost glowworm(i).Best.Positionglowworm(i).Position; glowworm(i).Best.Costglowworm(i).Cost; glowworm(i).Best.Solglowworm(i).Sol; end % Update Global Best if glowworm(i).Best.CostGlobalBest.Cost %disp(glowworm(i).luciferin); GlobalBestglowworm(i).Best; end end % Update Best Cost Ever Found BestCost(it)GlobalBest.Cost; % 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%% Resultsfigure; plot(BestCost,LineWidth,2); xlabel(Iteration); ylabel(Best Cost); grid on;​