Hello Mat

 找回密码
 立即注册
查看: 10251|回复: 6

4-ACO算法(蚁群算法)的栅格路径寻优计算

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2018-4-7 11:59:15 | 显示全部楼层 |阅读模式
4-ACO算法(蚁群算法)的栅格路径寻优计算
链接:https://pan.baidu.com/s/1nUCFCm1601EU94oKq_hWbw 密码:8rmq

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

主程序如下:
  1. clc,clear,close all
  2. warning off
  3. %% MAP
  4. load('data2.mat');
  5. K = 4;             % 与节点自身相连的节点数
  6. [x,y,A,dij, citynum,a,b] = init_map(data2,K);
  7. %% 目标
  8. startpoint=39;  % 起始节点
  9. endpoint=18;    % 终止节点
  10. %% ACO 参数
  11. maxiter = 30;  % 迭代次数
  12. sizepop = 10;  % 种群数量
  13. popmin1 = 1;  popmax1 = 51; % x1
  14. popmin2 = 1;  popmax2 = 51; % x2
  15. Rou = 1.0;     % 信息素增量强度
  16. P0 = 0.1;      % 转移概率
  17. % 初始化种群
  18. for i=1:sizepop
  19.     x1 = round( popmin1 + (popmax1-popmin1)*rand );
  20.     x2 = round( popmin2 + (popmax2-popmin2)*rand );
  21.     pop(i,1) = x1;
  22.     pop(i,2) = x2;
  23.     [path{i}, fitness(i)] = fun_dijstra( [startpoint, pop(i,:), endpoint], A, dij );
  24. end
  25. % 记录一组最优值
  26. [bestfitness,bestindex]=min(fitness);
  27. zbest.pop=pop(bestindex,:);   % 全局最佳
  28. zbest.path=path{bestindex};   % 全局最佳对应的最优路径
  29. gbest=pop;                % 个体最佳
  30. fitnessgbest=fitness;     % 个体最佳适应度值
  31. fitnesszbest=bestfitness; % 全局最佳适应度值
  32. %% 迭代寻优
  33. for i=1:maxiter
  34.     lamda = 1/i;       % 信息素挥发因子
  35.     [bestfit,flag] =min(fitness);
  36.     for j=1:sizepop
  37.         Pt(j) = (fitness(j)-bestfit)./bestfit;
  38.     end
  39.     for j=1:sizepop
  40.         % 转移概率值
  41.         if Pt(j)<P0
  42.             pop(j,:) = round( pop(j,:) + (2*rand-1)*lamda/2 );
  43.         else
  44.             pop(j,1) = round( pop(j,1) + (popmax1-popmin1)*(rand-0.5) );
  45.             pop(j,2) = round( pop(j,2) + (popmax2-popmin2)*(rand-0.5) );
  46.         end
  47.         
  48.         % 越界处理
  49.         if pop(j,1)>popmax1
  50.             pop(j,1)=popmax1;
  51.         end
  52.         if pop(j,1)<popmin1
  53.             pop(j,1)=popmin1;
  54.         end
  55.         if pop(j,2)>popmax2
  56.             pop(j,2)=popmax2;
  57.         end
  58.         if pop(j,2)<popmin2
  59.             pop(j,2)=popmin2;
  60.         end
  61.         
  62.         % 适应度值
  63.         [path1, fitness1] = fun_dijstra( [startpoint, pop(j,:), endpoint], A, dij );
  64.         [path2, fitness2] = fun_dijstra( [startpoint, gbest(j,:), endpoint], A, dij );
  65.         
  66.         if fitness1<fitness2
  67.             gbest(j,:) = pop(j,:);
  68.         else
  69.             pop(j,:) = gbest(j,:);
  70.         end
  71.         
  72.         [path{j}, fitness3] = fun_dijstra( [startpoint, pop(j,:), endpoint], A, dij );
  73.         fitness(j) = (1-Rou)*fitness(j) + fitness3;
  74.         
  75.         if fitness(j) < fitnesszbest
  76.             fitnesszbest = fitness(j);
  77.             fitnessgbest(j) = fitness3;
  78.             
  79.             zbest.pop = pop(j,:);
  80.             zbest.path = path{j};
  81.         end
  82.     end
  83.     fitness_iter(i) = fitnesszbest;
  84. end
  85. %% 结果显示
  86. figure('color',[1,1,1])
  87. plot(fitness_iter,'ro-','linewidth',2)
  88. grid on
  89. xlabel('迭代次数');
  90. ylabel('适应度函数值')

  91. fprintf('最优个体')
  92. zbest
  93. %% 绘图
  94. figure(3)
  95. colormap([0 0 0;1 1 1]),pcolor(0.5:size(a,2)+0.5,0.5:size(a,1)+0.5,b)
  96. hold on
  97. % 节点网络结构初始化
  98. for i=1:citynum
  99.     plot(x(i)+0.5,y(i)+0.5,'ro','MarkerEdgeColor','r','MarkerFaceColor','g','markersize',8);
  100.     hold on;
  101.     text(x(i)+0.5,y(i)+0.5+0.2,num2str(i),'Color',[1 0 0]);
  102. end
  103. % 连线
  104. for i=1:length(zbest.path)-1
  105.     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);
  106. end
  107. axis tight;
  108. axis off;
  109. hold off
复制代码
适应度函数:
  1. function [path, fitness] = fun_dijstra( pop, A, dij )
  2. path =[];
  3. for i=1:length(pop)-1
  4. %     path1 = find_path2(pop(i), pop(i+1), A);  % 找路径
  5.     path1 = dijkstra(pop(i), pop(i+1), dij);  % 找路径
  6.     path = [path,path1];
  7. end

  8. % 删除重复的节点
  9. index=[];
  10. for i=1:length(path)-1
  11.     if(path(i)==path(i+1))
  12.         index=[index,i];
  13.     end
  14. end
  15. path(index)=[];

  16. fitness = ca_tsp(path,dij);
复制代码


参考:
【1】基于穷举法的机器人避障路径寻优(免费)
【2】智能车辆局部避障路径规划及横向运动控制研究_陈东
【3】3-PSO算法(粒子群算法)的栅格路径寻优计算


算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

8

帖子

0

金钱

新手上路

Rank: 1

积分
8
发表于 2018-7-24 10:25:38 | 显示全部楼层
新手学习路径优化,感谢分享
回复 支持 反对

使用道具 举报

0

主题

15

帖子

32

金钱

新手上路

Rank: 1

积分
47
发表于 2019-2-10 20:51:33 | 显示全部楼层
新手学习路径优化,感谢分享
回复 支持 反对

使用道具 举报

0

主题

6

帖子

33

金钱

新手上路

Rank: 1

积分
39
发表于 2019-7-31 11:32:30 | 显示全部楼层
学习一下,感谢楼主
回复 支持 反对

使用道具 举报

0

主题

3

帖子

9

金钱

新手上路

Rank: 1

积分
12
发表于 2020-10-11 20:01:27 | 显示全部楼层
感谢楼主的分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-26 00:54 , Processed in 0.257781 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表