我遇到了以下问题:在网络中的多台计算机上分配负载。问题是面试问题。候选人应指定哪种算法以及哪种数据结构最适合此问题。
我们在网络中有N台机器。每台机器最多可承受5个单位的负载。请求的算法接收机器列表及其当前负载(范围为0-5),机器之间的距离矩阵以及我们要在网络上分发的新负载M作为输入。
该算法返回可以为M个负载单元提供服务且具有最小集体距离的机器列表。总距离是结果列表中机器之间距离的总和。
例如,如果结果列表包含三台机器A,B和C,这些机器可以共同服务M个负载单元(如果M = 5,A可以服务3,B可以服务1,C可以服务1)和距离之和SUM = AB + BC是可以集体服务M个负载单元的最小路径。
您对如何处理它有什么建议吗?
答案 0 :(得分:0)
我能想到的最简单的方法是为每台机器定义一个值,例如本机与所有相邻机器之间的反向距离总和:
v_i = sum(A / i中j的1 / dist(i,j))
(对不起,我无法在这里设置数学公式)
您可以再次反转求和,并将其称为机器的人群值(或类似的东西),但您不需要。
然后根据此值对机器进行排序(如果已反转求和值,则降序)。 从具有最小值(最大人群)的机器开始,并尽可能多地添加负载。然后转到下一台机器并执行相同操作,直到分配完所需的所有负载。
答案 1 :(得分:0)
听起来每台机器都能够处理相同的负载量 - 即5个单位。并且您所声明的成本度量仅取决于具有非零负载的机器集(即,向已经具有非零负载的机器添加更多负载将不会增加成本)。因此问题可以分解:
(1)是一个直截了当的Bin packing problem。虽然这个问题是NP难的,但是存在优秀的启发式算法,几乎所有的实例都可以在实践中快速解决到最优。
可能有线性代数方法可以更快地解决(2)(如果有人知道一个,可以随意编辑或在评论中提出建议),但是如果不太考虑它,你总是可以使用{{3} }。这可能需要n中的指数时间,但如果n足够低,或者如果你能得到一个能够限制大部分搜索空间的合适的启发式解决方案,那么它应该是正确的。
(我确实尝试过在我们计算f(i,j)的DP,这是从机器1,...,j中选择i机器的最低成本方式,但这遇到了问题,当我们尝试将第j台机器添加到f(i - 1,j - 1),从新机器到所有现有机器的边缘总成本取决于f(i - 1,j - 1的解决方案中的确切机器),而不仅仅是这个解决方案的成本,从而违反了最优的子结构。)