有一个淘宝商户,在某城市有n个仓库,每个仓库的储货量不同,现在要通过货物运输,将每次仓库的储货量变成一致的,n个仓库之间的运输线路围城一个圈,即1->2->3->4->...->n->1->...,货物只能通过连接的仓库运输,设计最小的运送成本(运货量*路程)达到淘宝商户的要求,并写出代码。

网上的解答多如牛毛, 也乱七八糟, 这里是比较好的一个

列方程, 将所有的cost用一个变量表示。

av表示平均下来每个仓库的容量。 ki表示仓库i向仓库i+1输送多少(可以为负),列出方程组
wi表示仓库i的存储量

    av=w1+kn-k1
    av=w2+k1-k2
    av=w3+k2-k3
       ...
    av=wn+ kn-1 + kn

将所有k都用kn表示, 有

    k1=kn+ w1 -  av
    k2=kn+ w1+w2 - 2*av
    k3=kn+ w1+w2+w3 - 3*av
        ...
    kn = kn //这里就不必也不能推出别的式子了

令 sum(i) = -(w1+w2+...+wi-i*av) (写成这样方便)

目标函数:

{ |kn-sum(1)|+|kn-sum(2)|+...+|kn-sum(n-1)| + |Kn| }

最小一乘, 中位数 sum(0)~sum(n-1)的中位数。

关于中位数的理论:
最小一乘和最小二乘
Modes, Medians and Means: A Unifying Perspective

类似问题

邮局选址问题

(摘自)
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。

街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。

居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。

因为任意2 点(x1,y1)和(x2,y2)之间的距离是用数值|x1-x2|+|y1-y2|度量的,那么n个点P1----Pn到邮局地点P(x,y)的距离之和可以表示为: |x1-x|+ |x2-x|+……+|xn-x| + |y1-y|+ |y2-y|+……+|yn-y| 。
这样一来,问题转变为分别求x轴和y轴上的一个点,使得该轴上的其他点坐标与该点坐标的差的绝对值之和最小。
于是问题就变为求解中位数。因为给定一个数列,中位数有这样的性质 :所有数与中位数的绝对差之和最小。
下面给出简略证明(因为如果证明中位数的性质正确,则该题就可以用求解中位数来解题):

首先,给定一个从小到大的数列x1,x2,……,xn,设x是从x1到xn与其绝对差之和最小的数,则显然x位于x1与xn之间。那么,由于x1,xn与它们之间的任意一点的距离之和都相等,且都等于xn-x1,因此接下来可以不考虑x1与xn,而考虑剩下的从x2到x[n-1]的数,同样显然有x必然位于x2和x[n-1]之间,依次类推,最后得出的结论是x就是该数列中间的那个数,或者是中间的那两个数之一,而这个数就是中位数。

  结论:数列的中位数就是该数列各个数与其绝对差之和最小的数。

RioDream
126 声望14 粉丝