汽油泵的建立算法

时间:2012-08-25 15:25:19

标签: algorithm graph-theory

给出了一个地点,用矩阵表示,每个条目表示该地区的汽车数量。我们的任务是将一个汽油泵放在矩阵的一个入口处,这样我们选择的块就可以降低旅行成本。

我找到了一个解决方案,花费O(n^4)时间来计算每个条目的整个过程。

你能告诉我这个问题的其他任何好方法吗?

2 个答案:

答案 0 :(得分:4)

如果我已正确理解你的问题,那么你的成本函数正如Haile在他/她的评论中描述的那样,有一个简单的解决方案,因为你可以减少到一维问题。

请注意,在曼哈顿指标中,汽车必须经过的列中的距离只是与行中的距离相加,因此我们可以单独将它们最小化。

因此我们将问题缩小到一个维度。为了弄清楚发生了什么,我不得不把它改成一个连续的问题。所以假设我有一个密度函数p(x),(假设它是连续的紧凑支持,所以数学有效)。然后成本函数由

给出

\int p(x) |x-x0|

将这个分成两半以摆脱mod符号并区分(这是你需要假设p(x)表现良好的地方),你得到

\int_-\infty^x_0 p(x) - \int_{x_0}^\infty p(x)

现在,x0的最佳位置将是使该导数为零的位置。但请注意,这是分布的中位数。

对于离散设置,这是原始问题,相同的参数有效。基本上你可以采用离散导数,即E(k + 1)-E(k)。如果你为位置n的汽车数量写了[n],那么成本函数就会分解为

E(k) = \sum_{n<k} a_n(k-n) + \sum_{n>k} a_n(n-k)

假设我没有犯下一个愚蠢的错误,那么离散导数就是

E(k+1)-E(k) = \sum_{n<k+1} a_n - \sum_{n>k+1} a_n

所以解决方案将再次处于中位数(如果最终为半整数,则以任一方式舍入)。要知道为什么这是真的,请注意,如果k是一个较大的负数,则此导数肯定是负数(因此将k增加1将降低成本)。现在,随着k增加,导数缓慢增加。在某些时候,它将首次成为积极的。一旦k + 1大于中值,就会发生这种情况。之后,它将保持正值,因此选择正确的k是小于或等于中位数的最大k。

原始问题是二维的,所以你需要运行两次,每个轴运行一次。

答案 1 :(得分:4)

我将用一个实际的例子来扩展鲁珀特的答案(即如何计算他称之为中间行和列的内容)。

正如他所说,您可以分别找到泵的最佳行和最佳列。怎么样?

让我们考虑以下问题的实例:

3 2 7
1 8 9 
7 2 2
  • 首先,我们找到泵的最佳行

我们开始添加矩阵的所有行

3 2 7 -> 12
1 8 9 -> 18
7 2 2 -> 11

现在如果我们将泵放在第一行,总垂直成本

11*2 + 18*1 + 12*0 = 30
由于第3排的11辆汽车必须行驶2个垂直单元,因此第2排的18辆汽车必须行驶1个垂直单元,第1排的汽车不必垂直行驶。我们必须计算所有行的总垂直旅行成本。

pump in 1st row -> cost 30 = 11*2 + 18*1 + 12*0
pump in 2nd row -> cost 23 = 11*1 + 18*0 + 12*1
pump in 3rd row -> cost 42 = 11*0 + 18*1 + 12*2

所以泵的最佳行是第二行

我们在O(n ^ 2)中计算了这个,因为我们在 n 行中对所有 n 汽车求和时得到了O(n ^ 2)和,当我们计算泵的每个可能行的总垂直成本时,我们做了O(n ^ 2)和和乘法。

  • 现在我们找到了泵的最佳色谱柱

我们总结每列中的汽车:

3  2  7
1  8  9 
7  2  2
_______
11 12 18

现在:

pump in 1st col -> cost 48 = 11*0 + 12*1 + 18*2
pump in 2nd col -> cost 29 = 11*1 + 12*0 + 18*1
pump in 3rd col -> cost 34 = 11*2 + 12*1 + 18*0

所以泵的最佳色谱柱是第二个

在O(n ^ 2)步骤中,我们发现必须将泵置于[2] [2] 中。