算法合集之《遗传算法的特点及其应用》
IOI2002集训队论文 遗传算法的特点及其应用 张宁
上海复旦大学附属中学 张宁
TSP
1
TSP
第 1 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
遗传算法作为一门新兴学科,在信息学竞赛中还未普及,但由于遗传算法对
许多用传统数学难以解决或明显失效的复杂问
,特别是优化问题,提供了一个
行之有效的新途径,且能够较好地解决信息学竞赛中的NP难题,因此值得我们进行深入的讨论。
要掌握遗传算法的应用技巧,就要了解它的各方面的特点。首先,让我们来
了解一下什么是遗传算法。
遗传算法(Genetic Algorithms,简称GA)是人工智能的重要新分支,是基于达尔文进化论,在计算机上模拟生命进化机制而发展起来的一门新学科。它
第 2 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁 根据适者生存,优胜劣汰等自然进化规则来进行搜索计算和问题求解。
对许多用传统数学难以解决或明显失效的复杂问题,特别是优化问题,GA提供了一个行之有效的新途径,也为人工智能的研究带来了新的生机。
GA由美国J. H. Holland博士1975年提出,当时并没有引起学术界的关注,
因而发展比较缓慢。从80年代中期开始,随着人工智能的发展和计算机技术的
进步,遗传算法逐步成熟,应用日渐增多,不仅应用于人工智能领域(如机器学
习和神经网络),也开始在工业系统,如控制、机械、土木、电力工程中得到成
功应用,显示出了诱人的前景。与此同时,GA也得到了国际学术界的普遍肯定。
从1985年至今国际上已举行了五届遗传算法和进化计算会议,第一本《进
化计算》杂志1993年在MIT创刊,1994年IEEE神经网络汇刊出版了进化规划
理论几应用专集,同年IEEE将神经网络,模糊系统,进化计算三个国际会议合
并为’94IEEE全球计算智能大会(WCCI),会上发表进化计算方面的论文255篇,引起了国际学术界的广泛关注。
目前,GA已在组合优化问题求解、自适应控制、程序自动生成、机器学习、
神经网络训练、人工生命研究、经济组合等领域取得了令人著目的应用成果,GA也成为当前人工智能及其应用的热门课题。
遗传算法(Genetic Algorithms,以下简称GA)是基于自然选择,在计算
机上模拟生物进化机制的寻优搜索算法。
在自然界的演化过程中,生物体通过遗传(传种接代,后代与夫辈非常相像)、
变异(后代与夫辈又不完全相像)来适应外界环境,一代又一代地优胜劣汰,发
展进化。
GA则模拟了上述进化现象。它把搜索空间(欲求解问题的解空间)映射为
遗传空间,即把每一个可能的解编码为一个向量(二进制或十进制数字串),称
为一个染色体(chromosome,或个体),向量的每一个元素称为基因(genes)。所有染色体组成群体(population,或集团)。并按预定的目标函数(或某种评价
指标,如商业经营中的利润、工程项目中的最小费用、最短路径等)对每个染色
提进行评价,根据其结果给出一个适应度的值。
算法开始时先随机地产生一些染色体(欲求解问题的侯选解),计算其适应
度,根据适应度对诸染色体进行选择、交换、变异等遗传操作,剔除适应度低(性
能不佳)的染色体,留下适应度高(性能优良)的染色体,从而得到新的群体。
由于新群体的成员是上一代群体的优秀者,继承了上一代的优良性态,因而
在总体上明显优于上一代。GA就这样反复迭代,向着更优解的方向进化,直至
满足某种预定的优化指标。上述GA的工作过程可用图1简要描述。
第 3 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
问题的初始(侯选)解
编码为染色体(向量)
种群P(t)
计算各染色体适应度 复制 种群P(t),种群P(t+1)
交换 通过遗传运算存优去劣 变异
种群P(t+1)
N
种群满足预定指标
Y
解码染色体
问题解答空间
图1 遗传算法工作原理示意图
简单遗传算法的三个基本运算是选择、交换、变异,下面详细介绍。
选择运算又称为繁殖、再生,或复制运算,用于模拟生物界去劣存优的
自然选择现象。它从旧种群中选择出适应性强的某些染色体,放入匹配集(缓
冲区),为染色体交换和变异运算产生新种群做准备。适应度越高的染色体被
选择的可能性越大,其遗传基因在下一代群体中的分布就越广,其子孙在下
一代出现的数量就越多。有多种选择方法,使用比较普遍的一种是适应度比
例法,简述如下:
适应度比例法又称为轮转法,它把种群中所有染色体适应度的总和看作
一个轮子的圆周,而每个染色体按其适应度在总和中所占的比例占据轮子的
一个扇区。每次染色体的选择可看作轮子的一次随机转动,它转到哪个扇区
停下来,那个扇区对应的染色体就被选中。其实就是将适应度值视为其权值,
权值大的被选中的概率也大。尽管这种选择方法是随机的,但它与各染色体
适应度成比例。某一染色体被选中的概率(选择概率)为
第 4 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
Pc,f(x)c/f(x)i,
式中x为种群中第i个染色体对应的数字串,f(x)是第i个染色体的适ii
应度值,是种群中所有染色体的适应度值之和。 f(xi),
用适应度比例法进行选择时,首先计算每个染色体的适应度,然后按比
例于各染色体适应度的概率进入交换(匹配)集的染色体,其具体步骤如下:
(1) 计算每个染色体的适应度值f(x); i
(2) 累加所有染色体的适应度值,得最终累加值SUM=,记录对f(xi),
应于每个染色体的中间累加值g(x); i
(3) 产生一个随机数N,0
标准或条件。在本例中,假定已知染色体数字串1111代表的是已
知的最好利润15%,则遗传算法停止运行。
[例4]:函数优化问题
设有函数f(x)=2x
2-5x+4(x?Z,x?[0,63]),求其在区间内的最大值。下
面用遗传算法求解这一问题。
(1) 确定适当的编码,把问题的可能解表示为染色体数字串。因为有一个决策
6变量x,其取值范围为[0,63],2=64,使用6位无符号二进制数组成染
色体数字串,即可表达变量x,以及问题的解答
。 (2) 选择初始种群。通过随机的方法产生由4个染色体数字串组成的初始种
群,见表7。
(3) 计算适应度值及选择概率。此问题中染色体的适应度取函数自身
2f(x)=2x-5x+4。将每个染色体的f(x)计算出来,作为适应度值。在此基
础上计算选择概率P=f/f。 s,i
表7 函数优化过程
编号 染色体 X值 适应度(目标函数)选择概率实选染色2f(x)=2x-5x+4 体编号 f/f ,i
1 011010 26 1226 0.15 1
2 100100 36 2416 0.29 1
3 010101 21 781 0.09 0
4 101110 46 4006 0.48 2
和 8429 1 4 平均 2107.25 0.25 1 最大 4006 0.49 2
(4) 选择进入交换集的染色体。按适应度比例法,选择进入交换集的染色体串,
如表8。可见,染色提1和2都被选择了1次;染色体4被选择了2次;
染色体3没有被选择。所选的4个染色体被送到交换集,准备参加交换。 (5) 交换染色体。首先对进入交换集的染色体进行随机配对,此例中是染色体
1和3配对,染色体2和4配对。接着随机确定交换位置,结果是第1对
染色体的交换位置是1,第2对染色体的交换位置是4。经过交换操作后
第 8 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
得到的新种群如表8所示。
(6) 变异。若此例中变异概率取0.01。由于种群中4个染色体总共只有24位
代码,变异的期望值为24*0.01=0.24位,可以忽略不计。
表8 函数优化过程
复制后交交换配对 交换位置 新染色体 X值 适应度(目标函
2换集种群 数)f(x)=2x-5x+4
011010 3 3 001110 14 326
100100 4 4 100110 38 2702
101110 1 3 111010 58 6442
101110 2 4 101100 44 3656
和 13126
平均 3281.5
最大 6442
从表8可以看出,虽然仅进行了一代遗传操作,但种群适应度的平均值及最
大值却比初始群有了很大提高,平均值由2107.25变到3281.5,最大值由4006变到6442。这说明随着遗传运算的进行,种群正向着优化的方向发展。
1.[例5]:GA在子集和问题上的应用
子集和问题SUBSET_SUM:给定正整数集合S和一个整数t,判定是否存在S的一个子集
S',S使得S’中整数的和为t。
例如,若S={1,4,16,64,256,1040,1041,1093,1284,1344}且t=3754,则子集S’={1,16,64,256,1040,1093,1284}是一个解。
设子集和问题的一个实例为
。其中,S是一个正整数的集合{x,x,„,12x},t是一个正整数。子集和问题要求判定是否存在S的一个子集S’,使得n
x,t。我们已知道该问题是一个NP-完全问题。在实际应用中,我们常遇,ix,S'i
到的是最优化子集和问题。在这种情况下,我们要找出S的一个子集S’,使得
其和不超过t,但又尽可能接近于t。例如,我们有一辆载重车,其载重量不能
超过t公斤。有n个不同的箱子要用载重车来装运,其中第i个箱子重x公斤。i我们希望在不超过载重限制的前提下将载重车尽可能地装满。这个问题实质上就
是一个最优化形式的子集和问题。
下面用遗传算法来解决:
若集合S中元素的个数为n,每个元素只有两种可能:属于S’或不属于S’。
因此我们可以用n为二进制数来表示每个染色体。每一位,若为0则说明这个元素不属于S’,若为1则说明这个元素属于S’。
确定了问题的描述方式,我们只需随机取出染色体组成初始群体。接着,便
可以按前所述,进行选择、交换以及变异运算。
我们将染色体所表示的子集的元素和与所给t的差异记为适应度。
即令染色体x的每一位为x
,所表示元素的值为S则 ii
f(x),S,t ,ix,0i
第 9 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
但是经过实践后发现由于适应度相对差异较小,使得适应度非常接近,难以
区分优秀的染色体,使得遗传进化变得非常缓慢,且f(x)可能为负值,因此还
需对适应度函数做一下变换,才可以适合本题的要求。 令|f(k)|为当前群体中所有染色体适应度的最大值 f’(x)=|f(k)-f(x)|
所以适应度为f’(x)。
选择时可以用前面所介绍的适应度比例法,但采用随机方式,可能会出现随
机错误,使得优秀的染色体没有子孙。因此,在这里我们对选择方法作一下改进,
采用确定性选择法,使得选择不依靠随机的好坏,先计算群体中每个串的生存概
率
,1q then
begin
k:=p;
p:=q;
q:=k;
end;
k:=0;
for j:=p to q do
inc(k,pop[u,j]-pop[v,j]);{计算交换部分差距}
if not (((f1[u]<0) and (f1[v]>0) and (k>0)) or
((f1[u]>0) and (f1[v]<0) and (k<0))) then{若差异变大则不交换}
第 15 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
continue;
dec(f1[u],k);
inc(f1[v],k);
for j:=p to q do
begin{交换}
k:=pop[u,j];
pop[u,j]:=pop[v,j];
pop[v,j]:=k;
end;
end;
end;
procedure variety;{变异运算}
var i,j,k:integer;
begin
for i:=1 to pr do
begin
j:=random(pl)+1;{染色体}
k:=random(n)+1;{基因}
if ((f1[j]<0) and (pop[j,k]=0)) or {变异}
((f1[j]>0) and (pop[j,k]=1)) then
begin
inc(f1[j],(1-2*pop[j,k])*sset[k]);
pop[j,k]:=1-pop[j,k];
end;
end;
end;
begin
if sum<=t then
exit;
work:=true;
pr:=round(n*pl*pv);{计算变异次数}
dc:=0;
while work do
begin
select;{选择}
if dc>ec then
exit;{是否满足结束条件}
if work then
begin
cross;{交换}
variety;{变异}
end;
end;
end;
procedure output;{输出}
var fout:text;
i,k:integer;
s:longint;
begin
assign(fout,out);
rewrite(fout);
第 16 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
s:=0;
k:=0;
for i:=1 to maxn do
if result[i]=1 then
begin
inc(s,sset[i]);
inc(k);
end;
writeln(fout,s);
writeln(fout,k);
for i:=1 to maxn do
if result[i]=1 then
writeln(fout,i);
close(fout);
end;
begin{主程序}
input;
init;
solve;
output;
end.
说明:
在子集和问题中,随机构造的数据基本上都能达到最优解,偶尔也会收敛到
准最优解。总体情况非常良好。
2. 例6 TSP问题源程序
program TSP_GA;
const inp='tsp.in';{输入文件}
out='tsp.out'; {输出文件}
maxn=100;{城市最大值}
pl=100;{染色体个数}
pv=0.1;{遗传概率}
ec=100;{结束条件}
no=10000;{无通路} type ch=array[1..maxn] of integer;
var d:array[1..maxn,1..maxn] of integer;{邻接矩阵}
pop,pop1:array[1..pl] of ch;{染色体}
result:ch;{结果}
n:integer;{城市个数}
min:longint;{当前最短路径长度}
procedure input;{输入}
var i,j:integer;
fin:text;
begin
assign(fin,inp);
reset(fin);
readln(fin,n);
第 17 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
for i:=1 to n do
for j:=1 to n do
begin
read(fin,d[i,j]);
if d[i,j]=-1 then
d[i,j]:=no;
end;
close(fin);
end;
procedure init;{初始化}
var temp:ch;
i:integer;
procedure greedy;{贪心}
var use:array[1..maxn] of boolean;
i,j,k,min,r:integer;
begin
r:=random(n)+1;
fillchar(use,sizeof(use),true);
temp[1]:=r;
use[r]:=false;
for i:=2 to n do
begin
min:=no+1;
k:=0;
for j:=1 to n do
if use[j] then
if d[r,j]fm then
fm:=f[i];
end;
inc(dc);
fs:=0;
for i:=1 to pl do
inc(fs,fm+1-f[i]);
for i:=1 to pl do
g[i]:=trunc((fm+1-f[i])/fs*pl);
k:=0;
for i:=1 to pl do
for j:=1 to g[i] do
begin
inc(k);
pop1[k]:=pop[i];
f1[k]:=f[i];
end;
for i:=k+1 to pl do
begin
pop1[i]:=result;
f1[i]:=min;
end;
pop:=pop1;
end;
procedure variety;{变异}
var i,j,k,l,p:integer;
t:longint;
第 19 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
temp:ch;
begin
for i:=1 to pr do
begin
j:=random(pl)+1;
k:=random(n)+1;
l:=random(n)+1;
temp:=pop[j];
p:=temp[k];
temp[k]:=temp[l];
temp[l]:=p;
t:=suit(temp);
if tec then
exit;
if work then
variety;
end;
end;
procedure output;{输出}
var i:integer;
fout:text;
begin
assign(fout,out);
rewrite(fout);
for i:=1 to n do
writeln(fout,result[i]);
close(fout);
end;
begin{主程序}
input;
init;
solve;
output;
end.
说明:
第 20 页 共20页
IOI2002集训队论文 遗传算法的特点及其应用 张宁
由于TSP问题本身就是一个NP问题。对于随机构造的数据,无从知道最优
解,而且由于随机性,最优解与局部最优解的差距不会非常明显,虽然差距不明
显,但是可能路线截然不同。因此,可能会收敛到局部最优解。而人为构造的数
据,最优解有较明显的区别时,一般可以收敛到最优解。
1.邵军力 张 景 魏长华 《人工智能基础》 电子工业出版社
2.傅清祥 王晓东 《算法与数据结构》 电子工业出版社
3.吴文虎 王建德 《实用算法的分析与程序》 电子工业出版社
第 21 页 共20页