我目前正试图使我的遗传算法“生成”或“进化”到一个给定的词问题是,它从来没有完全达到这个词,它停在一个过高的健身分数,即使它应该继续变异。
下面是一个例子:
用户输入=“HelloWorld”
500代之后=“XelgoWorfd”
我不知道为什么它不会继续变异通常情况下,它只需要随机更改字符串中的一些字符就可以恢复。
所以我很高兴能得到帮助。
下面是一个基本的逐步解释:
用完全随机的字符串创建20条染色体
计算健身得分与目标词的比较。
(计算Ascii id差异)
把两条染色体配成最好的。
随机改变一些染色体(改变随机字符串字符)
杀死90%的弱势群体,用精英染色体(目前最适合的染色体)代替。
重复一切。
所以这里是我算法中最重要的方法:

public Chromoson[] mate(string gene) {
    Console.WriteLine("[MATING] In Progress : "+gens+" "+gene);

    int pivot = (int)Math.Round((double)gens.Length / 2) - 1;

    string child1 = this.gens.Substring(0, pivot) + gene.Substring(pivot);
    string child2 = gene.Substring(0, pivot) + this.gens.Substring(pivot);

    Chromoson[] list = new Chromoson[2];

    list[0] = new Chromoson(child1);
    list[1] = new Chromoson(child2);

    Console.WriteLine("[MATING] Pivot : "+pivot);
    Console.WriteLine("[MATING] Children : "+child1+" "+child2);

    return list;
}

public void mutate(float chance, int possiblyChanges) {
    if (random.Next(0,101) <= chance) return;

    int changes = random.Next(0, possiblyChanges + 1);
    //int index = (int) Math.Floor((double)random.Next() * this.gens.Length);

    for (int i = 0; i < changes; i++) {
        int index = random.Next(0, 13);
        StringBuilder builder = new StringBuilder(gens);
        int upOrDown = random.Next(0, 101);

        if (upOrDown <= 50 && (int)builder[index] > 0 && chars.Contains(Convert.ToChar(builder[index] - 1)))
            builder[index] = Convert.ToChar(builder[index] - 1);
        else if (upOrDown >= 50 && (int)builder[index] < 127 && chars.Contains(Convert.ToChar(builder[index] + 1)))
            builder[index] = Convert.ToChar(builder[index] + 1);
        else
            mutate(chance, possiblyChanges);

        gens = builder.ToString();
    }
    Console.WriteLine("[MUTATING] In Progress");
}

public void calculateCost(string otherGens)
{
    int total = 0;
    for (int i = 0; i < gens.Length; i++)
    {
        total += (((int)gens[i] - (int)otherGens[i]) * ((int)gens[i] - (int)otherGens[i])) * (i*i);
    }
    Console.WriteLine("[CALCULATING] Costs : " + total);
    this.cost = total;
}

最佳答案

在你的时间里有些事情是完全没有意义的:
用完全随机的字符串创建20条染色体。看起来不错。
计算健身得分与目标词的比较。(计算ascii id差异)。看起来不错。
把两条染色体配成最好的。什么?你唯一培育出两条最合适的染色体来创造新的种群?这意味着你将拥有一个几乎完全相似的人口。按比例繁殖,所以所有的基因组都有机会生育后代
随机改变一些染色体(改变随机字符串字符)
杀死90%的弱势群体,用精英染色体(目前最适合的染色体)代替。你杀了90%所以基本上,每次迭代都保留两个最好的基因组,然后用步骤1替换另外18个?你想要的是在第三步中保持2个最适合的个体,并通过繁殖创造另外18个个体。
重复一切。
因此,请将您的步骤更改为:
初始化初始化种群,创建20个随机染色体
计算每个色度的分数
把两条最适合的染色体保存到下一个群体(又称精英主义),通过按比例繁殖合适的个体来获得其他18个需要的个体
用一定的机会变异染色体
重复
不要每轮都随机创建个人。这会把你的算法变成随机搜索。

07-28 12:00