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单目标算法
感谢感谢!!! 感谢感谢!!! 111111111111111111 十分感谢楼主,非常好的内容
学习学习,感谢分享,谢谢 查看全部代码
页:
[1]