我正在尝试 Richard Dawkin 的Weasel 程序的 Python 版本,它演示了随机选择与累积选择之间的区别,并且我的变异算法存在一些问题。我在想也许我不明白如何使用 Python 随机库。这是有问题的代码:
#Cumulative selection guesser
while counter < 2:
for i in range(gen):
for j in range(len(child)):
mutation = random.randint(0,99)
if mutation in range(5):
child[j] = random.choice(chars)
offspring.append(child)
counter += 1
“Counter”用于测试,代码完成后将更改为与目标短语是否相等的测试,“child”是28个随机字母的列表,“gen”是代数,只是一个常数像 100 或 50 这样的数字,“chars”是大写字母和空格字符的字符串,“offspring”是一个空列表,我想将所有生成的“孩子”放入其中。如果这没有意义,我可以包括其余的代码,但我遇到的主要问题是每一代中的每个孩子都是完全相同的。
应该发生的是代码遍历“child”中的每个元素,如果发生突变,则将子元素中的特定元素更改为新的随机字符。然后“孩子”被添加到后代列表中。所以后代应该是这样的:
DDSMMHYODHFZTZRKWQUQYGMLUDB
DDSMMHYODHFZTZRKW M UQYGMLUDB
DDSM I HYODHFZTZRKWQUQYGMLUDB
D P SMMHYODHFZTZRKWQUQYGML Q DB
(变体加粗)
乘以变量“gen”指定的数量。相反,我让每个孩子都完全一样,没有变化,就像这样:
DDSMMHYODHFZTZRKWQUQYGMLUDB
DDSMMHYODHFZTZRKWQUQYGMLUDB
DDSMMHYODHFZTZRKWQUQYGMLUDB
DDSMMHYODHFZTZRKWQUQYGMLUDB
等我花了很长时间试图找出问题所在,并尝试分别测试代码的每一部分,它似乎按我预期的方式运行。我唯一能想到的是“突变”的值没有改变,因为当“random.randint()”被调用时,它只生成一个随机整数一次。这是随机函数的工作原理吗?我希望 for 循环的每次迭代都会生成一个新的随机整数。
如果有人有任何想法或建议,我将不胜感激。我在这里用头撞墙。另外,如果有帮助,我可以发布整个代码。谢谢!