openGauss源码解析(107)

openGauss源码解析:SQL引擎源解析(22)

5. 适应度计算

当得到了新生成的子染色体后,需要通过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);

}

}

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

6.4 小结

本章对SQL引擎的主要实现流程进行了介绍,包括SQL解析流程、查询重写、查询优化等。SQL引擎内容较多代码耦合度高,实现逻辑较为复杂,需要读者对代码整体流程以及关键结构体有所掌握,并在应用实践中不断总结才能做到更好的理解。

posted @ 2024-04-30 10:35  openGauss-bot  阅读(1)  评论(0)    收藏  举报