算法导论 之 动态规划 - 装配线调度问题[C语言]

 

 

 

 

1 问题描述

    现有两条装配线,Sij表示第i条上完成第j道工序的装配站。汽车完成组装需要依次完成1~n工序。请找出完成装配并离开装配线的最快路线。
    符号说明:
        ①、ei:汽车进入装配线i的时间,i=1,2
        ②、xi:汽车离开装配线i的时间
        ③、aij:在装配站Sij完成装配需要的时间
        ④、tij:在装配站Sij完成后离开第i条装配线,进入另一条装配线需要的转移时间
    注意,如果完成工序后,下一个工序还在同一条装配线上,则不需要转移时间。

图1 装配线调度

 

2 问题分析

    我们用Fij表示在第i条装配线上完成第j道工序的最快时间,用F表示完成汽车装配并离开装配线的时间。如果知道F1n和F2n,则有
图2 最小装配时间

 
而要求出F1n和F2n,又需要知道F1n-1和F2n-1,从而有:
图3 展开公式
 
依次类推,可得如下递归公式:
 
 
图4 递归公式

 

 

 

3 问题求解

3.1 递归求解

    递归求解的过程,可是使用如下的树形结构来表示:

图5 树形表示

    每个节点里的符号,表示相应的问题,其孩子节点表示在求解该问题时需要求解的子问题。由此我们很容易得出,对于问题Fij,采用递归算法计算时,需要求解的次数为2^(n-j)。

3.2 动态规划

    如果反过来,采用自下而上的方式来求解,把求解结果保存起来,后续的计算都依赖之前计算保存的结果,则可有效的减少重复计算,从而极大的提高求解效率。

    我们再回头看看问题描述,并自下而上的方式来分析其处理过程:

     第1行1列的最短耗时:ms[1][1] = e[1] + a[1][1]

     第2行1列的最短耗时:ms[2][1] = e[2] + a[2][1]

 

     第1行2列的最短耗时:ms[1][2] = min{ms[1][1], ms[2][1]+t[2][1]} + a[1][2],并记录min{ms[1][1], ms[2][1]+t[2][1]}中更小值的行号

     第2行2列的最短耗时:ms[2][2] = min{ms[1][1]+t[1][1], ms[2][1]} + a[2][1],并记录min{ms[1][1]+t[1][1], ms[2][1]}中更小值的行号

 

     第1行3列的最短耗时:ms[1][3] = min{ms[1][2], ms[2][2]+t[2][2]} + a[1][3],并记录min{ms[1][2], ms[2][2]+t[2][2]}中更小值的行号

 

     第2行3列的最短耗时:ms[2][3] = min{ms[1][2]+t[1][2], ms[2][2]} + a[2][3],并记录min{ms[1][2]+t[1][2], ms[2][2]}中更小值的行号

 

         ....

 


     第1行n列的最短耗时:ms[1][n] = min{ms[1][n-1], ms[2][n-1]+t[2][n-1]} + a[1][n],并记录min{ms[1][n-1], ms[2][n-1]+t[2][n-1]}中更小值的行号

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值