Hello Mat

 找回密码
 立即注册
查看: 9129|回复: 7

8-GA遗传算法的障碍路径寻优Path Planning-三角形障碍

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2019-10-8 23:00:08 | 显示全部楼层 |阅读模式
8-GA遗传算法的障碍路径寻优Path Planning-三角形障碍
链接:https://pan.baidu.com/s/1nnU9pHcid62He9IK8GE4UA 提取码:741b
具体链接在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. % 初始化种群
  4. model = CreateModel();
  5. nvar = model.n;   % n个未知量
  6. popmin_x = model.xmin; % x
  7. popmax_x = model.xmax; % x
  8. popmin_y = model.ymin; % y
  9. popmax_y = model.ymax; % y
  10. % GA算法
  11. pc = 0.75;   % 交叉概率0-1之间
  12. pm = 0.25;   % 变异概率0-1之间
  13. itermax = 100; % 迭代次数
  14. sizepop = 50; % 种群
  15. bound = [popmin_x*ones(nvar,1), popmax_x*ones(nvar, 1)];
  16. individuals_x = struct( 'fitness', zeros(1,sizepop),'chrom',[] );
  17. individuals_y = struct( 'fitness', zeros(1,sizepop),'chrom',[] );
  18. bestfitness = [];
  19. bestchrom_x = [];
  20. bestchrom_y = [];
  21. %% 种群初始化
  22. fitnesszbest = inf;
  23. for i=1:sizepop
  24.     pop(i).position = CreateRandomSolution(model); % 初始化个体
  25.     [pop(i).fitness , pop(i).sol]= fun( pop(i).position, model );         % 适应度值
  26.     individuals_x.chrom(i,:) = pop(i).position.x;
  27.     individuals_x.fitness(i) = pop(i).fitness;
  28.     individuals_y.chrom(i,:) = pop(i).position.x;
  29.     individuals_y.fitness(i) = pop(i).fitness;
  30.     % 更新个体最优
  31.     if(pop(i).fitness<fitnesszbest)
  32.         fitnesszbest = pop(i).fitness;
  33.         zbest = pop(i);
  34.     end
  35. end
  36. bestfitness = fitnesszbest;
  37. bestchrom_x = zbest.position.x;
  38. bestchrom_y = zbest.position.y;
  39. for i=1:itermax
  40.     disp(['当前迭代次数: ', num2str(i), ' 总迭代次数:', num2str(itermax)])
  41.     individuals_x = Select(individuals_x, sizepop);
  42.     individuals_x.chrom = Cross(pc,nvar,individuals_x.chrom,sizepop,bound);
  43.     individuals_x.chrom = Mutation(pm,nvar,individuals_x.chrom,sizepop,i,itermax,bound);
  44.     individuals_y = Select(individuals_y, sizepop);
  45.     individuals_y.chrom = Cross(pc,nvar,individuals_y.chrom,sizepop,bound);
  46.     individuals_y.chrom = Mutation(pm,nvar,individuals_y.chrom,sizepop,i,itermax,bound);
  47.    
  48.     % 计算适应度函数值
  49.     for j=1:sizepop
  50.         pop(j).position.x = individuals_x.chrom(j,:);
  51.         pop(j).position.y = individuals_y.chrom(j,:);
  52.         [pop(j).fitness , pop(j).sol]= fun( pop(j).position, model );         % 适应度值
  53.         
  54.         individuals_x.fitness(j) = pop(j).fitness;
  55.         individuals_y.fitness(j) = pop(j).fitness;
  56.     end
  57.    
  58.     % 找里面的最好的个体和最差的个体
  59.     [newbestfitness, newbestindex] = min(individuals_x.fitness);
  60.     [newworstfitness, newworstindex] = max(individuals_x.fitness);
  61.     if(newbestfitness<bestfitness)
  62.         bestfitness = newbestfitness;
  63.         bestchrom_x = individuals_x.chrom(newbestindex, :);
  64.         bestchrom_y = individuals_y.chrom(newbestindex, :);
  65.         zbest = pop(newbestindex);
  66.     end
  67.     individuals_x.chrom(newworstindex, :) = bestchrom_x;
  68.     individuals_y.chrom(newworstindex, :) = bestchrom_y;
  69.    
  70.     fitness_iter(i) = bestfitness;
  71.    
  72.     figure(1)
  73.     PlotSolution(zbest.sol,model)
  74.     pause(0.1)
  75. end
  76. %% 结果显示
  77. disp('最优解')
  78. disp(zbest)
  79. fprintf('\n')

  80. figure('color',[1,1,1])
  81. plot(fitness_iter,'ro-','linewidth',2)
  82. xlabel('迭代次数'); ylabel('适应度曲线');
  83. axis tight
  84. grid on

  85. figure(1)
  86. PlotSolution(zbest.sol, model)
  87. pause(0.1)
复制代码
选择
  1. function ret=Select(individuals,sizepop)
  2. % 该函数用于进行选择操作
  3. % individuals input    种群信息
  4. % sizepop     input    种群规模
  5. % ret         output   选择后的新种群

  6. %求适应度值倒数   
  7. fitness1=1./individuals.fitness; %individuals.fitness为个体适应度值

  8. %个体选择概率
  9. sumfitness=sum(fitness1);
  10. sumf=fitness1./sumfitness;

  11. %采用轮盘赌法选择新个体
  12. index=[];
  13. for i=1:sizepop   %sizepop为种群数
  14.     pick=rand;
  15.     while pick==0   
  16.         pick=rand;        
  17.     end
  18.     for i=1:sizepop   
  19.         pick=pick-sumf(i);        
  20.         if pick<0        
  21.             index=[index i];            
  22.             break;  
  23.         end
  24.     end
  25. end

  26. %新种群
  27. individuals.chrom=individuals.chrom(index,:);   %individuals.chrom为种群中个体
  28. individuals.fitness=individuals.fitness(index);
  29. ret=individuals;
复制代码

交叉
  1. function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
  2. %本函数完成交叉操作
  3. % pcorss                input  : 交叉概率
  4. % lenchrom              input  : 染色体的长度
  5. % chrom     input  : 染色体群
  6. % sizepop               input  : 种群规模
  7. % ret                   output : 交叉后的染色体

  8. for i=1:sizepop  %每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
  9.      % 随机选择两个染色体进行交叉
  10.      pick=rand(1,2);
  11.      while prod(pick)==0
  12.          pick=rand(1,2);
  13.      end
  14.      index=ceil(pick.*sizepop);
  15.      % 交叉概率决定是否进行交叉
  16.      pick=rand;
  17.      while pick==0
  18.          pick=rand;
  19.      end
  20.      if pick>pcross
  21.          continue;
  22.      end
  23.      flag=0;
  24.      while flag==0
  25.          % 随机选择交叉位
  26.          pick=rand;
  27.          while pick==0
  28.              pick=rand;
  29.          end
  30.          pos=ceil(pick.*sum(lenchrom));  %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
  31.          pick=rand; %交叉开始
  32.          v1=chrom(index(1),pos);
  33.          v2=chrom(index(2),pos);
  34.          chrom(index(1),pos)=pick*v2+(1-pick)*v1;
  35.          chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
  36.          flag1=test(lenchrom,bound,chrom(index(1),:));  %检验染色体1的可行性
  37.          flag2=test(lenchrom,bound,chrom(index(2),:));  %检验染色体2的可行性
  38.          if flag1*flag2==0
  39.              flag=0;
  40.          else
  41.              flag=1;
  42.          end    %如果两个染色体不是都可行,则重新交叉
  43.      end
  44. end
  45. ret=chrom;
复制代码

变异
  1. function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
  2. % 本函数完成变异操作
  3. % pcorss                input  : 变异概率
  4. % lenchrom              input  : 染色体长度
  5. % chrom     input  : 染色体群
  6. % sizepop               input  : 种群规模
  7. % opts                  input  : 变异方法的选择
  8. % pop                   input  : 当前种群的进化代数和最大的进化代数信息
  9. % bound                 input  : 每个个体的上限和下限
  10. % maxgen                input  :最大迭代次数
  11. % num                   input  : 当前迭代次数
  12. % ret                   output : 变异后的染色体

  13. for i=1:sizepop   %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,
  14.     %但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)
  15.     % 随机选择一个染色体进行变异
  16.     pick=rand;
  17.     while pick==0
  18.         pick=rand;
  19.     end
  20.     index=ceil(pick*sizepop);
  21.     % 变异概率决定该轮循环是否进行变异
  22.     pick=rand;
  23.     if pick>pmutation
  24.         continue;
  25.     end
  26.     flag=0;
  27.     num = 0;
  28.     chrom1 = chrom(i,:);
  29.     while flag==0&&num<=20
  30.         % 变异位置
  31.         pick=rand;
  32.         while pick==0      
  33.             pick=rand;
  34.         end
  35.         pos=ceil(pick*sum(lenchrom));  %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
  36.    
  37.         pick=rand; %变异开始     
  38.         fg=(rand*(1-num/maxgen))^2;
  39.         if pick>0.5
  40.             chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;
  41.         else
  42.             chrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;
  43.         end   %变异结束
  44.         flag=test(lenchrom,bound,chrom(i,:));     %检验染色体的可行性
  45.          num = num+1;  % 检验次数设置
  46.     end
  47.     if num>20         % 如果大于20次,则不变异
  48.         chrom(i,:) = chrom1;
  49.     end
  50. end
  51. ret=chrom;
复制代码
Code函数如下:
游客,如果您要查看本帖隐藏内容请回复

参考:
【1】结果动态图
【2】子函数参考链接
【3】GA多目标算法
【4】GA单目标算法



























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

使用道具 举报

1

主题

3

帖子

13

金钱

新手上路

Rank: 1

积分
16
发表于 2019-10-15 17:54:52 | 显示全部楼层
感谢感谢!!!
回复

使用道具 举报

0

主题

44

帖子

1

金钱

新手上路

Rank: 1

积分
48
发表于 2020-10-28 19:47:52 | 显示全部楼层
感谢感谢!!!
回复

使用道具 举报

0

主题

54

帖子

1

金钱

注册会员

Rank: 2

积分
55
发表于 2021-1-9 22:40:20 | 显示全部楼层
111111111111111111
回复 支持 反对

使用道具 举报

0

主题

24

帖子

18

金钱

注册会员

Rank: 2

积分
87
发表于 2021-6-12 18:57:46 | 显示全部楼层
十分感谢楼主,非常好的内容
回复 支持 反对

使用道具 举报

0

主题

14

帖子

9

金钱

新手上路

Rank: 1

积分
44
发表于 2021-9-30 20:17:36 | 显示全部楼层
学习学习,感谢分享,谢谢
回复 支持 反对

使用道具 举报

0

主题

2

帖子

1

金钱

新手上路

Rank: 1

积分
9
发表于 2023-5-8 01:43:35 | 显示全部楼层
查看全部代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 23:18 , Processed in 0.237856 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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