动态规划例题

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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值