C++ 最小化距离和:最优化问题

C++ 最小化距离和:最优化问题,c++,algorithm,optimization,dynamic,C++,Algorithm,Optimization,Dynamic,实际问题是这样的: 麦当劳正计划在一条笔直的公路上开设多个营业点(比如n)。这些关节需要仓库来储存食物。仓库可以为任何数量的关节储存食物,但只能位于其中一个关节。McD拥有有限数量的可用仓库(比如k),并希望将其放置在距离最近仓库的接头平均距离最小化的位置 给定关节坐标数组(n个元素)和整数“k”,返回给出仓库最佳位置坐标的“k”元素数组 对不起,我没有任何可用的例子,因为我是从记忆中写下来的。无论如何,一个样本可以是: 数组={1,3,4,5,7,7,8,10,11}(n=9) k=1 答案:

实际问题是这样的:

麦当劳正计划在一条笔直的公路上开设多个营业点(比如n)。这些关节需要仓库来储存食物。仓库可以为任何数量的关节储存食物,但只能位于其中一个关节。McD拥有有限数量的可用仓库(比如k),并希望将其放置在距离最近仓库的接头平均距离最小化的位置

给定关节坐标数组(n个元素)和整数“k”,返回给出仓库最佳位置坐标的“k”元素数组

对不起,我没有任何可用的例子,因为我是从记忆中写下来的。无论如何,一个样本可以是:

数组={1,3,4,5,7,7,8,10,11}(n=9)
k=1

答案:{7}

这就是我一直在想的:对于k=1,我们可以简单地找出集合的中位数,这将给出仓库的最佳位置。然而,对于k>1,给定的集合应划分为“k”子集(不相交的,以及超集的连续元素),每个子集的中值将给出仓库位置。然而,我不明白“k”子集是在什么基础上形成的。提前谢谢


编辑:这个问题还有一个变化:不是求和/平均值,而是最小化接头与其最近仓库之间的最大距离。我也不明白这一点。

这不是群集问题,而是设施位置问题的特例。您可以使用一个通用的整数/线性规划包来解决这个问题,但是因为问题是在线的,所以可能会有更高效(并且在软件方面更便宜)的算法。您可能会考虑动态编程,因为很可能组合的设施可以很快地被淘汰。有关更多信息,请查看

直线公路使这成为动态规划中的一个练习,沿公路从左到右进行。部分解决方案可以通过最右边仓库的位置和放置的仓库数量来描述。部分解决方案的成本将是到最近仓库的总距离(对于固定k最小化,这与最小化平均值相同)或到最近仓库的最大距离


在每个阶段,您都已计算出最左侧N个接头的答案,并根据使用的仓库数量和最右侧仓库的位置对其进行索引-您只需要节省最佳成本。现在考虑下一个关节,并为N + 1关节和所有可能的值K和最右边的仓库解决问题的最佳解决方案,使用您存储的N个关节的答案来加快这一速度。一旦您制定出涵盖所有接头的最佳成本解决方案,您就知道其最右边的仓库在哪里,这将为您提供一个仓库的位置。返回到将该仓库作为最右侧连接的解决方案,并找出该解决方案的基础。这将为您提供一个最右边的仓库,这样您就可以返回到所有仓库的位置,以获得最佳解决方案


我倾向于把解决这个问题的成本弄错,但是要放置N个接头和k个仓库,你需要采取N个步骤,每个步骤都只考虑Nk以前的解决方案,所以我认为成本是kN^2。

这是家庭作业吗?如果是这样的话,请给它贴上这样的标签。这是在一场比赛中发生的。@ArpitTarang我遇到了同样的问题。你能解决它吗?我没有从p-中值问题文章中得到太多。。其中大多数都有一个额外的参数“运输成本”,这使得问题更加复杂。请帮忙。我发现是“设施位置问题”。但是,他们仍然有复杂的二维问题算法。。。我的只有1d。帮忙?没关系。你仍然有距离,它们只是一维的。“现在考虑下一个关节,找出N + 1关节的最佳解决方案和K和最右边的仓库的所有可能值,使用N个关节所存储的答案来加快速度。”关于如何做到这一点的提示?基本思想是,给定点的最佳答案可以描述为“在这一点上放置一个仓库,然后使用左边第4点的答案来说明将其他仓库放置在何处”——但通常有一些细节需要担心,这些细节因问题而异。如果您不熟悉动态编程,请查看前两个示例-或搜索其他教程。