【发布时间】:2016-05-17 08:52:28
【问题描述】:
考虑 2D、3D、(4D...) 空间中的点数组(例如 unstructured mesh 的节点)。最初,数组中点的索引与其在空间中的位置无关。在简单的情况下,假设我已经知道一些最近邻连接图。
我想要一些启发式方法来增加空间中彼此接近的两个点具有相似索引的概率(在数组中会接近)。
我知道精确解决方案非常困难(可能类似于 Travelling salesman problem ),但我不需要精确解决方案,只需要增加概率的东西。
我对解决方案的想法:
一些天真的解决方案就像:
1. for each point "i" compute fitness E_i given by sum of distances in array (i.e. index-wise) from its spatial neighbors (i.e. space-wise)
E_i = -Sum_k ( abs( index(i)-index(k) ) )
where "k" are spatial nearest neighbors of "i"
2. for pairs of points (i,j) which have low fitness (E_i,E_j)
try to swap them,
if fitness improves, accept
但具体实现及其性能优化不是很清楚。
其他不需要预先计算最近邻的解决方案将基于一些Locality-sensitive_hashing
我认为这可能是相当普遍的问题,并且可能存在好的解决方案,我不想重新发明轮子。
应用:
- 提高缓存局部性,考虑到内存访问通常是图遍历的瓶颈
- 它可以加速非结构化网格的插值,更具体地说是搜索靠近样本的节点(例如径向基函数的中心)。
【问题讨论】:
-
我什至不明白你在“幼稚的解决方案”中想说什么。如果两点接近或不接近,您的计算指标是什么?
-
一些指标,例如欧几里得。为什么?我使用哪个指标重要吗?最近的邻居也可以有多个定义,但一些自然定义将是距离最小的 N 个点。我不想指定这些细节,因为它会干扰问题的一般性。
-
gsamaras > 啊哈,混乱的根源是我搞砸了计算适应度的公式(更改为
k和j)。现在我将 i 更正为E_i = -Sum_k ( abs( index(i)-index(k) ) )...希望现在更清楚 -
你提到的LSH有什么问题?这似乎非常适合您的任务。
-
我怀疑@Regenschein,检查我的答案。
标签: sorting caching distance computational-geometry nearest-neighbor