Algorithm 求项目对之间全局最小距离的算法

Algorithm 求项目对之间全局最小距离的算法,algorithm,distance,mathematical-optimization,minimum,Algorithm,Distance,Mathematical Optimization,Minimum,项目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)

项目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的法律解决方案。暴力强制和测试所有可能的组合是不可能的,因为现实世界中有超过四个项目的组。

这是二部图的经典优化任务,可以通过解决。

这可以通过将其作为加权二部匹配问题的实例来解决。其思想是将元素a-d和0-3视为图中的节点,其中每个字母节点通过一条边连接到每个编号节点,该边的权重由矩阵指定。有了此图后,您希望找到一组边,这些边将字母与数字匹配,其中每个节点最多只连接到一条边。这样一组边称为匹配,因为您希望最小化距离,所以您正在寻找最小成本匹配

正如yiu_H指出的,这个问题已经得到了很好的研究,并且有很多很好的多项式时间算法。匈牙利算法也许是解决这个问题最著名的算法,但从那以后,又发明了一些渐进(或实际上)更快的算法


这个问题值得记住,因为它出现在许多情况下。当您需要将一个组中的项目分配给另一个组中的项目时,请检查是否可以将问题简化为两部分匹配。如果是这样的话,你几乎可以肯定地找到了解决最初问题的快速方法。

我想,唯一的办法就是你所描述的暴力。这两组之间有什么联系吗?我不太明白规则是什么。你只允许从每行中选择一个数字,并且只允许从每列中选择一个数字,你必须选择4个数字,并且你希望这4个数字的总和最小化吗?克宁,我想知道你为什么不认为有解决方案。我是否偶然发现了一个NP难问题?我想我不明白的部分是“将每个字母与一个数字匹配,这样总的距离是最小的,所以解决方案?”你肯定会将每个字母与它最近的数字匹配吗?还是每个数字只允许使用一次?罗伯特·金,完全正确。想象一下你洗衣服的时候。你想让你的四只右袜子中的每一只与最相似的左袜子相匹配。