项目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,依此类推。
是否有一种算法可以将每个字母与一个数字相匹配,从而使总距离最小化? E.g:
[('a', 1), ('b', 3), ('c', 0), ('d', 2)]
总距离是一个合法的解决方案:2 + 1 + 3 + 7 = 13.由于真实世界的群组中包含的内容超过四个,因此无法强制执行和测试所有可能的组合。
答案 0 :(得分:9)
这是二分图的经典优化任务,可以使用Hungarian algorithm/method来解决。
答案 1 :(得分:1)
这可以通过将其视为加权二分匹配问题的实例来解决。该想法是将元素a-d和0-3视为图中的节点,其中每个字母节点通过其权重由矩阵指定的边连接到每个编号节点。获得此图形后,您希望找到一组与字母匹配的边缘,其中每个节点仅连接到最多一个边缘。这样的一组边称为匹配,因为您希望最小化距离,以寻找最低成本匹配。
正如yi_H指出的那样,这个问题已得到充分研究,并且具有许多良好的多项式时间算法。匈牙利算法可能是这个问题最着名的算法,但从那时起发明的其他算法渐渐(或实际上)更快。
这个问题值得记住,因为它出现在很多情况下。只要您需要将一个组中的项目分配给另一个组中的项目,请检查是否可以将问题减少到二分匹配。如果是这样,你几乎肯定找到了最初问题的快速解决方案。