基于距离的分组算法

时间:2018-05-15 17:58:32

标签: python-3.x

我有一组带有x和y坐标的200个点。我需要制作20个批次,这样批次中的每个点都是" n"距离其他19厘米,即一批中没有两个点在" n"另一个的厘米。一个点应该只属于一个批次。我该如何解决这个问题?

我已经使用树来绘制分支,这样只有在新的节点是" n"远离分支中的所有其他节点。这有效,但速度极慢。

Input.csv:| Point Name || X坐标|| Y坐标| 输出:批次列表

1 个答案:

答案 0 :(得分:0)

根据我的猜测,你应该这样做:

import math
from random import randrange

test_data = {(randrange(0, 1000), randrange(0, 1000)) for _ in range(200)}

inf = float("inf")


def distance(p1, p2):
    return math.hypot(p2[0] - p1[0], p2[1] - p1[1])


def batch(data: set, min_distance, max_distance=inf, count=20, remove=True):
    result = [next(iter(data))]
    candidates = {t for t in data if max_distance > distance(result[0], t) > min_distance}
    while len(result) < count and len(candidates) > 0:
        result.append(candidates.pop())
        candidates = {t for t in data if all(max_distance > distance(p, t) > min_distance for p in result)}
    if len(result)<count:
        raise ValueError("Not enough values in data that have great enough distances between each other")
    if remove:
        data.difference_update(result)
    return result

print(len(test_data))
i = 1
while test_data:
    print(i,batch(test_data, 10))
    i+=1