【发布时间】:2019-10-31 10:00:30
【问题描述】:
我正在尝试优化我的遗传算法的代码。 DNA 目前是一个字典,用于提高适应度计算的查找速度,但可以轻松更改为 numpy 数组。
突变率应该是1/L,L是DNA的长度。
此解决方案有效,但速度很慢:
# Iterate through genome, flip a gene with a probability of 1/L
def mutate(self):
self.dna = dict(
[(i, flip(self.dna[i])) if random.randint(0,num_genes) < 1
else (i, self.dna[i]) for i in range(num_genes)]
)
这个解决方案的速度大约是原来的两倍,但由于某种原因,它会产生更糟糕的结果:
# Select n number of genes calculated by 1/L, then change n random genes
def mutate(self):
num_mutations = sum(np.random.choice([0,1], num_genes, p=[(num_genes-1)/num_genes, 1/num_genes]))
for i in np.random.choice(num_genes-1, num_mutations):
self.dna[i] = flip(self.dna[i])
据我所知,它们突变相同数量的基因,并且输出应该相同。使用设置的随机种子运行 10 次表明后一种方法会导致更差的适应度结果。
为什么第二种方法会导致更差的 dna 适应度?这些方法的结果有何不同?
感谢您的帮助。
【问题讨论】:
-
您是否尝试过使用
np.random.binomial并为 size=num_genes生成? -
@dgumo 谢谢你的建议,现在试试。它的速度快了一点,但结果与使用 random.choice 相同。
标签: python numpy genetic-algorithm mutation