算法导论 — 思考题15-11 库存规划

库存规划)Rinky Dink公司是一家制造溜冰场冰面修整设备的公司。这种设备每个月的需求量都在变化,因此公司希望设计一种策略来规划生产,需求是给定的,即它虽然是波动的,但是是可预测的。公司希望设计接下来 n n 个月的生产计划。对第 i i 个月,公司知道需求 d i d_i ,即该月能够销售出去的设备的数量。令 D = i = 1 n d i D = \sum_{i=1}^nd_i 为后 n n 个月的总需求。公司雇佣的全职员工,可以提供一个月制造 m m 台设备的劳动力。如果公司希望一个月内制造多于 m m 台设备,可以雇佣额外的兼职劳动力,雇佣成本为每制造一台机器付出 c c 美元。而且,如果在月末有设备尚未售出,公司还要付出库存成本。保存 j j 台设备的成本可描述为一个函数 h ( j ) j = 1 , 2 , , D h(j),j = 1, 2, …, D 。其中对所有 1 j D 1 ≤ j ≤ D ,满足 h ( j ) 0 h(j) ≥ 0 ;对 1 j D 1 1 ≤ j ≤ D-1 ,满足 h ( j ) h ( j + 1 ) h(j) ≤ h(j+1)
  设计库存规划算法,在满足所有需求的前提下最小化成本。算法运行时间应为 n n D D 的多项式函数。
  
  
  根据题意,有以下2点基本要求:
  1) 要满足 n n 个月的总需求,那么 n n 个月总共要生产 D D 台设备;
  2) 要满足前 i i 个月 ( 1 i < n ) (1 ≤ i < n) 的需求,那么前 i i 个月生产的设备数量不能少于前 i i 个月的需求之和。
  用 c o s t [ i , j ] cost[i, j] 表示前 i i 个月在总共生产 j j 台设备的前提下的最小成本。如果不考虑每个月的需求,理论上 j j 的取值范围可以是 0 0 ~ D D 。而 i i 的取值范围是 1 1 ~ n n 。由此可见,我们要求解的子问题的规模为 O ( n D ) O(nD) 。我们最终要求解的是 c o s t [ n , D ] cost[n, D] 。下面我们来建立 c o s t [ i , j ] cost[i, j] 的递归式。
  我们用 D i D_i 表示前 i i 个月的总需求,即 D = l = 1 i d l D = \sum_{l=1}^id_l 。显然有 D n = D D_n = D 。假设第 i i 个月选择生产 k k 台设备,这意味着前 i 1 i-1 个月要生产 j k j-k 台设备。第 i i 个月的库存数量为 j D i j-D_i ,相应的当月库存成本为 h ( j D i ) h(j-D_i) 。题目中没有给出 h ( 0 ) h(0) 的值,这里我们令 h ( 0 ) = 0 h(0) = 0 ,即在没有库存的情况下库存成本为 0 0 。用 c o s t k [ i , j ] cost_k[i, j] 表示第 i i 个月生产 k k 台设备的情况下,前 i i 个月总共生产 j j 台设备的最小成本。 c o s t k [ i , j ] cost_k[i, j] 可按下式计算得到。
  在这里插入图片描述
  根据上文第2)点要求,有 j D i j ≥ D_i 并且 j k D i 1 j-k ≥ D_{i-1} 。所以 j j 的取值范围是 D i D_i ~ D n D_n k k 的取值范围为 0 0 ~ ( j D i 1 ) (j-D_{i-1}) 。我们遍历 k k 的取值范围,选择 c o s t k [ i , j ] cost_k[i, j] 的最小值。
  我们还需要特别考虑一下初始情况 i = 1 i = 1 。由于是第1个月,所以该月只能生产 j j 台设备。此时 c o s t [ 1 , j ] cost[1, j] 可按下式计算得到。
  在这里插入图片描述
  根据以上分析,可以得到以下递归式。
  在这里插入图片描述
  在求解 c o s t [ i , j ] cost[i, j] 的过程中,用 p [ i , j ] p[i, j] 记录下第 i i 个月选择生产的设备数量。
  在这里插入图片描述
  前文提到,我们一共要求解 O ( n D ) O(nD) 个子问题。求解每个子问题需要迭代 O ( D ) O(D) 次。故该算法的运行时间为 O ( n D 2 ) O(nD^2)

猜你喜欢

转载自blog.csdn.net/yangtzhou/article/details/84405508