Halcom 发表于 2019-10-8 23:00:08

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

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

主程序如下:
clc,clear,close all
warning off
% 初始化种群
model = CreateModel();
nvar = model.n;   % n个未知量
popmin_x = model.xmin; % x
popmax_x = model.xmax; % x
popmin_y = model.ymin; % y
popmax_y = model.ymax; % y
% GA算法
pc = 0.75;   % 交叉概率0-1之间
pm = 0.25;   % 变异概率0-1之间
itermax = 100; % 迭代次数
sizepop = 50; % 种群
bound = ;
individuals_x = struct( 'fitness', zeros(1,sizepop),'chrom',[] );
individuals_y = struct( 'fitness', zeros(1,sizepop),'chrom',[] );
bestfitness = [];
bestchrom_x = [];
bestchrom_y = [];
%% 种群初始化
fitnesszbest = inf;
for i=1:sizepop
    pop(i).position = CreateRandomSolution(model); % 初始化个体
    = fun( pop(i).position, model );         % 适应度值
    individuals_x.chrom(i,:) = pop(i).position.x;
    individuals_x.fitness(i) = pop(i).fitness;
    individuals_y.chrom(i,:) = pop(i).position.x;
    individuals_y.fitness(i) = pop(i).fitness;
    % 更新个体最优
    if(pop(i).fitness<fitnesszbest)
      fitnesszbest = pop(i).fitness;
      zbest = pop(i);
    end
end
bestfitness = fitnesszbest;
bestchrom_x = zbest.position.x;
bestchrom_y = zbest.position.y;
for i=1:itermax
    disp(['当前迭代次数: ', num2str(i), ' 总迭代次数:', num2str(itermax)])
    individuals_x = Select(individuals_x, sizepop);
    individuals_x.chrom = Cross(pc,nvar,individuals_x.chrom,sizepop,bound);
    individuals_x.chrom = Mutation(pm,nvar,individuals_x.chrom,sizepop,i,itermax,bound);
    individuals_y = Select(individuals_y, sizepop);
    individuals_y.chrom = Cross(pc,nvar,individuals_y.chrom,sizepop,bound);
    individuals_y.chrom = Mutation(pm,nvar,individuals_y.chrom,sizepop,i,itermax,bound);
   
    % 计算适应度函数值
    for j=1:sizepop
      pop(j).position.x = individuals_x.chrom(j,:);
      pop(j).position.y = individuals_y.chrom(j,:);
      = fun( pop(j).position, model );         % 适应度值
      
      individuals_x.fitness(j) = pop(j).fitness;
      individuals_y.fitness(j) = pop(j).fitness;
    end
   
    % 找里面的最好的个体和最差的个体
    = min(individuals_x.fitness);
    = max(individuals_x.fitness);
    if(newbestfitness<bestfitness)
      bestfitness = newbestfitness;
      bestchrom_x = individuals_x.chrom(newbestindex, :);
      bestchrom_y = individuals_y.chrom(newbestindex, :);
      zbest = pop(newbestindex);
    end
    individuals_x.chrom(newworstindex, :) = bestchrom_x;
    individuals_y.chrom(newworstindex, :) = bestchrom_y;
   
    fitness_iter(i) = bestfitness;
   
    figure(1)
    PlotSolution(zbest.sol,model)
    pause(0.1)
end
%% 结果显示
disp('最优解')
disp(zbest)
fprintf('\n')

figure('color',)
plot(fitness_iter,'ro-','linewidth',2)
xlabel('迭代次数'); ylabel('适应度曲线');
axis tight
grid on

figure(1)
PlotSolution(zbest.sol, model)
pause(0.1)选择
function ret=Select(individuals,sizepop)
% 该函数用于进行选择操作
% individuals input    种群信息
% sizepop   input    种群规模
% ret         output   选择后的新种群

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

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

%采用轮盘赌法选择新个体
index=[];
for i=1:sizepop   %sizepop为种群数
    pick=rand;
    while pick==0   
      pick=rand;      
    end
    for i=1:sizepop   
      pick=pick-sumf(i);      
      if pick<0      
            index=;            
            break;
      end
    end
end

%新种群
individuals.chrom=individuals.chrom(index,:);   %individuals.chrom为种群中个体
individuals.fitness=individuals.fitness(index);
ret=individuals;
交叉
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函数完成交叉操作
% pcorss                input: 交叉概率
% lenchrom            input: 染色体的长度
% chrom   input: 染色体群
% sizepop               input: 种群规模
% ret                   output : 交叉后的染色体

for i=1:sizepop%每一轮for循环中,可能会进行一次交叉操作,染色体是随机选择的,交叉位置也是随机选择的,%但该轮for循环中是否进行交叉操作则由交叉概率决定(continue控制)
   % 随机选择两个染色体进行交叉
   pick=rand(1,2);
   while prod(pick)==0
         pick=rand(1,2);
   end
   index=ceil(pick.*sizepop);
   % 交叉概率决定是否进行交叉
   pick=rand;
   while pick==0
         pick=rand;
   end
   if pick>pcross
         continue;
   end
   flag=0;
   while flag==0
         % 随机选择交叉位
         pick=rand;
         while pick==0
             pick=rand;
         end
         pos=ceil(pick.*sum(lenchrom));%随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同
         pick=rand; %交叉开始
         v1=chrom(index(1),pos);
         v2=chrom(index(2),pos);
         chrom(index(1),pos)=pick*v2+(1-pick)*v1;
         chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉结束
         flag1=test(lenchrom,bound,chrom(index(1),:));%检验染色体1的可行性
         flag2=test(lenchrom,bound,chrom(index(2),:));%检验染色体2的可行性
         if flag1*flag2==0
             flag=0;
         else
             flag=1;
         end    %如果两个染色体不是都可行,则重新交叉
   end
end
ret=chrom;
变异
function ret=Mutation(pmutation,lenchrom,chrom,sizepop,num,maxgen,bound)
% 本函数完成变异操作
% pcorss                input: 变异概率
% lenchrom            input: 染色体长度
% chrom   input: 染色体群
% sizepop               input: 种群规模
% opts                  input: 变异方法的选择
% pop                   input: 当前种群的进化代数和最大的进化代数信息
% bound               input: 每个个体的上限和下限
% maxgen                input:最大迭代次数
% num                   input: 当前迭代次数
% ret                   output : 变异后的染色体

for i=1:sizepop   %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,
    %但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)
    % 随机选择一个染色体进行变异
    pick=rand;
    while pick==0
      pick=rand;
    end
    index=ceil(pick*sizepop);
    % 变异概率决定该轮循环是否进行变异
    pick=rand;
    if pick>pmutation
      continue;
    end
    flag=0;
    num = 0;
    chrom1 = chrom(i,:);
    while flag==0&&num<=20
      % 变异位置
      pick=rand;
      while pick==0      
            pick=rand;
      end
      pos=ceil(pick*sum(lenchrom));%随机选择了染色体变异的位置,即选择了第pos个变量进行变异
   
      pick=rand; %变异开始   
      fg=(rand*(1-num/maxgen))^2;
      if pick>0.5
            chrom(i,pos)=chrom(i,pos)+(bound(pos,2)-chrom(i,pos))*fg;
      else
            chrom(i,pos)=chrom(i,pos)-(chrom(i,pos)-bound(pos,1))*fg;
      end   %变异结束
      flag=test(lenchrom,bound,chrom(i,:));   %检验染色体的可行性
         num = num+1;% 检验次数设置
    end
    if num>20         % 如果大于20次,则不变异
      chrom(i,:) = chrom1;
    end
end
ret=chrom;Code函数如下:**** Hidden Message *****
参考:
【1】结果动态图
【2】子函数参考链接
【3】GA多目标算法
【4】GA单目标算法



























wwd980525 发表于 2019-10-15 17:54:52

感谢感谢!!!

operator321 发表于 2020-10-28 19:47:52

感谢感谢!!!

wwmwwmwwm 发表于 2021-1-9 22:40:20

111111111111111111

wumeng 发表于 2021-6-12 18:57:46

十分感谢楼主,非常好的内容

summer9931 发表于 2021-9-30 20:17:36

学习学习,感谢分享,谢谢

faith 发表于 2023-5-8 01:43:35

查看全部代码
页: [1]
查看完整版本: 8-GA遗传算法的障碍路径寻优Path Planning-三角形障碍