C# 遗传算法停止变异

C# 遗传算法停止变异,c#,algorithm,genetic-algorithm,C#,Algorithm,Genetic Algorithm,我目前正试图让我的遗传算法“生成”或“进化”到一个给定的单词。问题是,它从来没有完全达到这个词,它停止在一个太高的健身分数,即使它应该继续变异 举个例子: 用户输入=“HelloWorld” 500代之后=“XelgoWorfd” 我不知道为什么它不会继续变异。通常,它应该通过随机更改字符串中的一些字符来恢复 所以我很高兴能得到一些帮助 以下是一个基本的逐步解释: 用完全随机的字符串创建20条染色体 计算与目标词相比的体能得分。 (计算Ascii ID差异) 将两条染色体配上最好的分数 随机变异

我目前正试图让我的遗传算法“生成”或“进化”到一个给定的单词。问题是,它从来没有完全达到这个词,它停止在一个太高的健身分数,即使它应该继续变异

举个例子:

用户输入=“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;
    }
    
    public Chromoson[]mate(字符串基因){
    控制台。WriteLine(“[交配]进行中:“+gens+”+gene);
    int pivot=(int)数学圆((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[]列表=新的Chromoson[2];
    列表[0]=新的Chromoson(child1);
    列表[1]=新的Chromoson(child2);
    控制台。写线(“[配合]枢轴:”+枢轴);
    控制台写线(“[交配]子项:“+child1+”+child2);
    退货清单;
    }
    公共空变(浮动概率,整数可能变化){
    if(random.Next(0101)=50&&(int)构建器[index]<127&&chars.Contains(Convert.ToChar(构建器[index]+1)))
    builder[index]=Convert.ToChar(builder[index]+1);
    其他的
    变异(机会,可能的变化);
    gens=builder.ToString();
    }
    Console.WriteLine(“[变异]进行中”);
    }
    public void calculateCost(字符串otherGens)
    {
    int-total=0;
    对于(int i=0;i
    您的mutate和calculateCost函数很奇怪。特别是,mutate()看起来被设计成陷入局部极小值。任何向上或向下的变异都会比精英更糟糕(精英可能是相同的,所以交叉不会改变任何东西)。使用不同的变体:选择一个随机索引并完全更改它。还要从cost()中删除i*i。

    您的mutate和calculateCost函数很奇怪。特别是,mutate()看起来被设计成陷入局部极小值。任何向上或向下的变异都会比精英更糟糕(精英可能是相同的,所以交叉不会改变任何东西)。使用不同的变体:选择一个随机索引并完全更改它。同时将i*i从cost()中删除。

    在您的时间步中,有些东西完全关闭了:

  • 用完全随机的字符串创建20条染色体似乎还可以。
  • 计算与目标词相比的体能得分。(计算Ascii ID差异)似乎还可以。
  • 将两条染色体配上最好的分数什么?你只培育两条最合适的染色体来创造新的种群?这意味着你将拥有一个几乎完全相似的种群。繁殖能力成比例,因此所有基因组都有机会产生后代
  • 随机变异一些染色体(更改随机字符串字符)
  • 杀死90%的弱势群体,并用精英染色体(具有当前最佳适配分数的染色体)替换<你杀了90%?所以基本上,你每次迭代都保留2个最好的基因组,然后用第1步替换另外18个?您想要的是在第3步中保持2个最适合的个体,并通过繁殖创造另外18个个体。
  • 重复一切
  • 因此,请将步骤更改为:

    初始化。初始化群体,创建20条随机染色体

  • 计算每个色度体的分数
  • 将两条最适合的染色体保存到下一个群体(又称精英主义),通过按比例繁殖适合度获得其他18条所需的个体
  • 有一定机会使染色体突变
  • 重复

  • 不要每轮都随机创建个人。这将使您的算法变成随机搜索。

    在您的时间步长中,某些内容完全关闭:

  • 用完全随机的字符串创建20条染色体似乎还可以。
  • 计算与目标词相比的体能得分。(计算Ascii ID差异)似乎还可以。
  • 将两条染色体配上最好的分数什么?你只培育两条最合适的染色体来创造新的种群?这意味着你将拥有一个几乎完全相似的种群。繁殖能力成比例,因此所有基因组都有机会产生后代
  • 随机变异一些染色体(更改随机字符串字符)
  • 杀死90%的弱势群体,并用精英染色体(具有当前最佳适配分数的染色体)替换<你杀了90%?所以基本上,你每次迭代都保留2个最好的基因组,然后用第1步替换另外18个?您想要的是在第3步中保持2个最适合的个体,并通过繁殖创造另外18个个体。
  • 重复一切
  • 因此,请将步骤更改为:

    初始化。初始化群体,创建20条随机染色体

  • 计算每个色度体的分数
  • 将两条最适合的染色体保存到下一个群体(又称精英主义),通过按比例繁殖适合度获得其他18条所需的个体
  • 突变染色体