我正在尝试编写一个Java程序,该程序生成大量随机字符,并最终落入输入的字符串以模拟类似无限猴子定理(https://en.wikipedia.org/wiki/Infinite_monkey_theorem)的东西。我遇到的问题是在测试过程中,所有初始种群的适应度均为0,因此在自然选择过程中没有任何东西添加到交配池中。这就是项目的意义。

目标:字符串“ Hello”

变异率:0.01

最大人口:100个DNA对象,每个对象包含基因的char []数组。

这是我计算适应度的函数:

public void calcFitness(String target){
        double score = 0.0;
        for(int i = 0; i < this.genes.length; i++){
            if(this.genes[i] == target.charAt(i)){
                score++;
            }
        }
        this.fitness = score/this.genes.length;
    }


我是基因编程新手,不知道自己在做什么错,对您的任何帮助都将不胜感激,对基因编程的任何技巧或见解也将不胜感激。

编辑

这是选择过程的代码:

 public void naturalSelection(){
        ArrayList<DNA> selection = new ArrayList<>();
        Random rand = new Random();
        String child = "";
        DNA[] newPop = new DNA[popMax];
        for(int i = 0; i < population.length; i++){
            for(int j = 0; j < population[i].getFitness(); j++){
                selection.add(population[i]);
            }
        }
        for(int i = 0; i < selection.size(); i++){
            int parentSelect = rand.nextInt(selection.size());
            DNA parent1 = selection.get(parentSelect);
            child = parent1.split(true);
            parentSelect = rand.nextInt(selection.size());
            DNA parent2 = selection.get(parentSelect);
            child += parent2.split(false);
            newPop[i] = new DNA(child);
        }
        double mutation = rand.nextDouble();
        if(mutation < this.mutationRate){
            this.population = swapMutation(newPop);
            calcFittest();
        }
        else{
            this.population = newPop;
            calcFittest();
        }
    }


如果发生突变,则swap突变会交换两个随机字符。

最佳答案

我建议使用适合度函数来测量从候选者到目标字符串的距离。然后,您将使整体适应度最小化而不是最大化。

去做这个:

public void calcFitness(String target){
    double score = 0.0;
    for(int i = 0; i < this.genes.length; i++){
        score += Math.abs((int)this.genes[i] - (int)target.charAt(i));
    }
    this.fitness = score / this.genes.length;
}


这应该更好地工作,因为它将更好地区分每个候选人。没有看到您正在使用的随机字符串生成器,这很难说,但是可能的候选对象的数量是天文数字,而且他们中的任何一个都不能用您的适应度函数得分。

可能还需要指出,您的代码可能是遗传算法而不是遗传编程的一部分。

如果您想改进选择,我将推荐一种易于编程的技术“比赛选择”-从总体中选择n个随机个体,然后从n个个体中选择最佳适应个体。与其他人相比,这为更好的候选人提供了更高的被选机会,并具有额外的好处,您无需计算每个人口中每个人的适应度。

10-08 02:06