【发布时间】:2017-10-10 23:54:34
【问题描述】:
我目前正在尝试使我的遗传算法“生成”或“进化”到给定的单词。问题是,它永远不会完全达到这个词,它会停止在过高的适应度分数上,即使它应该继续变异。
举个例子:
用户输入 = “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;
}
【问题讨论】:
-
请不要标记垃圾邮件。
-
可能是随机的? if (random.Next(0,101)
-
这不是完整的代码。请发帖Minimum, complete, verifiable example。
标签: c# algorithm genetic-algorithm