看到《数学建模算法与应用(第二版)》第四章动态规划,发现书上例题都没源码,鉴于本人matlab太菜,而且matlab一个函数一个.m文件的尿性,我决定试试用python解决例题6,附上题目
例 6 设某工厂有 1000 台机器,生产两种产品 A、 B ,若投入 x 台机器生产 A 产品,则纯收入为5x ,若投入 y 台机器生产 B 种产品,则纯收入为 4y ,又知:生产 A 种产品机器的年折损率为 20%,生产 B 产品机器的年折损率为 10%,问在 5 年内如何安排各年度的生产计划,才能使总收入最高?
书上手推算的过程如下:
然后我以为半个小时能搞定的python代码我花了一晚上,附上源代码
# xk 第k年初完好机器数
# uk 第k年安排生产A种产品的机器数
# xk-uk 第k年安排生产B种产品的机器数
# 第k+1年初完好的机器数
def x_k_Add_1(uk, xk):
return (1 - 0.2) * uk + (1 - 0.1) * (xk - uk)
# vk(xk,uk) 第k年的纯收入
def vk(uk, xk):
return uk + 4 * xk
# fk(xk)第k年初往后各年的最大利润之和
# 返回 以后最大值(xk倍数)
def fk(k_Add_1_xk, k):
if k == 6:
k_Add_1_xk = 0
par_u = 1
par_x = 4
else:
par_u = 1 - k_Add_1_xk * 0.1
par_x = 4 + k_Add_1_xk * 0.9
max, uk = MAX(par_u, par_x)
return max, uk
# 寻找在第k年,总台数xk约束下的最大值
# 返回:最大值(xk倍数),uk
def MAX(par_u, par_x):
if par_u >= 0:
return par_u + par_x, 1
else:
return par_x, 0
if __name__ == '__main__':
k_Add_1_xk = 0
max = 0
uk = []
for i in range(6, 0, -1):
k_Add_1_xk, u_k = fk(k_Add_1_xk, i)
uk.append(u_k)
uk.reverse()
max = k_Add_1_xk
print("最大利润为:%.1f" % (max * 1000))
x = 1000
x_last = 0
for i in range(1, 6):
if i == 1:
print("第" + str(i) + "年完好的机器数 %.1f" % x)
x_last = x
continue
x = 0.9 * x - 0.1 * uk[i - 1] * x_last
x_last = x
print("第" + str(i) + "年完好的机器数 %.1f" % x)
运行结果如下:
最大利润为:19733.8
第1年完好的机器数 1000.0
第2年完好的机器数 900.0
第3年完好的机器数 810.0
第4年完好的机器数 648.0
第5年完好的机器数 518.4
ps.算法课动态规划没有实践的坑,现在终于算是填上了。。。出来混,迟早是要还的。。。。。。