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