我有一个二维数组,我想在其中创建一个组,组中的所有点之间的最大曼哈顿距离。组可以不相交。例如,从这个起始数组(10 x 10):
[[ 67 97 72 35 73 77 80 48 21 34]
[ 11 30 16 1 71 68 72 1 81 23]
[ 85 31 94 10 50 85 63 11 61 69]
[ 64 36 8 37 36 72 96 20 91 19]
[ 99 54 84 56 3 80 41 45 1 8]
[ 97 88 21 8 54 55 88 45 63 82]
[ 13 53 1 90 39 28 48 15 86 8]
[ 26 63 36 36 3 29 33 26 54 58]
[ 74 40 53 12 21 17 4 87 14 22]
[ 23 98 3 100 85 12 65 21 83 97]]
我应该可以把它分成不同的组。
我现在有一个函数,它可以找到我可以添加到一个有起点的组中的可能点(这里munip
是该组的第一个点):
def possible_munips(x, y, munip, dist_manhattan_max, temp_array):
list = []
for i in range(y):
for j in range(x):
if (j, i) != munip and munipIsValid(j, i, munip, dist_manhattan_max) and temp_array[i][j] != -1:
list.append((j, i, temp_array[i][j]))
我遍历一个二维数组temp_array
,其中已经被放入一个组的点的值被设置为-1。munipIsValid
检查该点是否位于距起点的最大曼哈顿距离处。
然后,我一个接一个地添加点,直到达到所需的组长度(k
),并确保每次向组中添加新点时,组都保持有效,如下所示:
munips = possible_munips(x, y, munip, dist_manhattan_max, temp_array)
while len(new_group) < k:
point = munips[0]
new_group.append(point)
if not groupIsValid(new_group, distManhattanMax, len(new_group)):
new_group.remove(point)
munips.remove(point)
current_sol.append(new_group)
for groups in current_sol:
for munip in groups:
temp_array[munip[1], munip[0]] = -1
我也试过添加一个交换函数,试图在两个组之间交换点,以使它们都有效。但有时它找不到解决方案,我留下了一个无效的组。
1条答案
按热度按时间uoifb46i1#
通俗地说,你希望找到k个分类区域,也就是所谓的聚类。在这种情况下,我建议你首先阅读聚类。在你获得足够的知识之后,你可以继续学习related question,它将这个分类推广为一个自定义的距离函数。