暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss遗传算法适应度计算

openGauss小助手 2021-10-27
799

当得到了新生成的子染色体后,需要通过geqo_eval函数来计算适应度,随后使用spread_chromo函数将染色体加入到种群中。

/* 适应度分析*/

kid->worth = geqo_eval(root, kid->string, pool->string_length);

/* 基于适应度将染色体扩散*/

spread_chromo(root, kid, pool);

由于种群中的染色体始终应保持有序的状态,spread_chromo函数可以使用二分法遍历种群来比较种群中的染色体和新染色体的适应度大小并根据适应度大小来查找新染色体的插入位置,排在它后面的染色体自动退后一格,最后一个染色体被淘汰,如果新染色体的适应度最大,那么直接会被淘汰。具体代码如下:

/* 二分法遍历种群Pool中的染色体 */

top = 0;

mid = pool->size / 2;

bot = pool->size - 1;

index = -1;

/* 染色体筛选 */

while (index == -1) {

/* 下面4种情况需要进行移动*/

if (chromo->worth <= pool->data[top].worth) {

index = top;

} else if (chromo->worth - pool->data[mid].worth == 0) {

index = mid;

} else if (chromo->worth - pool->data[bot].worth == 0) {

index = bot;

} else if (bot - top <= 1) {

index = bot;

} else if (chromo->worth < pool->data[mid].worth) {

/*

* 下面这两种情况单独处理,因为他们的新位置还没有被找到

*/

bot = mid;

mid = top + ((bot - top) / 2);

} else { /* (chromo->worth > pool->data[mid].worth) */

top = mid;

mid = top + ((bot - top) / 2);

}

}

遗传算法会通过选择优秀的染色体以及多次的代际交叉,不断地生成新种群的染色体,循环往复,推动算法的解从局部最优向全局最优逼近。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论