|
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 = [popmin_x*ones(nvar,1), popmax_x*ones(nvar, 1)];
- 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); % 初始化个体
- [pop(i).fitness , pop(i).sol]= 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,:);
- [pop(j).fitness , pop(j).sol]= fun( pop(j).position, model ); % 适应度值
-
- individuals_x.fitness(j) = pop(j).fitness;
- individuals_y.fitness(j) = pop(j).fitness;
- end
-
- % 找里面的最好的个体和最差的个体
- [newbestfitness, newbestindex] = min(individuals_x.fitness);
- [newworstfitness, newworstindex] = 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',[1,1,1])
- 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=[index i];
- 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函数如下:
参考:
【1】结果动态图
【2】子函数参考链接
【3】GA多目标算法
【4】GA单目标算法
|
|