我有一组点,并需要选择其中最佳的3个子集,其标准是该点的某些属性和点对的某些属性的线性总和。
在Python中,使用itertools.combinations很容易实现这个过程。
问题在于这是一种暴力解决方案,需要枚举所有可能的三点组合,这在点的数量为n时的时间复杂度为O(n^3),因此容易导致执行大量评估。我一直在努力研究是否有更有效的方法来解决这个问题,也许可以利用成本函数的线性性。
我试图将其转化为一个具有节点和边权重的networkx图形。但是,我还没有找到该工具包中可以计算“最短三角形”的算法,尤其是考虑边缘和节点权重的算法。(例如,最短路径算法通常只考虑边权重。)
有一些列出所有团的功能,然后我可以选择3-团,并计算成本,但这也是暴力方法,因此不比像上面那样使用combinations做的更好。
还有其他算法可以研究吗?
顺便说一下,如果我没有边缘权重,很容易只按节点权重排序并选择前三个点。所以真正增加了这个问题的复杂性是成对的成本。我想知道是否可以列出所有配对并找到构成三角形顶点的前k个顶点对,或者有更好的方法?至少如果我能够高效地枚举顶级候选项并在某些启发式停止枚举,这可能比暴力方法更好一些。
在Python中,使用itertools.combinations很容易实现这个过程。
all_points = combinations(points, 3)
costs = []
for i, (p1, p2, p3) in enumerate(all_points):
costs.append((p1.weight + p2.weight + p3.weight
+ pair_weight(p1, p2) + pair_weight(p1, p3) + pair_weight(p2, p3),
i))
costs.sort()
best = all_points[costs[0][1]]
问题在于这是一种暴力解决方案,需要枚举所有可能的三点组合,这在点的数量为n时的时间复杂度为O(n^3),因此容易导致执行大量评估。我一直在努力研究是否有更有效的方法来解决这个问题,也许可以利用成本函数的线性性。
我试图将其转化为一个具有节点和边权重的networkx图形。但是,我还没有找到该工具包中可以计算“最短三角形”的算法,尤其是考虑边缘和节点权重的算法。(例如,最短路径算法通常只考虑边权重。)
有一些列出所有团的功能,然后我可以选择3-团,并计算成本,但这也是暴力方法,因此不比像上面那样使用combinations做的更好。
还有其他算法可以研究吗?
顺便说一下,如果我没有边缘权重,很容易只按节点权重排序并选择前三个点。所以真正增加了这个问题的复杂性是成对的成本。我想知道是否可以列出所有配对并找到构成三角形顶点的前k个顶点对,或者有更好的方法?至少如果我能够高效地枚举顶级候选项并在某些启发式停止枚举,这可能比暴力方法更好一些。