本文主要从问题分析的角度介绍动态规划和贪心算法,文中不涉及代码。通过装配线调度问题和最小生成树问题,说明怎样运用动态规划和贪心算法解决问题。
1 装配线调度问题
1.1 问题描述
如下图所示,某个工厂有两条装配线,每条装配线上有n个装配站,装配站S_{i,j}表示第i条装配线上的第j个装配站,其中i=1,2,j=1,2,…,n。装配站S_{1,j}与装配站S_{2,j}具有相同的作用,其中a_{i,j}表示装配站S_{i,j}完成装配所需要的时间,在同一条装配线上,商品从上一个装配站转移到下一个装配站不需要时间,但是如果商品从一条装配线换到另一条装配线上则需要时间t,如图所示。一件商品从开始端进入装配线的时间分别是e_1,e_2。然后必须依次经过没个装配站进行装配,然后在结束端离开装配线的时间分别是x_1,x_2。带求解问题是应该确定在装配线1内选择哪些站,在装配线2内选择哪些站,才能使商品通过工厂的时间最小。
1.2 问题分析
首先,这是一个做选择类的问题,而对于做选择的所有问题我们都可以从穷举的角度去分析问题。我们最终要选择一个装配路线,使得商品的装配时间最少,而在每一个装配站都有两个选择(装配线1,还是装配线2)。所以要穷举所有的装配路线,一共有2^n种选择,那么算法的运行时间复杂度是O(2^n),当n很大时显然是不可取的。
现在,从动态规划的角度去分析这个问题。关于动态规划,要记住一点,就是动态规划是以空间换时间的。接下来我们就需要好好理解这个话。首先要明确该问题中的目标值是什么。从问题中知道,该问题是选择装配路线,使得商品的装配时间最少。所以,很明显目标位装配的时间T。T(1,i)表示经过装配线1上第i个装配站后的装配时间,T(2,i)表示经过装配线2上第i个装配站的装配时间。所以可以得到如下的递归公式。