我有一个实数矩阵,我想找到这个矩阵的一个分区,这样零件的数量和每个部分中数字的方差都被最小化了。直观地说,我想尽可能少的部分,但我也希望任何给定部分中的所有数字都在一起。
更正式地说,我认为对于后者,我会为每个部分找到该部分中数字的方差,然后在所有部分中取这些方差的平均值。这将是给定解决方案的“得分”的一部分,得分的另一部分将是,例如,矩阵中的元素总数减去分区中的部分数量,因此将导致更少的部分这部分得分更高。解决方案的最终得分是两部分的加权平均值,最佳解决方案是得分最高的那个。
显然很多都是启发式的:我需要决定如何平衡零件数量与方差。但是我甚至对这个问题的一般方法感到困惑。
例如,给出以下简单矩阵:
10, 11, 12, 20, 21
8, 13, 9, 22, 23
25, 23, 24, 26, 27
分区到以下子矩阵是合理的解决方案:
10, 11, 12 | 20, 21
8, 13, 9 | 22, 23
--------------+----------
25, 23, 24 | 26, 27
只有垂直和水平切片才能进行分区。
请注意,我不需要 最佳解决方案,我只需要一种方法来获得“好”的解决方案。此外,这些矩阵是几百到几百,所以粗暴强迫它可能不是一个合理的解决方案,除非有人可以提出一个削减搜索空间的好方法。
答案 0 :(得分:0)
我认为从一个更简单的问题开始你会更好。我们称之为
我建议对问题A使用动态编程公式。
一旦掌握了这一点,就可以处理
显然,您可以通过将每个元素放入其自己的块中来将方差减小为0。通常,问题B要求您为每个选择的垂直和水平分区计数解决问题A.
要对问题B使用动态编程方法,您必须制定一个目标函数来封装您寻求的权衡。我不确定这是多么可行,所以我建议寻找不同的方法。
目前,问题B是2D问题。您可能会发现在2D聚类算法方面取得了一些成功。如果可以将其重新表述为一维问题,则可以选择另一种方法:使用块数(而不是垂直和水平分区计数)来权衡变化。然后你可以使用像Jenks natural breaks classification method这样的东西来决定画线的位置。
无论如何,这个答案显然没有给你一个有效的算法。但我希望它至少提供一种方法(这就是你要求的全部内容:)。)。