-
函数
-
仿真过程
-
君主方案
-
代码实现
1、函数
的最小值,其中x的维数n=10,这是一个简单平方和函数,只有一个极小点 =(0,0,...,0),理论最小值
2、仿真过程:
(1)初始化种群数目NP=100,染色体基因维数为D=10,最大进化代数G=1000,交叉概率Pc=0.8,变异概率Pm=0.1
(2)产生初始种群,计算个体适应度值,进行实数编码的选择以及交叉和变异操作。选择和交叉操作采用“君主方案”,即在对群体根据适应度值高低进行排序的基础上,用最优个体与其他偶数的所有个体进行交叉,每次交叉产生两个新的个体。在交叉过后,对新产生的群体进行多点变异产生子群体,再计算其适应度值,然后和父群体合并,并且根据适应度值进行排序,取前NP个个体为新群体,进行下一步遗传操作。
(3)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值,若不满足,则继续进迭代优化。
优化结束后,其适应度进化曲线如图所示,优化结果,函数
的最小值为
3、君主方案
与轮盘赌的区别是:轮盘赌的父母方染色体都是根据适应度越大越容易被选中的原理随机筛选出来的。而君主方案是父方染色体全部是本代最占优的一条,母方是按一定顺序(升序)排列的一群染色体。
4、 代码部分
%%实值遗传算法求函数极值%%%%
%%%%%初始化参数%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
NP=50; %染色体数目
D=10; %基因数目
Pc=0.8; %交叉率,一般取0.25~1
Pm=0.1; %变异率,一般取0.001~0.1
G=1000; %最大遗传代数,一般100~1000
Xs=20; %定义域上限
Xx=-20; %定义域下限
f=rand(D,NP)*(Xs-Xx)+Xx; %随机获得初始种群
trace=zeros(1,G); %预先分配内存
Fit=zeros(1,NP); %预先分配内存
%%%%%遗传算法循环%%%%%
for gen=1:G
%%%%%按适应度升序排列%%%%%
for np=1:NP
Fit(np)=func2(f(:,np));
end
[SortFit,Index]=sort(Fit);
Sortf=f(:,Index);
%%%%%采用君主方案进行选择交叉操作%%%%%
Emper=Sortf(:,1);
NoPoint=round(D*Pc);
PoPoint=randi([1 D],NoPoint,NP/2);
nf=Sortf;
for i=1:NP/2
nf(:,2*i-1)=Emper;
nf(:,2*i)=Sortf(:,2*i);
for k=1:NoPoint
nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
end
end
%%%%%变异操作%%%%%
for m=1:NP
for n=1:D
r=rand(1,1);
if r<Pm
nf(n,m)=rand(1,1)*(Xs-Xx)+Xx;
end
end
end
f=nf;
trace(gen)=SortFit(1);
end
Bestf=Sortf(:,1)
summ=func2(Bestf)
trace(end);
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
function result=func2(x)
result=sum(x.^2);
end