查找项目对之间的全局最小距离的算法
Posted
技术标签:
【中文标题】查找项目对之间的全局最小距离的算法【英文标题】:Algorithm to find the global minimal distance between item pairs 【发布时间】:2011-10-28 21:11:51 【问题描述】:项目 a-d 将与项目 0-3 配对,以使所有项目对之间的总距离最小化。例如,这个矩阵可以描述第一组中的每个项目与其对应组中的项目之间的距离:
[[2, 2, 4, 9],
[4, 7, 1, 1],
[3, 3, 8, 3],
[6, 1, 7, 8]]
这应该意味着距离'a' -> '0' 是2,距离'a' -> '1' 是2,距离'a' -> '2' 是4,'a' - > '3' 是 9。从 'b' -> '0' 是 4,依此类推。
有没有一种算法可以将每个字母与一个数字匹配,从而使总距离最小化?例如:
[('a', 1), ('b', 3), ('c', 0), ('d', 2)]
这将是一个总距离为:2 + 1 + 3 + 7 = 13 的合法解决方案。由于现实世界中的组包含四个以上的项目,因此无法强制和测试所有可能的组合。
【问题讨论】:
恕我直言,唯一的方法是你描述的蛮力。两组之间是否存在某种联系? 我不明白规则是什么。是不是每行只能选一个数字,每列只能选一个数字,而且要选4个数字,你想让这4个数字的总和最小? CKoening,我很想知道您为什么认为没有解决方案。我是否偶然发现了一个 NP 难题? 我想我不明白的部分是“将每个字母与一个数字匹配,从而使解决方案的总距离最小化?”您肯定会将每个字母与其最接近的数字匹配吗?还是每个数字只能使用一次? 罗伯特·金,完全正确。把它想象成你洗衣服的时候。您希望将四只右袜子中的每只都与最相似的左袜子相匹配。 【参考方案1】:这是二部图的经典优化任务,可以通过Hungarian algorithm/method 解决。
【讨论】:
【参考方案2】:这可以通过将其视为加权二分匹配问题的一个实例来解决。这个想法是将元素 a-d 和 0-3 视为图中的节点,其中每个带字母的节点都连接到每个编号的节点,其边的权重由矩阵指定。一旦你有了这个图,你想找到一组匹配字母和数字的边,每个节点最多只连接一个边。这样的一组边称为匹配,由于您希望最小化距离,因此您正在寻找最小成本匹配。
正如 yi_H 所指出的,这个问题已经得到了充分的研究,并且有很多很好的多项式时间算法。匈牙利算法也许是解决这个问题最著名的算法,但从那时起,人们发明了其他算法,它们渐近(或实际上)更快。
这个问题值得记住,因为它在很多情况下都会出现。每当您需要将一组中的项目分配给另一组中的项目时,请检查是否可以将问题简化为二分匹配。如果是这样,您几乎肯定已经找到了解决最初问题的快速解决方案。
【讨论】:
以上是关于查找项目对之间的全局最小距离的算法的主要内容,如果未能解决你的问题,请参考以下文章