用遗传算法,适应度,变异解决填字游戏

时间:2011-05-02 16:33:40

标签: genetic-algorithm mutation genetic roulette-wheel-selection fitness

我正在努力为学校做一个实验室。我正在尝试使用遗传算法解决填字游戏。 问题是不是很好(它仍然太随机) 我将尝试简要说明我的程序现在如何实现:

如果我有拼图(#是块,0是空格)

#000
00#0
#000

以及这个谜题解决方案的候选词汇集。 我的DNA只是矩阵作为一维数组。

我的第一组个体从我的单词所包含的字母池中随机生成了DNA。

我使用轮盘选择进行选择。 关于组合和突变的可能性有一些参数,但如果发生突变,那么我将总是改变25%的DNA。 我用我的信件池中的随机字母更改它。(这可能会产生负面影响,因为突变可能会破坏已经形成的单词)

现在健身功能: 我遍历矩阵和verticaly: 如果我找到一个单词,那么FITNESS + = word.lengh +1

如果我找到一个字符串是某个单词的一部分,那么FITNESS + = word.length /(puzzle_size * 4)。无论如何,它应该给出0到1之间的值。 所以它可以从“工具”和广告X到FITNESS找到“to”,然后在它从“工具”找到“太”之后立即添加另一个Y来健身。

随着时间的推移,我的世代并没有真正改善。他们看似随机。 因此,即使经过400代1000-2000的游泳池(这些数字并不重要),当解决方案应该有6个单词时,我会得到一个1-2字(2或3个字母)的解决方案。

2 个答案:

答案 0 :(得分:1)

我认为您的健身功能可能不明确。我会设置它,所以每一行都有一个二元适应度。一行是合适的,还是不合适的。 (例如,一行是单词或不是单词)然后解决方案的整体适应性将是#fit行/总行(水平和垂直)。另外,你可能会改变过多的dna,我会做出那个变量并试验一下。

答案 1 :(得分:0)

你的健身功能看起来不错,虽然没有更多的细节,很难得到你正在做的事情的真实情况。

您没有指定突变概率,但是当您进行突变时,25%是非常高的突变。此外,轮盘赌轮选择应用选择压力的批次。你经常看到的是,算法很早就找到了比其他算法更好的解决方案,轮盘赌选择导致算法以很高的概率选择它,你很快就会得到一个满是副本的人口那个。此时,搜索暂停,除了偶尔的盲目幸运突变,并且由于你的突变是如此之大,你不太可能找到一个改善的移动而不会破坏染色体的其余部分。

我会尝试二元锦标赛选择,以及一个更明智的变异算子。通常的启发式人使用突变是(平均)翻转每个染色体的一个“位”。但是,您不希望每次都使用确定的一个字母更改。像这样:

for(i=0; i<chromosome.length(); ++i) {
    // random generates double in the range [0, 1)
    if(random() < 1.0/chromosome.length()) {
       chromosome[i] = pick_random_letter();
    }
}