我需要一个快速实现以下问题,最好作为一个numba函数。我从一个名为integerlist
的列表中取两个随机整数a
&;b
,然后考虑它们的长度的二进制表示l
,例如。
a=10->1010
,b=6->0110
。之后,我在两个二进制表示之间执行统一交叉,结果二进制数的整数值保存在integerlist
中的随机位置。均匀重组意味着整数c
的二进制表示的每个条目以相等的概率取自a
或b
的二进制表示条目,例如
a=10->1010
b=6 ->0110
1110 ->c=14
为此,我想出了下面的代码,这不是很快。目前,我正试图得到一个麻木版本的这个功能,但没有成功到目前为止。你能帮忙吗?你知道吗
def recombination(integerlist, l):
N = len(integerlist)
for x1 in range(N):
a = integerlist[random.randint(0, N-1)]
b = integerlist[random.randint(0, N-1)]
binary_a = list(map(int, numpy.binary_repr(a, width=l)))
binary_b = list(map(int, numpy.binary_repr(b, width=l)))
binary_c = [0]*l
for x2 in range(l):
if random.random() <= 0.5:
binary_c[x2] = binary_a[x2]
else:
binary_c[x2] = binary_b[x2]
c = 0
for bit in binary_c:
c = (c << 1) | bit
integerlist[random.randint(0, N-1)] = c
编辑:如果我用以下函数替换list(map(int, numpy.binary_repr(a, width=l)))
@nb.njit
def dec_to_binary_fct(a, l):
bin_temp = []
for i in range(l):
i = l-i-1
k = a >> i
if (k & 1):
bin_temp.append(1)
else:
bin_temp.append(0)
return bin_temp
我可以把@nb.njit
放在def recombination(integerlist, l):
前面,这已经大大提高了性能。我仍然很好奇能否提高表演水平。你知道吗
下面是一种计算交叉点的方法,我敢肯定它会更快:
说明:
相关问题 更多 >
编程相关推荐