遗传算法的欺骗性景观

Deceptive landscapes for a Genetic Algorithm

我目前正在做一个关于遗传算法的项目,以及是什么让它们难以解决。对于这个项目,我需要生成一组二进制字符串并获取每个个体的适应度。

适应度函数应该给出全 1 的字符串是最佳适应度值,全 0 的字符串是第二好的值,然后 0 和 1 的任何变化应该 return 一个更差的值,如果有更多的 1(除非全为 1)和更好的值越多的零。

我的项目要求我将 GA 的性能与二进制字母与十进制字母进行比较。对于十进制字母表,我能够通过为每个数字分配权重来创建一个欺骗性的适应度函数,9 是最好的,8 是最差的,当你达到 0 时,值会增加。这导致 GA 远离提供欺骗性景观的最佳解决方案。

如果您对二元欺骗性适应度函数有任何建议,那就太好了。我已经包含了我的十进制字母表的适应度函数:

public float getFitness(){
    fitness= 0.00f;
    for(int j =0;j<genes.length;j++){
        if(genes[j]==9){
            fitness+=.901;
        }else{
            fitness=(fitness+(1-(genes[j]+1)*.100f));
        }
    }       

    fitness = fitness/genes.length;
    fitness = Math.round(fitness *10000.0f)/10000.0f; 

    return fitness;
}

如果将适应度值分配给符号组而不是单个符号,则可以使用二进制字母表实现相同的目的。

例如,使用 3 个符号为一组可以得到 2^3=8 个值,因此您对字母表 0-9 使用的相同想法在这里也适用。