有一个淘宝商户,在某城市有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就是该数列中间的那个数,或者是中间的那两个数之一,而这个数就是中位数。
结论:数列的中位数就是该数列各个数与其绝对差之和最小的数。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。