遗传算法原理及案例解析
创始人
2025-05-30 13:16:33
0

一、遗传算法原理

遗传算法—进化算法(Genetic Algorithm GA)源自达尔文进化论的物竞天择适者生存思想。它是通过模拟生物进化的过程,搜索全局最优解的一种算法。

算法可应用于优化问题,当一个问题有N种解决方案时,如何选择出最优的一组解决方案。

二、算法应用

旅行商问题、求目标函数的全局最大值点问题、特征选择

三、遗传算法求解步骤

设定初始固定规模的种群,种群由每个个体组成,计算每个个体的适应度函数,在进化的过程中,分别经过选择(选择适应度最佳的个体,遗弃适应度较差的个体)、交叉、变异步骤,并不断的重复计算适应度函数、选择、交叉、变异步骤,直到得到最佳的个体(最优解)。

种群相当于多种解的集合,个体相当于每一种解。

在进行遗传算法计算之前需要进行编码(将问题的解空间转换为遗传算法能处理的方式),编码具体分为:二进制编码、符号编码、浮点数编码、格雷编码,以下以二进制编码为例讲解

1)种群初始化(Initial Population)

基因组成染色体,多个染色体组成种群。

2)计算适应度函数(Fitness Function)

计算每个个体适合繁衍下一代的程度(概率)

3)选择(Selection)

选择最合适的个体,并让他们的基因去产生下一代

具体分为:赌轮选择法、排序选择法、最优保存策略

赌轮选择法表述为计算每个个体的概率函数值,将每个个体按照概率函数组成面积为1的赌轮,每转一圈,则概率函数最大的个体更容易被选择。

其中个体的概率函数值为个体的适应度函数值和全部个体的适应度函数值求和的比值

4)交叉(Crossover)

对于每一对要配对的父母,从基因中随机选择交叉点,通过在父母的基因中交叉替换产生子代,子代加入种群。类似染色体的交叉重组

具体分为:一点交叉、二点交叉、一致交叉方法

5)变异(Mutation)

突变的目的是为了维持种群的多样性(保证算法能搜索到解空间中的每一点,找到全局最优解的关键),在子代中允许以低概率随机进行变异,也即是个体的基因会发生突变,例如二进制位翻转

上述的2-5步骤进行迭代计算直到算法收敛。算法收敛条件:当新产生的子代与上一代无明显差异时,则算法终止,最终经过若干次的进化过程,种群中产生适应度最高的个体(该个体代表了问题的解)

其中种群的大小固定,当新一代出生时,较差的一代死去,以维持种群大小不变

四、遗传算法设置参数

种群规模大小(建议值20-200)、变异概率(一般0.005-0.05)、交叉概率(一般0.4-0.99)、进化代数(一般100-500)

五、算法的特点

1)全局最优,对多个解进行评估
2)并行化,同时处理种群中的多个个体
3)搜索方向随机

六、案例及代码实现

6.1旅行商问题的求解

旅行商问题(traveling salesman problem)是一个最优化问题,已知旅行城市数目、前往每个城市的成本,找出一组城市访问的路径使得成本最小,或者说旅行商在拜访的多个地点中,如何找到在拜访每个地点一次后再回到起点的最短路径。
如果要列举所有路径后再决定哪个最佳,那么总路径数量很大,几乎难以计算出来,属于NP问题(所有的非确定性多项式时间可解的判定问题构成NP类问题)。

解决思路

1)加载地图及城市

初始设置城市个数30个,并包含在红色地图边界内

2)计算所有城市之间的距离矩阵

蓝色的圆圈表示旅行商需要经过的城市地点

distances = zeros(cities);
for count1=1:cities,for count2=1:count1,x1 = locations(count1,1);y1 = locations(count1,2);x2 = locations(count2,1);y2 = locations(count2,2);distances(count1,count2)=sqrt((x1-x2)^2+(y1-y2)^2);distances(count2,count1)=distances(count1,count2);end;
end;

种群中的个体以有序集表示,种群以元胞数组结构表示

例如种群以P表示,则旅行商要拜访的城市为P{i}。

3)种群初始化

create_permutations.m

function pop = create_permutations(NVARS,FitnessFcn,options)
%种群初始化-创建随机排列的种群.
%   The arguments to the function are 
%     NVARS: 变量大小 Number of variables 
%     FITNESSFCN: 适应度函数 Fitness function 
%     OPTIONS: 遗传算法的参数结构 Options structure used by the GAtotalPopulationSize = sum(options.PopulationSize);
n = NVARS;
pop = cell(totalPopulationSize,1);
for i = 1:totalPopulationSizepop{i} = randperm(n); 
end
4)交叉

crossover_permutation.m

function xoverKids  = crossover_permutation(parents,options,NVARS, ...FitnessFcn,thisScore,thisPopulation)
%  旅行商问题的交叉函数—产生子代xoverKids  
%   The arguments to the function are 
%     PARENTS: 通过适应度函数选择父代
Parents chosen by the selection function
%     OPTIONS: Options created from OPTIMOPTIONS
%     NVARS: 变量个数 Number of variables 
%     FITNESSFCN: 适应度函数 Fitness function 
%     STATE: State structure used by the GA solver 
%     THISSCORE:当前种群的评分向量  Vector of scores of the current population 
%     THISPOPULATION: 当前种群的个体矩阵 Matrix of individuals in the current populationnKids = length(parents)/2;%两个父代产生一个子代
xoverKids = cell(nKids,1); % Normally zeros(nKids,NVARS);
index = 1;for i=1:nKids% here is where the special knowledge that the population is a cell% array is used. Normally, this would be thisPopulation(parents(index),:);parent = thisPopulation{parents(index)};%通过适应度函数找到父代index = index + 2;% Flip a section of parent1.p1 = ceil((length(parent) -1) * rand);p2 = p1 + ceil((length(parent) - p1- 1) * rand);child = parent;child(p1:p2) = fliplr(child(p1:p2));%从左到右的顺序翻转xoverKids{i} = child; % Normally, xoverKids(i,:);
end
5)变异

mutate_permutation.m

返回一个变异后的有排列的城市集(种群中的个体)

function mutationChildren = mutate_permutation(parents ,options,NVARS, ...FitnessFcn, state, thisScore,thisPopulation,mutationRate)
%   旅行商问题的变异函数—产生变异的子代个体
%
%   The arguments to the function are 
%     PARENTS: 通过适应度函数选择的父代Parents chosen by the selection function
%     OPTIONS: Options created from OPTIMOPTIONS
%     NVARS: 变量个数 Number of variables 
%     FITNESSFCN: 适应度函数 Fitness function 
%     STATE: State structure used by the GA solver 
%     THISSCORE: 当前种群的评分向量Vector of scores of the current population 
%     THISPOPULATION: 当前种群的个体矩阵Matrix of individuals in the current population
%     MUTATIONRATE: 变异率 Rate of mutation% Here we swap two elements of the permutation
mutationChildren = cell(length(parents),1);% Normally zeros(length(parents),NVARS);
for i=1:length(parents)parent = thisPopulation{parents(i)}; % Normally thisPopulation(parents(i),:)p = ceil(length(parent) * rand(1,2)); %一行两列的随机数child = parent;child(p(1)) = parent(p(2));child(p(2)) = parent(p(1));mutationChildren{i} = child; % Normally mutationChildren(i,:)
end
6)适应度函数

traveling_salesman_fitness.m

function scores = traveling_salesman_fitness(x,distances)
%旅行商问题的适应度函数—返回种群中每个个体的两两城市之间距离的总和scores = zeros(size(x,1),1);
for j = 1:size(x,1)% here is where the special knowledge that the population is a cell% array is used. Normally, this would be pop(j,:);p = x{j}; f = distances(p(end),p(1));for i = 2:length(p)f = f + distances(p(i-1),p(i));endscores(j) = f;
end

FitnessFcn= @(x) traveling_salesman_fitness(x,distances);

7)当前最佳路径绘图

traveling_salesman_plot.m

function state = traveling_salesman_plot(options,state,flag,locations)
%旅行商问题的绘图函数—绘制两两城市之间的路线图
persistent x y xx yy
if strcmpi(flag,'init')load('usborder.mat','x','y','xx','yy');
end
plot(x,y,'Color','red');
axis([-0.1 1.5 -0.2 1.2]);hold on;
[unused,i] = min(state.Score);
genotype = state.Population{i};plot(locations(:,1),locations(:,2),'bo');
plot(locations(genotype,1),locations(genotype,2));
hold off

my_plot= @(options,state,flag) traveling_salesman_plot(options, ...

state,flag,locations);

8)遗传算法的参数设置
%种群大小参数 种群类型
options = optimoptions(@ga, 'PopulationType', 'custom','InitialPopulationRange', ...[1;cities]);%种群初始化、交叉、变异、绘图、最大代数、种群大小等参数设置
options = optimoptions(options,'CreationFcn',@create_permutations, ...'CrossoverFcn',@crossover_permutation, ...'MutationFcn',@mutate_permutation, ...'PlotFcn', my_plot, ...'MaxGenerations',500,'PopulationSize',60, ...'MaxStallGenerations',200,'UseVectorized',true);
遗传算法调用
numberOfVariables = cities;
[x,fval,reason,output] = ...ga(FitnessFcn,numberOfVariables,[],[],[],[],[],[],[],options)
最终搜索的最佳路径为:

参考文献

[1]Matlab- Custom Data Type Optimization Using the Genetic Algorithm

[2]详解遗传算法-含MATLAB代码

[3]GENETIC ALGORITHMS AS A STRATEGY FOR FEATURE

[4]遗传算法(Genetic Algorithm)

[5]Goldberg_Genetic_Algorithms in Search optimization and mechine learning

相关内容

热门资讯

安卓系统找苹果手机定位,揭秘如... 你有没有想过,即使你的手机是安卓系统,也能轻松找到苹果手机的位置呢?没错,这就是今天我要跟你分享的小...
miix28装安卓系统 你有没有想过,你的miix28平板电脑也能装上安卓系统,让它焕发第二春呢?没错,就是那个曾经陪伴你度...
双系统平板如何打开安卓,双系统... 你有没有想过,拥有一台双系统平板,既能体验安卓的流畅,又能享受Windows的强大?这听起来是不是很...
机顶盒安卓系统版本 你有没有发现,家里的电视最近变得聪明多了?没错,就是那个小小的机顶盒,它现在可是搭载了安卓系统呢!今...
苹果安卓双系统好吗,兼容性与便... 你有没有想过,为什么你的手机里既有苹果的iOS系统,又有安卓的系统呢?是不是觉得这样有点乱,但又有点...
最先出安卓系统的手机,从安卓初... 哇,你有没有想过,手机的世界里,谁才是那个第一个吃螃蟹的人呢?没错,我要说的就是那个最先推出安卓系统...
安卓9系统解决碎片化,提升设备... 你知道吗?最近安卓系统又升级啦!这次可是大动作,直接跳到了安卓9系统。听说这个新系统解决了安卓一直以...
安卓系统和谷歌支付,无缝融合的... 你知道吗?在智能手机的世界里,安卓系统和谷歌支付可是两大巨头,它们可是让我们的生活变得更加便捷呢!今...
qq安卓系统与苹果系统的区别,... 你有没有发现,现在手机上聊天工具真是五花八门,QQ就是其中一款超级受欢迎的软件。不过,你知道吗?QQ...
安卓系统转苹果拼多多,拼多多在... 你知道吗?最近身边的朋友都在议论纷纷,说他们要从安卓系统转到苹果手机,而且还有不少人是冲着拼多多去的...
小米安卓13系统在哪看,探索系... 你有没有发现,最近小米手机的新鲜事儿可真不少啊!这不,安卓13系统已经悄悄上线了,你有没有好奇它在哪...
当年安卓系统难度有多大,揭秘初... 你还记得当年安卓系统刚问世的时候吗?那时候,它就像一个刚出道的明星,充满了潜力,但也让人摸不着头脑。...
安卓系统的手环有哪些,多款智能... 说到智能手环,你有没有想过,为什么安卓系统的手环这么受欢迎呢?它们不仅功能强大,而且款式多样,简直让...
金立手机安卓系统设置,个性化定... 你有没有发现,手机里的安卓系统设置就像一个神秘的宝箱,里面藏着无数的小秘密?今天,就让我带你一起探索...
无人机自带安卓系统,智能航拍与... 你有没有想过,无人机竟然也能装上安卓系统?没错,你没听错!在这个科技飞速发展的时代,无人机也迎来了自...
红魔手机安卓系统降级,轻松回归... 你有没有发现,最近红魔手机的用户圈里掀起了一股小小的热潮?没错,就是安卓系统降级这件事。你知道吗,这...
安卓a13安卓系统下载中文版,... 你有没有听说最近安卓系统又升级啦?没错,就是那个我们每天都离不开的安卓系统,这次可是直接跳到了A13...
安卓系统限制改日期,揭秘日期生... 你有没有遇到过这种情况:手机里的安卓系统突然变得古灵精怪,日期和时间总是乱跑,让你感觉时间都混乱了?...
安卓8系统游戏无法变速,探索解... 最近是不是发现你的安卓8系统手机上的游戏有点不给力啊?尤其是那些原本可以变速的游戏,现在怎么就卡壳了...
微信如何登录安卓系统,畅享便捷... 你有没有想过,微信这款超级好用的社交软件,竟然也能在安卓系统上畅游呢?没错,今天就要来和你聊聊,微信...