|
5-ACO+BFO算法(蚁群算法+细菌觅食算法)的栅格路径寻优计算
链接:https://pan.baidu.com/s/1m84BIliQPIWzQW_nPbp4tQ 密码:5x38
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1
主程序如下:
- % ACO+BFO混合算法
- clc,clear,close all
- warning off
- %% MAP
- load('data2.mat');
- K = 4; % 与节点自身相连的节点数
- [x,y,A,dij, citynum,a,b] = init_map(data2,K);
- %% 目标
- startpoint=39; % 起始节点
- endpoint=18; % 终止节点
- %% BFO优化算法 参数
- % maxiter = 100; % 最大迭代次数
- sizepop = 20; % 种群数量
- Nc = 20; % 趋化次数
- Ns = 4; % 游动次数
- Nre = 2; % 复制次数
- Ned = 2; % 驱散(迁移)次数
- Sr = ceil( sizepop/2 ); % 复制(分裂)次数
- Ped = 0.25; % 细菌驱散(迁移)概率
- nvar = 3; % 3个未知量 --- 起始节点到目标节点之间找3个点出来
- popmin = [1, 1, 1]; % x 下限
- popmax = [51, 51, 51]; % x 上限
- Cmin = -1; % 最小步长
- Cmax = 1; % 最大步长
- C(:,1:nvar) = 1*ones(sizepop,nvar); % 翻转选定方向后,单个细菌前进的步长
- %% ACO算法参数
- Rou = 0.8; % 信息素增量强度
- P0 = 0.1; % 转移概率
- %% 初始化种群
- for i=1:sizepop
- pop(i,:) = round(popmin + (popmax-popmin).*rand(1,nvar)); % 初始化个体
- [path{i}, fitness(i)] = fun_dijkstra([startpoint, pop(i,:), endpoint], A, dij ); % 适应度值
- C(i,:) = Cmin + (Cmax-Cmin).*rand(1,nvar); % 步长
- end
- %% 记录一组最优值
- [bestfitness,bestindex]=min(fitness); % 越小越好
- zbest.pop = pop(bestindex,:); % 全局最佳
- fitnesszbest=bestfitness; % 全局最佳适应度值
- NcSizepop = 0; % 记录最优适应度值(函数值)
- zbest.path = path{bestindex}; % 全局最佳个体对应的 最优路径
- %% 迭代寻优
- for i = 1:Ned % 驱散(迁移)次数
- for k = 1:Nre % 复制次数
-
- for m = 1:Nc % 趋化次数
- % ACO算法
- lamda = 1/(Ned*Nre*Nc); % 信息素挥发因子
- [bestfit,flag] =min(fitness);
- for j=1:sizepop
- Pt(j) = (fitness(j)-bestfit)./bestfit;
- end
-
- for j=1:sizepop % 种群
- % ACO
- % 转移概率值
- if Pt(j)<P0
- pop(j,:) = round( pop(j,:) + (2*rand-1)*lamda/2 );
- else
- pop(j,:) = round( pop(j,:) + (popmax-popmin).*(rand(1,nvar)-0.5) );
- end
- pop(j,:) = lb_ub(pop(j,:), popmin, popmax); % 越界限制--取值范围约束
- pop1 = pop(j,:);
- [path1, fitness1] = fun_dijkstra( [startpoint, pop(j,:), endpoint], A, dij );
-
- % BFO
- % 翻转
- delta = 5*rand(1,nvar)-0.5;
- pop(j,:) = round( pop(j,:) + C(j,:).*delta./(sqrt( delta*delta' )) );
- pop(j,:) = lb_ub(pop(j,:), popmin, popmax); % 越界限制--取值范围约束
- pop2 = pop(j,:);
- [path2, fitness2] = fun_dijkstra( [startpoint, pop(j,:), endpoint], A, dij );
-
- % 更新当前适应度值
- if fitness1<fitness2
- pop(j,:) = pop1;
- else
- pop(j,:) = pop2;
- end
- % BFO
- % [path{j}, fitness(j)] = fun_dijkstra( [startpoint, pop(j,:), endpoint], A, dij );
- % ACO
- [path{j}, fitness3] = fun_dijkstra( [startpoint, pop(j,:), endpoint], A, dij );
- fitness(j) = (1-Rou)*fitness(j) + fitness3;
-
- % 适应度更新
- % 比较 个体间比较
- if fitness(j)<bestfitness
- bestfitness = fitness(j);
- zbest.pop = pop(j,:);
- zbest.path = path{j}; % 最优解对应的最优路径
- end
- end % sizepop 种群数量
-
- % 记录最优适应度值
- NcSizepop = NcSizepop+1;
- fitness_iter(NcSizepop) = bestfitness;
- end % Nc 趋化次数
-
- % 复制操作
- [maxF, index] = sort(fitness,'descend'); % 降序排列
- for Nre2 = 1:Sr % 将最大适应度值的Sr个种群,进行更新
- pop(index(Nre2),:) = round(popmin + (popmax-popmin).*rand(1,nvar));
- [path{index(Nre2)}, fitness(index(Nre2))] = fun_dijkstra([startpoint, pop(index(Nre2),:), endpoint], A, dij );
- C(index(Nre2),1) = Cmin + (Cmax-Cmin)*rand; % 步长
- % 比较 个体间比较
- if fitness(index(Nre2))<bestfitness
- bestfitness = fitness(index(Nre2));
- zbest.pop = pop(index(Nre2),:);
- zbest.path = path{index(Nre2)}; % 最优解对应的最优路径
- end
- end
- end % Nre 复制操作
-
- for j=1:sizepop % 种群
- if Ped>rand
- pop(j,:) = round(popmin + (popmax-popmin).*rand(1,nvar));
- [path{j}, fitness(j)] = fun_dijkstra([startpoint, pop(j,:), endpoint], A, dij );
- % 比较 个体间比较
- if fitness(j)<bestfitness
- bestfitness = fitness(j);
- zbest.pop = pop(j,:);
- zbest.path = path{j}; % 最优解对应的最优路径
- end
- end
- end
-
- end % Ned 驱散(迁移)次数
- %% 结果展示
- disp('最优解')
- disp(zbest.pop)
- fprintf('\n')
- disp('最优解对应的最优路径')
- disp(zbest.path)
- fprintf('\n')
- fprintf('最优个体')
- zbest
- figure('color',[1,1,1])
- plot(fitness_iter,'ro-','linewidth',2)
- % loglog(fitness_iter,'ro-','linewidth',2)
- axis tight
- grid on
- %% 绘图
- figure(3)
- colormap([0 0 0;1 1 1]),pcolor(0.5:size(a,2)+0.5,0.5:size(a,1)+0.5,b)
- hold on
- % 节点网络结构初始化
- for i=1:citynum
- plot(x(i)+0.5,y(i)+0.5,'ro','MarkerEdgeColor','r','MarkerFaceColor','g','markersize',8);
- hold on;
- text(x(i)+0.5,y(i)+0.5+0.2,num2str(i),'Color',[1 0 0]);
- end
- % 连线
- for i=1:length(zbest.path)-1
- plot([x(zbest.path(i))+0.5,x(zbest.path(i+1))+0.5],[y(zbest.path(i))+0.5,y(zbest.path(i+1))+0.5],'b-','MarkerEdgeColor','r','MarkerFaceColor','g','markersize',8,'linewidth',2);
- end
- axis tight;
- axis off;
- hold off
复制代码
参考:
【1】基于穷举法的机器人避障路径寻优(免费)
【2】智能车辆局部避障路径规划及横向运动控制研究_陈东
【3】3-PSO算法(粒子群算法)的栅格路径寻优计算
|
|