资源描述
基本概念
遗传算法是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术之一。
遗传算法的基本运算过程如下:
1)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
2)个体评价:计算群体P(t)中各个个体的适应度。
3)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。
4)交叉运算:将交叉算子作用于群体。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。遗传算法中起核心作用的就是交叉算子。
5)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t 1)。
6)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
以上操作过程可以用图1来表示。
图1 遗传算法流程图
利用遗传算法求Rosenbrock函数的极小值
求解该问题遗传算法的构造过程:
(1)确定决策变量和约束条件;
(2)建立优化模型;
(3)确定编码方法
用长度为15位的二进制编码串来分别表示两个决策变量x1,x2。10位二进制编码串可以表示从0到2^15-1之间的个2^15不同的数,故将x1,x2的定义域离散化为1023个均等的区域,包括两个端点在内共有1024个不同的离散点。
从离散点-100到离散点100 ,分别对应于从000000000000000(0)到111111111111111(1023)之间的二进制编码。
将x1,x2分别表示的两个15位长的二进制编码串连接在一起,组成一个30位长的二进制编码串,它就构成了这个函数优化问题的染色体编码方法。使用这种编码方法,解空间和遗传算法的搜索空间就具有一一对应的关系。
例如 x:000000000110111 000001101110001 表示一个个体的基因型,其中前10位表示x1,后10位表示x2
4)确定解码方法:解码时需要将30位长的二进制编码串切断为两个15位长的二进制编码串,然后分别将它们转换为对应的十进制整数代码,分别记为y1和y2。
依据个体编码方法和对定义域的离散化方法可知,将代码y转换为变量x的解码公式为
例如,对个体x:00000000110111 000001101110001 它由两个代码所组成
上述两个代码经过解码后,可得到两个实际的值
(5) 确定个体评价方法:由于Rosenbrock函数的值域总是非负的,并且优化目标是求函数的最小值,故可将个体的适应度直接取为对应的目标函数值,即
选个体适应度的倒数作为目标函数
(6)设计遗传算子:选择运算使用比例选择算子,交叉运算使用单点交叉算子,变异运算使用基本位变异算子。
(7)确定遗传算法的运行参数:群体大小M=40,终止进化代数G=500,交叉概率Pc=(0.7~0.1),变异概率Pm=0.5。
上述七个步骤构成了用于求函数极小值的优化计算基本遗传算法。
采用上述方法进行仿真,经过100步迭代,最佳样本
时,Rosenbrock函数具有极小值,极小值为0.0852。
仿真的程序为:
MAIN
%标准遗传算法
%优化函数为,其中,-100<=x<=100
%编码长度为15位,编码精度为0.195
%种群规模设为40,遗传算子分别为比例选择,单点交叉和单点变异。
%最大进化代数为500代,保优操作。
clear all;
close all;
Size=80;
G=500;
CodeL=15;
maxize=100;
minize=-100;
Qun=round(rand(Size,2*CodeL));
for k=1:1:G
time(k)=k;
for s=1:1:Size
m=Qun(s,:);
y1=0;y2=0;
m1=m(1:1:CodeL);
for i=1:1:CodeL
y1=y1+m1(i)*2^(i-1);
end
x1=(maxize-minize)*y1/2^15+minize;
m2=m(CodeL+1:1:2*CodeL);
for i=1:1:CodeL
y2=y2+m2(i)*2^(i-1);
end
x2=(maxize-minize)*y2/2^15+minize;
F(s)=100*(x1^2-x2)^2+(1-x1)^2;
end
Ji=1./F;
BestJ(k)=max(Ji);
fi=F;
[Oderfi,Indexfi]=sort(fi);
Bestfi=Oderfi(1);
BestS=Qun(Indexfi(1),:);
bfi(k)=Bestfi;
fi_sum=sum(fi);
P=fi/fi_sum;
Q(1)=P(1); %求每个染色体的累积频率
for i=2:1:Size
Q(i)=Q(i-1)+P(i);
end
kk=1;
U=rand(Size,1);
%轮盘选择开始
for i=1:1:Size
for j=1:1:Size-1
if U(i,1)>Q(j)
TempE(kk,:)=Qun(j+1,:);
kk=kk+1;
break
elseif U(i,1)<=Q(1)
TempE(kk,:)=Qun(1,:);
kk=kk+1;
end
end
end%相邻两个染色体单点交叉
pc=0.60;
n=ceil(20*rand);
for i=1:2:(Size-1)
temp=rand;
if pc>temp
for j=n:1:20
TempE(i,j)=Qun(i+1,j);
TempE(i+1,j)=Qun(i,j);
end
end
end
TempE(Size,:)=BestS;
Qun=TempE;
pm=0.1;
for i=1:1:Size
for j=1:1:2*CodeL
temp=rand;
if pm>temp
if TempE(i,j)==0
TempE(i,j)=1;
else
TempE(i,j)=0;
end
end
end
end
TempE(Size,:)=BestS;
Qun=TempE;
end
Min_Value=Bestfi
BestS
x1
x2
figure(1);
plot(time,BestJ);
xlabel('Times');ylabel('BestJ');
figure(2);
plot(time,bfi);
xlabel('times');ylabel('BestF');
运算结果
Min_Value =
0.0657
BestS =
Columns 1 through 17
1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0
Columns 18 through 30
1 0 1 1 1 1 0 0 0 0 0 0 1
x1 =
1.2146
x2 =
1.4893
展开阅读全文