Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当列表不断增长时,高效的最近邻搜索?_Python_Nearest Neighbor - Fatal编程技术网

Python 当列表不断增长时,高效的最近邻搜索?

Python 当列表不断增长时,高效的最近邻搜索?,python,nearest-neighbor,Python,Nearest Neighbor,我一直在重写一个旧的迷宫类型的东西,我只是为了好玩,虽然它不是一个迷宫,而是有点抽象和缩小,所以我不能只做一个if location in locations搜索 我已经做了一个基本的最近邻搜索,并尝试对其进行一些优化,但它仍然非常缓慢,因为每增加10倍的节点,就需要增加1000倍的计算(10000个节点上需要1670亿次计算,仅用于碰撞检查),所以我不认为有更多的工作可以做 这里的代码经过轻微编辑,可以独立工作,节点通常是一个类,我遍历每个节点并获取size/location属性(将它们更改为

我一直在重写一个旧的迷宫类型的东西,我只是为了好玩,虽然它不是一个迷宫,而是有点抽象和缩小,所以我不能只做一个
if location in locations
搜索

我已经做了一个基本的最近邻搜索,并尝试对其进行一些优化,但它仍然非常缓慢,因为每增加10倍的节点,就需要增加1000倍的计算(10000个节点上需要1670亿次计算,仅用于碰撞检查),所以我不认为有更多的工作可以做

这里的代码经过轻微编辑,可以独立工作,节点通常是一个类,我遍历每个节点并获取size/location属性(将它们更改为
node[0]
node[1]
)。想象一下,
节点列表
有数千个值

dimensions = 3
dimensions_range = range(dimensions)
def collision_check(node_list, location, size, bounds=None):

    #Check new node is within bounds (if set)
    if bounds:
        for i in dimensions_range:
            if not bounds[0][i] + size <= location[i] <= bounds[1][i] - size:
                return True

    #Find if any nodes are overlapping
    for node in node_list:
        size_total = size + node[0]
        distance = [abs(a - b) for a, b in zip(location, node[1])]

        #Take these two lines out and the time taken doubles
        if max(distance) > size_total:
            continue

        #Square to do one half of pythagoras
        distance_total = sum(pow(i, 2) for i in distance)
        if distance_total < pow(size_total, 2):
            return True

    return False

node_list = [
[0.5, (0, 0, 0)],
[0.5, (0, 0, 1)]
]

new_size, new_loc = [0.5, (0, 0, 2)]
print collision_check(node_list, new_loc, new_size)
#No collision

new_size, new_loc = [0.6, (0, 0, 2)]
print collision_check(node_list, new_loc, new_size)
#Collision
dimensions=3
尺寸\范围=范围(尺寸)
def碰撞检查(节点列表、位置、大小、边界=无):
#检查新节点是否在范围内(如果已设置)
如果边界:
对于尺寸_范围内的i:

如果没有边界[0][i]+大小,您可能会发现四叉树算法对此很有用。总之,您的迷宫将被划分为四个象限,每个子节点中都有四个象限。当您开始执行碰撞检测时,您将从树的顶部遍历一个评估“我是否在此节点中”的值。如果是,则遍历更深,否则移动下一个节点。我在手机上,所以无法提供完整的答案,但这里有一篇关于实现四叉树的很酷的文章:它通常用于2D和3D游戏开发。该资源对于在2D环境中实现一些代码来说也很好。谢谢,我会考虑一下这种方法,我必须弄清楚如何让它在任何数量的维度上工作,这可能相当困难。但有一件事,我的东西在范围内可能是无限的,但当我以前尝试八叉树时,我发现超出初始范围是有问题的,你会建议在这种情况下,只将大小加倍并重新计算所有点吗?在2D环境中,这并不太难,因为你不需要处理Z平面,在你想要处理3D的时候,我有一个C++实现的实现:它的评论相当好,但是在那里处理顶点缓冲区等的错误代码很多(与你想要的完全无关)。您应该能够轻松地将迷宫动态划分为象限。当游戏加载时,你将初始切片分为4个象限,然后决定需要多少子节点。谢谢,我是在3D软件中进行的,但例如,我可以轻松地生成4D,并将其与关键帧链接,以使点出现和消失,这就是为什么我需要尝试制作一个动态八叉树的东西,它适用于你输入的任何维度。如果我超出范围,把树扩大一下怎么样?