实际问题是这样的:
麦当劳计划在一条直道上打开一些关节(比方说n)。这些接头需要仓库来存放食物。仓库可以存储任意数量的关节的食物,但必须仅位于其中一个关节。 McD拥有数量有限的仓库(比如k),并希望将它们放置在最小化距离最近仓库的平均距离的位置。给定关节坐标的数组(n个元素)和整数'k',返回一个'k'元素数组,给出仓库最佳定位的坐标。
对不起,我没有任何可用的例子,因为我是从记忆中写下来的。无论如何,一个样本可能是:
array = {1,3,4,5,7,7,8,10,11}(n = 9)
K = 1
这就是我一直在想的:对于k = 1,我们可以简单地找出集合的中位数,这将给出仓库的最佳位置。然而,对于k> 1,给定集合应该被分成'k'子集(不相交,以及超集的连续元素),并且每个子集的中值将给出仓库位置。但是,我不明白应该在什么基础上形成'k'子集。提前谢谢。
编辑:这个问题也存在变化:取代sum / avg,最小化关节与其最近仓库之间的最大距离。我也没有得到这个......
答案 0 :(得分:1)
这不是集群问题,而是设施位置问题的特例。您可以使用通用整数/线性编程包来解决它,但由于问题是在一条线上,可能会有更高效(并且更便宜的软件)算法。您可能会考虑动态编程,因为可能很快就会消除这些设施的组合。查看P-Median problem了解更多信息。
答案 1 :(得分:0)
直线高速公路使这成为动态编程的练习,沿着高速公路从左到右工作。部分解决方案可以通过最右边仓库的位置和放置的仓库数量来描述。部分解决方案的成本将是到最近仓库的总距离(对于固定k,最小化这与最小化平均值相同)或到目前为止最近仓库的最大距离。
在每个阶段,您已经计算出最左边N个关节的答案,并根据使用的仓库数量和最右边仓库的位置编制索引 - 您只需要保存最佳成本。现在考虑下一个关节并找出N + 1关节的最佳解决方案以及k和最右边仓库的所有可能值,使用您为N个关节存储的答案来加快速度。一旦您找到了涵盖所有关节的最佳成本解决方案,您就知道最右边的仓库所在的位置,从而为您提供一个仓库的位置。回到那个仓库作为最右边的关节的解决方案,找出基于什么解决方案。这为您提供了一个最右边的仓库 - 因此您可以回到所有仓库的位置,以获得最佳解决方案。
我倾向于把这个错误的成本付出来,但是有N个接头和k个仓库,你需要N个步骤,每个基于考虑不超过Nk以前的解决方案,所以我认为成本是kN ^ 2