组织矩阵以使邻居最接近的算法

时间:2019-01-16 11:53:38

标签: algorithm math matrix minimize

这是我的问题:

我想将N个正整数组织到AxB矩阵中,以使相邻单元之间的差异最小。 N大于AxB,所以我有很多可能的选择。

例如,如果我将数字1、3、4、9、21放置在2x2矩阵中,

我可以建立这个矩阵:

5 4
1 9

我们可以计算相邻单元之间的差之和: (5-4)+(5-1)+(9-4)+(9-1)= 1 + 4 + 5 + 8 = 18

但是如果我这样重新排列数字:

1 4
5 9

总和为(5-1)+(4-1)+(9-5)+(9-4)= 4 + 3 + 4 + 5 = 16 哪个更好。

尽管我使用蛮力,通过切换每个数字并每次计算总和,但是我的实际问题有一个4 * 5矩阵和41个数字可供选择,因此可能的矩阵数是41!/ 20! (654 764 331 820 982 885 260 361 465 856)。

有人知道如何以不同的方式解决问题吗?

4 个答案:

答案 0 :(得分:3)

这实际上是一个更简单的问题。用您的小学代数打它。 首先,一点洞察力将表明您始终希望对数字进行排序,以便从左上角到右下角进行排序。上升或下降都可以;它们是同构的。让我们假设升序以匹配您的示例。对于一组9个数字:

i1 i2 i3
i4 i5 i6
i7 i8 i9

我们需要对条款进行总结

// ROWS
i2-i1 + i3-i2 +
i5-i4 + i6-i5 +
i8-i7 + i9-i8 +
// COLUMNS
i4-i1 + i7-i4 +
i5-i2 + i8-i5 +
i6-i3 + i9-i6

这减少到     i3-i1 + i6-i4 + i9-i7 +     i7-i1 + i8-i2 + i9-i3

然后变成     2 * i9-2 * i1 + i6 + i8-(i2 + i4)

首先对您的N号进行排序,然后找出A * B号的连续子序列,最低和最高之间的差最小。然后排列非角边界编号,以使(上+左)-(下+右)差异最小,并注意每对之间可以有多少个数字。最后,以任何合法方式填写中间内容。

非常简单,这将减少到顶部和左侧边缘的总和,减去底部和右侧边缘的总和。主角数加倍;右上角和左下角以及所有内部术语都将退出。

是的,我省略了一些逻辑步骤...希望对您有足够的提示。它将搜索空间从A*B中提取的N个数字减少到A+B-2中该序列的两个连续A*B个数字序列。

答案 1 :(得分:1)

要返回@Prune解决方案和不同的注释,重要的是要了解所产生的方程式。

因为数字在每一行和每一列上都进行了排序,所以将带有abs()的全局方程简化为for all lines and columns sum(last-first)

生成的方程式包含六个组,这些组相加2*RB - 2*TL + RE + BE - LE - TE,其中:

  • 将左上角元素两次设为负数:TL
  • 将右下角元素两次设为正数:RB
  • 最右边一列中所有元素的总和,除四角:RE
  • 底角上除拐角处的所有元素的总和:BE
  • 除拐角处最左列的所有元素的总和:LE
  • 顶角上除拐角处的所有元素的总和:TE

这个想法是使所选RE + BE - LE - TERB元素的TL边元素最小。

如果我们将此公式应用于下方的矩阵,则边缘元素的结果为8+12+14+15-2-3-5-9 = 49-19 = 30

 1  2  3  4
 5  6  7  8
 9 10 11 12
13 14 15 16

如果我们将此公式应用于下方的矩阵,则边缘元素的结果为11+14+13+15-2-4-3-6 = 53-15 = 38,这并非最小。

 1  2  4  7
 3  5  8 11
 6  9 12 14
10 13 15 16

因此,就这一点而言,将边缘分量最小化似乎是一个好方法。 问题是如何在遵守>行和列规则的同时最小化该元素。但是,用数字从左到右,从上到下填充矩阵可能会得到足够好的结果。

关于具有41个可用值的矩阵4*5的问题,比较一下对这41个数字进行排序后得到的22个矩阵,将它们线性填充并查看矩阵 s < / strong>,极端元素之间的间隔最小(我刚刚意识到,您可以有多个矩阵,第一个元素与最后一个元素之间的距离相同,但总距离不同)实际上是 s 距离”,由abs()公式定义。

让我们知道。

附录

以下是4x5(行x列)矩阵的一些示例。我很想看看其他方法的结果,看看该方法有多理想!

Elements = [3, 6, 59, 75, 76, 120, 132, 140, 226, 233, 237, 296, 349, 351, 351, 381, 422, 468, 478, 499, 523, 540, 570, 588, 597, 629, 687, 707, 714, 740, 742, 746, 755, 781, 812, 845, 897, 902, 927, 982, 999]
Distances for the 22 possible matrices = [2447, 2459, 2420, 2464, 2510, 2386, 2336, 2357, 2318, 2319, 2310, 2192, 2096, 2093, 2038, 1961, 1893, 1952, 2000, 2025, 2127, 2128]
List of indexes where min values are = [16]
Minimum value found = 1893
Matrix found = [422, 468, 478, 499, 523, 540, 570, 588, 597, 629, 687, 707, 714, 740, 742, 746, 755, 781, 812, 845]

Elements = [37, 45, 55, 78, 87, 110, 142, 157, 287, 294, 302, 309, 313, 333, 356, 379, 380, 406, 422, 456, 461, 466, 467, 475, 506, 551, 556, 575, 578, 610, 689, 717, 748, 757, 773, 935, 944, 954, 956, 994, 998]
Distances for the 22 possible matrices = [2106, 2126, 2105, 1921, 1866, 1745, 1679, 1574, 1402, 1411, 1492, 1687, 1766, 1876, 1882, 1906, 2322, 2433, 2603, 2658, 2655, 2871]
List of indexes where min values are = [8]
Minimum value found = 1402
Matrix found = [287, 294, 302, 309, 313, 333, 356, 379, 380, 406, 422, 456, 461, 466, 467, 475, 506, 551, 556, 575]

Elements = [25, 26, 28, 78, 80, 92, 93, 100, 115, 149, 170, 209, 222, 252, 269, 333, 344, 366, 371, 371, 384, 412, 437, 446, 469, 498, 547, 553, 557, 563, 597, 626, 642, 730, 756, 771, 771, 793, 798, 856, 937]
Distances for the 22 possible matrices = [1797, 1839, 1875, 1841, 1885, 1878, 1962, 2041, 2042, 1990, 1883, 1832, 1827, 1793, 1907, 1913, 2010, 2124, 2167, 2211, 2235, 2340]
List of indexes where min values are = [13]
Minimum value found = 1793
Matrix found = [252, 269, 333, 344, 366, 371, 371, 384, 412, 437, 446, 469, 498, 547, 553, 557, 563, 597, 626, 642]

Elements = [19, 82, 97, 108, 123, 162, 178, 207, 224, 243, 264, 290, 307, 333, 350, 364, 393, 419, 428, 459, 514, 582, 646, 679, 696, 698, 758, 761, 786, 815, 833, 853, 875, 875, 894, 902, 905, 923, 959, 961, 962]
Distances for the 22 possible matrices = [2000, 2002, 2147, 2337, 2475, 2547, 2582, 2693, 2733, 2740, 2754, 2695, 2754, 2778, 2745, 2722, 2547, 2446, 2307, 2138, 1952, 1706]
List of indexes where min values are = [21]
Minimum value found = 1706
Matrix found = [582, 646, 679, 696, 698, 758, 761, 786, 815, 833, 853, 875, 875, 894, 902, 905, 923, 959, 961, 962]

Elements = [190, 220, 240, 249, 259, 264, 349, 353, 365, 380, 392, 399, 410, 427, 437, 491, 501, 522, 564, 578, 621, 627, 639, 643, 657, 662, 668, 684, 712, 713, 714, 733, 782, 804, 840, 881, 909, 910, 911, 944, 990]
Distances for the 22 possible matrices = [1815, 1853, 1902, 1874, 1863, 1760, 1679, 1651, 1624, 1669, 1593, 1620, 1564, 1557, 1569, 1517, 1603, 1614, 1607, 1625, 1644, 1746]
List of indexes where min values are = [15]
Minimum value found = 1517
Matrix found = [491, 501, 522, 564, 578, 621, 627, 639, 643, 657, 662, 668, 684, 712, 713, 714, 733, 782, 804, 840]

Elements = [50, 64, 82, 114, 142, 173, 181, 183, 228, 237, 279, 340, 340, 356, 359, 379, 400, 415, 425, 427, 453, 532, 547, 587, 606, 619, 650, 671, 687, 707, 718, 739, 765, 803, 832, 837, 853, 861, 917, 923, 954]
Distances for the 22 possible matrices = [1878, 1844, 1993, 1953, 2070, 2068, 2060, 2179, 2086, 2107, 2029, 1906, 2036, 2050, 2157, 2214, 2162, 2214, 2144, 2176, 2107, 1971]
List of indexes where min values are = [1]
Minimum value found = 1844
Matrix found = [64, 82, 114, 142, 173, 181, 183, 228, 237, 279, 340, 340, 356, 359, 379, 400, 415, 425, 427, 453]

Elements = [48, 49, 75, 107, 108, 126, 132, 142, 142, 167, 170, 216, 220, 222, 246, 250, 253, 269, 374, 425, 464, 469, 484, 505, 539, 540, 602, 620, 641, 677, 719, 748, 751, 777, 817, 830, 893, 904, 932, 952, 997]
Distances for the 22 possible matrices = [1536, 1680, 1817, 1871, 1994, 2119, 2138, 2258, 2241, 2312, 2469, 2538, 2693, 2678, 2690, 2726, 2619, 2655, 2467, 2426, 2482, 2515]
List of indexes where min values are = [0]
Minimum value found = 1536
Matrix found = [48, 49, 75, 107, 108, 126, 132, 142, 142, 167, 170, 216, 220, 222, 246, 250, 253, 269, 374, 425]

Elements = [7, 39, 46, 62, 66, 85, 127, 151, 191, 205, 220, 221, 228, 234, 240, 303, 324, 329, 338, 352, 364, 366, 408, 408, 498, 559, 624, 624, 640, 654, 655, 740, 742, 757, 825, 862, 879, 908, 950, 956, 977]
Distances for the 22 possible matrices = [1674, 1670, 1647, 1628, 1586, 1608, 1753, 1928, 2066, 2162, 2256, 2317, 2449, 2484, 2413, 2521, 2605, 2822, 2942, 2952, 3004, 2875]
List of indexes where min values are = [4]
Minimum value found = 1586
Matrix found = [66, 85, 127, 151, 191, 205, 220, 221, 228, 234, 240, 303, 324, 329, 338, 352, 364, 366, 408, 408]

Elements = [17, 161, 185, 192, 211, 231, 291, 307, 319, 346, 348, 369, 391, 415, 447, 449, 473, 477, 491, 498, 518, 525, 529, 545, 589, 625, 632, 639, 645, 655, 680, 770, 795, 798, 802, 812, 836, 889, 892, 931, 931]
Distances for the 22 possible matrices = [2079, 1729, 1697, 1616, 1524, 1546, 1484, 1526, 1523, 1477, 1475, 1453, 1578, 1628, 1651, 1729, 1755, 1857, 1949, 1952, 1996, 1951]
List of indexes where min values are = [11]
Minimum value found = 1453
Matrix found = [369, 391, 415, 447, 449, 473, 477, 491, 498, 518, 525, 529, 545, 589, 625, 632, 639, 645, 655, 680]

Elements = [10, 23, 29, 50, 61, 71, 72, 82, 137, 147, 249, 262, 267, 295, 303, 340, 346, 366, 369, 415, 489, 500, 582, 659, 662, 667, 683, 705, 716, 731, 734, 776, 785, 803, 819, 841, 877, 883, 949, 951, 995]
Distances for the 22 possible matrices = [1919, 2197, 2292, 2465, 2756, 2761, 2948, 2870, 2774, 2725, 2492, 2541, 2496, 2491, 2541, 2478, 2465, 2384, 2276, 2224, 2041, 1986]
List of indexes where min values are = [0]
Minimum value found = 1919
Matrix found = [10, 23, 29, 50, 61, 71, 72, 82, 137, 147, 249, 262, 267, 295, 303, 340, 346, 366, 369, 415]

答案 2 :(得分:1)

不知道排序是否是最佳选择。但这当然是一个很好的起点。有了随机数据集,我会看到:

enter image description here

使用混合整数编程模型找到了第二个解决方案。它被证明是最佳的(但是我增加了值在行和列方向增加的约束)。

答案 3 :(得分:0)

以一种聪明的方式填充矩阵不是一个好的开始吗?

让我们说您有以下数字:1 2 4 6 7 8 9 13 17 您是否可以通过以下方式填充矩阵:从角落中的最小数字开始按以下方式填充矩阵:

i1 i2 i4
i3 i5 i7
i6 i8 i9

这将导致以下结果:

1   2   6
4   7   9
8   13  17

从这个开始的结果中,您可以尝试交换随机位置,看看邻居得到的每个数字的总和是否更低。如果结果变低,请重复此步骤,否则尝试其他交换。

我不知道这是否会很快达到本地最小退出速度,您还可以选择在评估结果是否降低之前进行多次交换。

编辑: 现在,我看到您有更多的数字而不是实际适合的矩阵。我认为这些都是唯一的。因此,选择平均差异最小的子集可能还会导致矩阵的邻居总和最小。

祝你好运