遗传算法
Matlab编程求函数的最大适应性及相应位置摘要:阐述了遗传算法的基本原理,探讨了matlab环境中实现遗传算法的编程方法,并以
y y
x x
y
x f
s i n
s i n
)
, ( 1
*
=、
]
20
)5
(
)5
(
exp[
999
.0
)
10)5
(
)5
(
exp(
9.0
)
,
(
2
2
2
2 2
-
+
-
-
*
+
+
+
+
*
=
y
x
y
x
y
x
f
x,y∝[-10,10],要求种数N=50,交换位数n/2,位置随机;变异位数统一为4。交换的个数Nc=20、28、36、44;变异的个数Nm=1、5、10、15.两个函数的精度分别为0.001,0.0001
两个简单的实例做了具体的分析。
关键词:遗传算法(GA)、matlab
一、遗传算法概述
遗传算法(Genetic Algorithm ,GA) 是借鉴生物界自然选择复制和体进化机制形成的一种全局寻优算法。与传统的优化算法相比,遗传算法具有如下优点[1 ] :1) 不是从单个点,而是从多个点构成的体开始搜索;2) 在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;3) 搜索过程不易陷入局部最优点。目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具[2 ]。
在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。
遗传算法的应用,遗传算法在人工智能的众多领域便得到了广泛应用。例如,机器学习、聚类、控制(如煤气管道控制)、规划(如生产任务规划)、设计(如通信网络设计、布局设计)、调度(如作业车间调度、机器调度、运输问题)、配置(机器配置、分配问题)、组合优化(如TSP、背包问题)、函数的最大值以及图像处理和信号处理等等。
另一方面,人们又将遗传算法与其他智能算法和技术相结合,使其问题求解能力得到进一步扩展和提高。例如,将遗传算法与模糊技术、神经网络相结合,已取得了不少成果。
二、遗传算法基本流程
function pop2=decodechrom(pop,spoint,length)
pop1=pop(:,spoint:spoint+length-1);
pop2=decodebinary(pop1);
% 3.2.3 计算目标函数值
% calobjvalue.m函数的功能是实现目标函数的计算
%遗传算法子程序
%Name: calobjvalue.m
%实现目标函数的计算
function [objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,14); %将pop每行转化成十进制数
temp2=decodechrom(pop,15,14);
x=temp1*20/16383; %将二值域中的数转化为变量域的数
y=temp2*20/16383;
objvalue=(sin(x-10)./(x-10)).*(sin(y-10)./(y-10)); %计算目标函数值
% 3.3 计算个体的适应值
%遗传算法子程序
%Name:calfitvalue.m
%计算个体的适应值
function fitvalue=calfitvalue(objvalue)
global Cmin;
Cmin=0;
[px,py]=size(objvalue);
for i=1:px
if objvalue(i)+Cmin>0
temp=Cmin+objvalue(i);
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';
% 3.4 选择复制
% 选择或复制操作是决定哪些个体可以进入下一代。程序中采用赌选择法选择,这种方法较易实现。
% 根据方程pi=fi/∑fi=fi/fsum ,选择步骤:
% 1)在第t 代,由(1)式计算fsum 和pi
% 2)产生{0,1} 的随机数rand( .),求s=rand( .)*fsum
% 3)求∑fi≥s 中最小的k ,则第k 个个体被选中
% 4)进行N 次2)、3)操作,得到N 个个体,成为第t=t+1 代种
%遗传算法子程序
%Name: selection.m
%选择复制
function [newpop1]=selection(pop,fitvalue)
totalfit=sum(fitvalue); %求适应值之和
fitvalue=fitvalue/totalfit; %单个个体被选择的概率
fitvalue=cumsum(fitvalue); %如fitvalue=[1 2 3 4],则cumsum(fitvalue)=[1 3 6 10] [px,py]=size(pop);
ms=sort(rand(px,1)); %从小到大排列
fitin=1;
newin=1;
while newin<=px
if(ms(newin))<fitvalue(fitin)
newpop1(newin,:)=pop(fitin,:);
newin=newin+1;
else
fitin=fitin+1;
end
end
% 3.5 交叉
% 交叉(crossover),体中的每个个体之间都以一定的概率pc 交叉,即两个个体从各自字符串的某一位置
% (一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:
% x1=0100110
% x2=1010001
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:% y1=0100001
% y2=1010110
% 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。字符串截取20位
% 事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。
%遗传算法子程序
%Name: crossover.m
%交叉
function [newpop2]=crossover(newpop1,pc)
[px,py]=size(newpop1);
newpop2=ones(size(newpop1));
for i=1:2:px-1
if(rand<pc)
qq=randperm(py);
for o=1:(py/2)
newpop2(i,:)=[newpop1(i,1:qq(o)-1),newpop1(i+1,qq(o)),newpop1(i,qq(o)+1:py)];
newpop2(i+1,:)=[newpop1(i+1,1:qq(o)-1),newpop1(i,qq(o)),newpop1(i+1,qq(o)+1:py)] ;
end
else

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。