动态规划dynamical programming,简称dp。了解它请参考《数学之美》第12章和《算法导论》第2版第15章,这里就不重复了。
《算法导论》第15章的“装配线调度”问题是非常好的dp学习算法,用数学语言包装之后有点难懂,我用python写了个简化版,只需要看图15-2,再看下面的代码,就知道dp是怎么回事了。
-----------------------------------------------------
#!/usr/bin/env python
#!-*- coding:utf-8 -*-
#底盘进入装配线需要的时间
e1 = 2
e2 = 4
#底盘离开装配线需要的时间
s1 = 3
s2 = 2
#底盘在装配线上每个装配站的处理时间
a1 = [7, 9, 3, 4, 8, 4]
a2 = [8, 5, 6, 4, 5, 7]
#底盘在装配件之间移动时需要的时间。
t1 = [2, 3, 1, 3, 4]
t2 = [2, 1, 2, 2, 1]
#初始化f1和f2,也就是用进入装配线时间和第一个装配站用时之和
f1 = [e1 + a1[0]
f2 = [e2 + a2[0]
#这一块,就是用dp的方式,分别计算两条装配线的最短时间装配时间
i = 1
l1 = []
l2 = []
while i < 6:
if (f1[i-1] + a1[i] < f2[i-1]+a1[i]+t2[i-1]):
f1.append(f1[i-1] + a1[i])
l1.append(1)
《算法导论》第15章的“装配线调度”问题是非常好的dp学习算法,用数学语言包装之后有点难懂,我用python写了个简化版,只需要看图15-2,再看下面的代码,就知道dp是怎么回事了。
-----------------------------------------------------
#!/usr/bin/env python
#!-*- coding:utf-8 -*-
#底盘进入装配线需要的时间
e1 = 2
e2 = 4
#底盘离开装配线需要的时间
s1 = 3
s2 = 2
#底盘在装配线上每个装配站的处理时间
a1 = [7, 9, 3, 4, 8, 4]
a2 = [8, 5, 6, 4, 5, 7]
#底盘在装配件之间移动时需要的时间。
t1 = [2, 3, 1, 3, 4]
t2 = [2, 1, 2, 2, 1]
#初始化f1和f2,也就是用进入装配线时间和第一个装配站用时之和
f1 = [e1 + a1[0]
f2 = [e2 + a2[0]
#这一块,就是用dp的方式,分别计算两条装配线的最短时间装配时间
i = 1
l1 = []
l2 = []
while i < 6:
if (f1[i-1] + a1[i] < f2[i-1]+a1[i]+t2[i-1]):
f1.append(f1[i-1] + a1[i])
l1.append(1)