这篇文章是我在做 scikit-opt 的时候,对一些常用算子进行深入思考,得到的优化经验。会持续更新。
(知乎的排版不尽如人意,如果感觉有违和的地方,去这里看 https://scikit-opt.github.io/scikit-opt/#/zh/speed_up)
(再注明:下面把一次矢量化运算的复杂度记为O(1),虽然这样相当不准确,但方便说明问题)
0/1 基因的mutation
做一个mask,是一个与 Chrom
大小一致的0/1矩阵,如果值为1,那么对应位置进行变异(0变1或1变0)
自然想到用整除2的方式进行
def mutation(self):
# mutation of 0/1 type chromosome
mask = (np.random.rand(self.size_pop, self.len_chrom) < self.prob_mut) * 1
self.Chrom = (mask + self.Chrom) % 2
return self.Chrom
如此就实现了对整个种群全基因的矢量化运算。用pycharm的profile功能试了一下,效果良好
再次改进。我还嫌求余数这一步速度慢,画一个真值表