gpt4 book ai didi

python - 两个整数的二进制表示的统一重组

转载 作者:行者123 更新时间:2023-11-30 21:57:48 25 4
gpt4 key购买 nike

我需要快速实现以下问题,最好是作为 numba 函数。我从名为 integerlist 的列表中取出两个随机整数 a&b 并考虑它们长度 l 的二进制表示形式,例如a=10->1010b=6->0110。然后,我在两种二进制表示形式之间执行统一交叉,并将生成的二进制数的整数值保存在整数列表中的随机位置。均匀重组意味着整数c的二进制表示的每个条目以相同的概率从ab的二进制表示条目中取出,例如

a=10->1010
b=6 ->0110
1110 ->c=14

为此,我想出了以下代码,但速度不是很快。目前我正在尝试获取此函数的 numba 版本,但到目前为止尚未成功。你能帮忙吗?

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):前面,这已经大大提高了性能。我仍然好奇是否可以提高性能。

最佳答案

这是一种计算交叉的方法,我确信它更快:

def xover(a, b):
l = max(a.bit_length(), b.bit_length())
return a^((a^b)&random.randint(0, (1<<l)-1))

说明:

  • 我们首先使用按位异或来查找不同的位(对于其他位,我们从哪里获取它们并不重要,因此我们也可以从 a 中获取所有位)
  • 然后我们使用按位和随机掩码来平均删除其中一半
  • 最后再次使用按位异或来翻转 a 中的剩余位(我们知道在这些位置 a 翻转后是 b)

关于python - 两个整数的二进制表示的统一重组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55145361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com