遗传算法介绍及代码实现
(一)算法说明
遗传算法是最优化算法的一种,具体算法步骤如下:
(1) 首先,预先设定染色体数目GeneSize, 基因的最大最小范围maxGene/minGene, 变异概率mutepro, 交叉概率crosspro,迭代次数iterate_num,并定义适应值函数。
(2)然后,根据基因范围,初始化染色体,并计算所有染色体的适应值。
(3)接下来,根据染色体适应值,对染色体进行选择。常用的选择算法有下几种:
1.轮盘赌算法:轮盘赌算法原理,相当于将一个圆盘,根据每个染色体适应值占适应值之和的比例进行划分,然后随机选择。适应值越高的,有更大的几率被选择。每个染色体的选择概率:
pj=value(j)∑GeneSizei=1value(i)
2.锦标赛算法:在一定数目的个体中,选择最优的个体,直到选择足够的个体。
(4)完成选择后,对选出的染色体进行如下操作:
1.
交叉操作:取随机数rand, 判断是否小于crosspro, 如果小于则选择两个个体进行交叉操作。一般这一操作进行GeneSize/2遍。(染色体的选择,一般顺序选择相隔k个的两个染色体,或者直接相邻两个选择。)
交叉操作有单点交叉,多点交叉,均匀交叉等。这些交叉操作如名,单点交叉则随机选择一个点,进行染色体交换得到两个新的个体;多点交叉则是多个点。
2.
变异操作:取随机数rand,判断是否小于mutepro, 如果小于则进行变异操作。一般这一操作对每个染色体都进行一遍,一共进行GeneSize遍。
常用的变异算子有,基本位变异,高斯变异,均匀变异等。基本位变异,随机选择一点基因,进行反转或者其他等位基因值进行代替。高斯变异,在符合均值μ,方差σ的正太分布中随机选择一个值代替。
(5)在完成以上操作后,则得到了新一代染色体,对新一代染色体计算适应值后,再次从(3)开始进行选择交叉变异。直到迭代次数达到iterate_num次。
(二)代码实现
function [BestGene] = GeneticAgorithm(MaxGeneration, GeneSize, Data, Label, MaxGene, MinGene, CrossPro, MutePro)
%遗传算法用于特征选择或参数寻优
%返回说明:最优解
%参数说明:MaxGeneration ----最大迭代数
% GeneSize ---- 基因数目
% Data ---- 数据集
% Label ---- 数据值
% MaxGene ---- 最大基因值
% MinGene ---- 最小基因值
global Maxg
Maxg = MaxGene;
global Ming
Ming = MinGene;
[~,GeneNum] = size(Data);
ValParents = zeros(GeneSize,1);
Children = zeros(GeneSize,GeneNum);
%%第一步:初始化基因,并计算适应值
Parents = rand(GeneSize,GeneNum).*(MaxGene-MinGene)+MinGene;
for j = 1:MaxGeneration
for i = 1:GeneSize
ValParents(i,1) = fitness(Data, Label, Parents(i,:));
end
%%第二步:轮盘赌,选择适应值高基因
SelectedParents = GAchoose(Parents, ValParents);
%%第三步:选择相邻的个体进行交叉,交叉采用单点交叉
for i = 1:GeneSize/2
Children(2*i-1:2*i,:) = GAcross(SelectedParents(2*i-1,:),SelectedParents(2*i,:),CrossPro);
end
%%第四步:个体变异,采用
for i = 1:GeneSize
Children(i,:) = GAmute(Children(i,:),mutepro);
end
Parents = Children;
end
end
function Children = GAchoose(Parents, ValParents)
%UNTITLED 轮盘赌算法进行父代选择
% parents 父代
% fitness 适应值
Children = zeros(size(Parents));
SelectPro = ValParents./sum(ValParents); %选择概率
val = 0;
for i = 1:GeneSize
val = val + SelectPro(i);
CumulaPro = val; %累计概率
end
for i = 1:GeneSize
k = find(CumulaPro>rand, 1, first);
Children(i,:) = Parents(k,:);
end
end
function [Child1, Child2] = GAcross(Parent1, Parent2, pro)
%UNTITLED3 杂交函数, 单点交叉
% Parent1 ---- 父1
% Parent2 ---- 父2
% pro ---- 杂交概率,如果小于这个概率就进行杂交
if(rand < pro)
num = length(Parent1);
location = round(rand*num);
if(location ~=1 && location ~=0)
Child1 = [Parent1(1:location), Parent2(location+1:end)];
Child2 = [Parent2(1:location), Parent1(location+1:end)];
end
end
function child = GAmute(child, mutepro)
%UNTITLED 这里采用均匀变异算子
% 此处显示详细说明
global Maxg Ming;
if(rand<mutepro)
location = round(rand*length(child))+1;
if(location<length(child))
child(location)=rand*(Maxg(location)-Ming(location))+Ming(location);
end
end
end