我有以下问题。在我的代码中
我有大小为L的数组。所有数组的条目都是0或1。让我们设置L = 3作为例子。三个可能的数组是(1,1,1)
,(1,0,0)
和(0,1,1)
。现在我想知道(1,0,0)
和(0,1,1)
可以形成(1,1,1)
有多少单个交叉。答案是一个。要使(1,0,1)
和(0,1,0)
形成(1,1,1)
,答案将为0,因为我需要两个交叉。我正在寻找一种针对一般L的算法(L通常不大于9)。到目前为止,我没有任何想法,这就是为什么我发布这个问题她,但如果我有一个,我会做一个编辑。希望你能帮助我:)。
编辑:结果当然不仅可以是0或1,还可以大于1。
示例:(1,1,0,0)
和(0,0,0,0)
形成(0,0,0,0)
结果将是2.(我只能获取第一个数组的最后一个条目或第一个数组的最后两个条目)
编辑2:通过单交叉我的意思是,我可以取第一个序列的左/右侧和第二个序列的右/左侧来形成给定的第三个序列。 (1,1,0,0)
和(0,0,0,0)
形成(0,0,0,0)
- > 0,0)
+ (0,0,
或0)
+ (0,0,0,
答案 0 :(得分:2)
解释问题的另一种方法是计算Hamming Distance。这是一个片段,用于创建每个汉明距离/交叉的所有对的字典。
from itertools import combinations
tuples = [(0, 0, 1), (1, 0, 0), (1, 0, 1)]
crossovers = {k: [] for k in range(len(tuples[0]))}
for a, b in combinations(tuples, r=2):
num_crossovers = sum(el1 != el2 for el1, el2 in zip(a, b))
crossovers[num_crossovers].append((a, b))
执行交叉后将如下
{0: [],
1: [((0, 0, 1), (1, 0, 1)), ((1, 0, 0), (1, 0, 1))],
2: [((0, 0, 1), (1, 0, 0))]}
修改强>
我错过了你使用numpy数组而不是元组,你可以做
arrays = np.array([[0, 0, 1], [1, 0, 0], [1, 0, 1]])
crossovers = {k: [] for k in range(arrays[0].size)}
for a, b in combinations(arrays, r=2):
num_crossovers = sum(np.abs(a - b))
crossovers[num_crossovers].append((a, b))