进化规划算法

来源:互联网 发布:1.5斤麒麟鞭弹簧垫数据 编辑:程序博客网 时间:2024/06/08 14:32

算法描述

        EP 是 L. J. Fogel 于20世纪60年代在人工智能研究中提出的一种有限状态机进化模型,在此模型中机器的状态基于分布的规律进行编译。

        D. B. Fogel 在90年代拓广了 EP 思想,使它可处理实数空间的优化问题,并在变异运算中引入了正态分布变异算子,这样 EP 就变成了一种优化搜索工具,并在很多实际问题中得到了应用。

        EP 模拟生物种群层次上的进化,因此在进化过程中主要强调生物种群行为上的联系,即强调种群层次上的行为进化而建立父、子代间的行为链,意味着好的子代才有资格生存,而无论其父代如何,适于选择子代。

算法流程

初始化(个体表现型X, 群体规模N, 迭代次数G等)随机产生初始群体并计算适应值(含N 个个体) while (not done){for(i = 1; i < N; i++){对Xi进行变异得到Xi' 对Xi进行可行性检查计算xi的适应值 }从2N 个个体中选择N 个个体 (采用q-竞争算法)} 输出结果 

对算法流程的解释

        ①个体表现型X : X = (x1, x2, ┉┉ ,xn, σ1,σ2, ┉┉ σn),其中x1 ┉┉ xn为个体表现的分量,σ1 ┉┉ σn为个体表现分量的变异参数;

        ②群体规模N : 为改算法中包含的个体数;

        ③随机产生初始群体 : 在个体表现型X中对于个体 xi 初始化为再该分量中范围内随机取值,σi 根据 N(0, 1)产生,并计算该个体的适应值;

        ④对 Xi 进行变异得到 Xi‘  : 可根据如下公式进行变异;


        ⑤对 Xi’ 进行可行性检查,计算适应值 : 对 Xi‘ 中的各个分量在取值范围内进行判断,若不符合取值范围,处理方法可见下一节,若符合,计算该个体的适应值;

        ⑥从2N个个体中选择N个个体 : 方法采用随机型q-竞争法,详细请参看下一篇博文;

一些问题的解释

        ①个体变异不成功: 可采用三种方法:(1)重新变异直至可行; (2)从解空间中随机选取一个可行解代替; (3)选择当代中的最优解代替;

        ②变异公式: 变异公式可根据实际情况略作修改,如:将 + 改为 - ;

q-竞争选择算法:
进化规划算法的选择策略采用的是q-竞争机制,这也是与进化策略算法最大的不同点,q-竞争说白就是选择优质解的同时,以一定的随机概率接受较差的解。多数是优解,
少数是比较差的解,共同组成一组父代,为下一次进化做准备。

思想:
将N个父代进化的N个子代一起放在一起,从中随机选择不重复q个个体组成一个组,然后依次对2N个个体的每一个个体进行计分,将2N个依次每次一个与随机挑选出的群组的每一个成员进行比较,相比优的话,则会对应的个体的分数加1,最后对分数进行排序,选择分数最高的N个个体!

代码实现:
#define  PARENTS 20//父代个数,一个生一个
#define  CHILDREN 20//子代个数,一个生一个
#define  Q           18 //0.9*Parents的竞争数
void qSelect(Individual* Pop)
{
int QCompete[Q] , QNum, j = 0;//挑选Q个随机量
Individual Max;
for(int i=0;i<Q;i++)
{
QCompete[i] = -1; 
}
for (int i = 0; i < Q; i++)//从父代和子代中挑Q个个体
{
while (true)
{
QNum = randT<int>(0, PARENTS + CHILDREN);//产生0~(PARENTS + CHILDREN)之间随机数
for (j = 0; j < i; )
{
if (QNum == QCompete[j])
break;
j++;

}
if (i <= j)
break;
}
QCompete[i] = QNum;
}
for (int s = 0; s < PARENTS + CHILDREN; s++)//清除上一次的计分
Pop[s].Score = 0;
for (int k = 0; k < CHILDREN + PARENTS; k++)//计分
{
for (int l = 0; l < Q; l++)
{
if (Pop[k].Fitness >= Pop[QCompete[l]].Fitness)//比随机挑选的优秀,朝最大值方向进化
{
Pop[k].Score++;
}
}
}
for (int q = 0; q < PARENTS + CHILDREN; q++)//得分最高者上位,选择优秀个体
{
Max = Pop[q];
for (int p = q + 1; p < PARENTS + CHILDREN; p++)
{
if (Pop[p].Score > Max.Score)
{
Pop[q] = Pop[p];
Pop[p] = Max;
Max = Pop[q];//更新得分最高个体
}
}
}
 
}
template<typename T>
T randT(T Lower, T Upper)
{
T temp;
if (Lower > Upper)
{
temp = Upper;
Upper = Lower;
Lower = temp;
}
return (double)rand()/RAND_MAX *(Upper - Lower) + Lower;
}

参考:

1、http://blog.csdn.net/joe_lq/article/details/48655707



0 0
原创粉丝点击