遗传算法求解y=x2 - 副本

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

初始遗传算法及一个简单的例子

遗传算法(Genetic Algorithms, GA)是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。它模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。

下面我以一个实例来详细表述遗传算法的过程

例:求下述二元函数的最大值:

2

=]

y x

x∈

,0[

31

1、编码:

用遗传算法求解问题时,不是对所求解问题的实际决策变量直接进行操作,而是对表示可行解的个体编码的操作,不断搜索出适应度较高的个体,并在群体中增加其数量,最终寻找到问题的最优解或近似最优解。因此,必须建立问题的可行解的实际表示和遗传算法的染色体位串结构之间的联系。在遗传算法中,把一个问题的可行解从其解空间转换到遗传算法所能处理的搜索空间的转换方法称之为编码。反之,个体从搜索空间的基因型变换到解空间的表现型的方法称之为解码方法。

编码是应用遗传算法是需要解决的首要问题,也是一个关键步骤。迄今为止人们已经设计出了许多种不同的编码方法。基本遗传算法使用的是二进制符号0和1所组成的二进制符号集{0,1},也就是说,把问题空间的参数表示为基于字符集{0,1}构成的染色体位串。每个个体的染色体中所包含的数字的个数L 称为染色体的长度或称为符号串的长度。一般染色体的长度L为一固定的数,如本例的编码为

s1 = 1 0 0 1 0 (17)

s2 = 1 1 1 1 0 (30)

s3 = 1 0 1 0 1 (21)

s4 = 0 0 1 0 0 (4)

表示四个个体,该个体的染色体长度L=5。

2、个体适应度函数

在遗传算法中,根据个体适应度的大小来确定该个体在选择操作中被选定的概率。个体的适应度越大,该个体被遗传到下一代的概率也越大;反之,个体的适应度越小,该个体被遗传到下一代的概率也越小。基本遗传算法使用比例选择操作方法来确定群体中各个个体是否有可能遗传到下一代群体中。为了正确计算不同情况下各个个体的选择概率,要求所有个体的适应度必须为正数或为零,不能是负数。这样,根据不同种类的问题,必须预先确定好由目标函数值到个体适应度之间的转换规则,特别是要预先确定好目标函数值为负数时的处理方法。

如所求解的问题为:)(max f 直接设定个体的适应度函数值就等于相应的目标函数值,即2)(f x x =. 3、遗传算子 (1)比例选择:选择或称复制,建立在对个体适应度进行评价的基础之上。其作用是从当前群体中选择出一些比较优良的个体,并将其复制到下一代群体中。基本遗传算法采用比例选择的方法,所谓比例选择,是指个体在选择操作中被选中的概率与该个体的适应度大小成正比。本例选择概率的计算公式为:

∑==n j j s f s f 1

i i )

()

(p

其中f 为适度函数;)(i s f 为个体i s 的适应值,显然,适应值最高的个体被随机选定的概率就越大,被选择的次数就越多,从而被繁殖的次数也就越多。 (2)单点交叉。单点交叉又称简单交叉,是遗传算法所使用的交叉操作方法。

选择一个交叉点,子代在交叉点前面的基因从一个父代基因那里得到,后面的部分从另外一个父代基因那里得到。

如:

交叉前: 100|10

101|01

交叉后: 100|01

101|10

(3)基本位变异。基本位变异石最简单和最基本的变异操作,也是基本遗传算法中所使用的变异操作方法。对于基本遗传算法中用二进制编码符号串所表示的个体,对需要进行变异操作的某一基因,若原有基因值为0,则变异操作将该基因值变为1;反之,若原有基因值为1,则变异操作将其变为0.

基本位变异算子是指对个体编码串随机指定的某一位或某几位基因作变异运算。对于基本遗传算法中用二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则变异操作将其变为1;反之,若原有基因值为1,则变异操作将其变为0。

如:

变异前:

1001|0

变异后:

1001|1

(4)基本遗传算法的运行参数

本例中指定四个基本参数

种群大小:popsize

最大世代数 maxgeneration

交叉率pc

变异率pm

至于遗传算法的终止条件,还可以利用某种判定准则,当判定出群体已经进化成熟且不再有进化趋势时就可终止算法的运行过程。如连续几代个体平均适应度的差异小于某一个极小的值;或者群体中所有个体适应度的方差小于某一个极小的值。这4个参数对遗传算法的搜索结果及搜索效率都有一定的影响,目前尚无合理选择它们的理论根据在遗传算法的实际应用中,往往需要经过多次的试算后才能确定出这些参数合理的取值范围或取值大小

4、遗传算法的应用步骤如下:

遗传算法提供了一种求解复杂系统优化问题的通用框架,它不依赖于问题的领域和种类。对一个需要进行优化计算的实际应用问题,一般可按下述步骤来构造求解该问题的遗传算法。

第一步:建立优化模型,即确定出目标函数、决策变量及各种约束条件以及数学描述形式或量化方法。

第二步:确定表示可行解的染色体编码方法,也即确定出个体的基因型x及遗传算法的搜索空间。

第三步:确定解码方法,即确定出个体基因型x到个体表现型x的对应关系或转换方法。

第四步:确定个体适应度的量化评价方法,即确定出由目标函数值)

(f x到个体适应度)x(

F的转换规则。

第五步:设计遗传操作方法,即确定出选择运算、交叉运算、变异运算等具体操作方法。

第六步:确定遗传算法的有关运行参数,即确定出遗传算法的种群大小(popsize)、最大世代数 (maxgeneration)、交叉率(pc)、变异率(pm)等参数。

由上述构造步骤可以看出,可行解的编码方法、遗传操作的设计是构造遗传算法时需要考虑的两个主要问题,也是设计遗传算法时的两个关键步骤。对不同的优化问题需要使用不同的编码方法和不同的遗传操作,它们与所求解的具体问题密切相关,因而对所求解问题的理解程度是遗传算法应用成功与否的关键。

本例c语言代码

////////////////////////////////////

//遗传算法解决 y=x2问题

//编译环境 vc++6.0

//声明:部分代码来自网

#include

#include

#include

#include

#define POPSIZE 500 //种群大小

#define chromlength 5 //染色体长

int popsize ; //种群大小

int maxgeneration; //最大世代数

double pc = 0.0; //交叉率

double pm = 0.0; //变异率

struct individual //定义染色体个体结构体

{

int chrom[chromlength]; //定义染色体二进制表达形式,edit by ppme 将char 转为 int

double value; //染色体的值

double fitness; //染色体的适应值

};

int generation; //当前执行的世代数

int best_index; //最好的染色体索引序号

int worst_index; //最差的染色体索引序号

struct individual bestindividual; //最佳染色体个体

struct individual worstindividual; //最差染色体个体

相关文档
最新文档