如何将N个数字分成N / 2组(每组2个数字),使得每组中2个数字之间的差异总和最小?

时间:2015-11-13 14:48:31

标签: algorithm optimization

一般问题描述

嗨,这实际上是一个特殊的分配问题(如果感兴趣,请查看wiki)。假设我有10个代理,表示为 A1,A2,... A10 ,我需要它们成对工作。虽然根据以前的经验,我知道每个双代理对的工作效率,所以我有一个如下所示的效率矩阵,(i,j)元素代表代理对的工作效率< em>(Ai,Aj)。因此,我们知道它应该是一个对称矩阵,这意味着 E(i,j)= E(j,i) E(i,i)应该是0现在,我需要将这10个代理分成5组,这样整体(总和)效率最大。

E =

 0    25    28    23    39    77    56    58    85    41
25     0    18    77    32    52    69    59    47    18
28    18     0    20    55    75    63    38     5    56
23    77    20     0    59    76    24    82    68    64
39    32    55    59     0    49    70    28    42    31
77    52    75    76    49     0    33    84    50    29
56    69    63    24    70    33     0    15    49    83
58    59    38    82    28    84    15     0    68    40
85    47     5    68    42    50    49    68     0    56
41    18    56    64    31    29    83    40    56     0

N.B。

  1. 从这个问题的矩阵视图中,我需要从上面的矩阵中选择5个元素,这样它们都不会与其他元素共享相同的索引。 (如果选择 E(2,3),那么由于分配了 A2 A3 ,您无法选择索引包含2或3的任何元素换句话说,你不能从第2,第3行和第2,第3列中挑选任何元素。)
  2. 此问题的标题与上面提到的特殊任务问题相同。
  3. 您可能会发现Hungarian(munkres) algorithm有帮助! Here matlab 代码。
  4. 此问题的另一个观点是解决正常分配问题,但我们需要找到一个解决方案,其元素关于对角线对称分布。
  5. 直接将匈牙利语(munkres)算法应用于对称效率矩阵并不总是有效。有时它会给出不对称的排列,例如
  6. E =

     0    30    63    32    20    40
    30     0    67    84    75    63
    63    67     0    37    79    88
    32    84    37     0    43    59
    20    75    79    43     0    56
    40    63    88    59    56     0
    

    最佳解决方案是:

    assignment =

     0     0     0     0     0     1
     0     0     0     1     0     0
     1     0     0     0     0     0
     0     1     0     0     0     0
     0     0     1     0     0     0
     0     0     0     0     1     0
    

1 个答案:

答案 0 :(得分:0)

这可以解决为weighted maximum matching problem,其中:

G = (V,E,w)
V = { all numbers } 
E = { (v,u) | v,u in V, v!=u }
w(u,v) = -|u-v|

最大匹配的解决方案将配对所有顶点(数字),使得sum { -|u-v| : u,v paired }的总和最大,这意味着sum { |u-v| : u,v paired最小。