看到《数学建模算法与应用(第二版)》第四章动态规划,发现书上例题都没源码,鉴于本人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.算法课动态规划没有实践的坑,现在终于算是填上了。。。出来混,迟早是要还的。。。。。。