算法课 实验6

参考文献


实验问题描述

一个汽车公司在有2条装配线的工厂内生产汽车,每条装配线有n个装配站,不同装配线上对应的装配站执行的功能相同,但是每个站执行的时间是不同的。在装配汽车时,为了提高速度,可以在这两天装配线上的装配站中做出选择,即可以将部分完成的汽车在任何装配站上从一条装配线移到另一条装配线上。装配过程如下图所示:


装配线问题

我们对这张图来分析一下



装配过程的时间包括:进入装配线时间e、每装配线上各个装配站执行时间a、从一条装配线移到另外一条装配线的时间t、离开最后一个装配站时间x。举个例子来说明,现在有2条装配线,每条装配线上有6个装配站,各个时间如下图所示:


实验解题步骤

(1)描述通过工厂的最快结构
  • 如果我们需要找到经过S(i, j)的最短路径其实我们需要先知道S(1, j-1)和S(2, j-1)的最优解(一个问题的最优解包含了最优子结构的一个最优解)
    • 通过装配线S1,j-1的最快线路,然后直接通过装配站Si,j
    • 通过装配站S2,j-1的最快线路,从装配线2移动到装配线1,然后通过装配线S1,j。
(2)一个递归的解
  • 最终目标是确定工件通过工厂的所有路径的最快时间,所以我们假设这个变量是f*,令fi[j]表示的是工件从起点到达S(i,j)的最快的时间。及f* = min(f1[n]+x1,f2[n]+x2)
    j = 1时:f1[1] = e1+a1[1],f2[1] = e2+a2[1] //包括经过当前节点的时间
    j > 1是:f1[j] = min(f1[j-1]+a1[j],f2[j-1]+t2[j-1]+a1[j]),f2[j] = min(f2[j-1]+a2[j],f1[j-1]+t1[j-1]+a2[j]) //包括经过当前节点的时间
(3)计算最快时间

用C语言来实现这个算法

//核心代码在这个地方
//由于编程语言是从0开始计数的
void fastest_way (int aNode[][N], int tNode[][N-1], fastWay[][N-1], int eNode[][], ){
  int i, j;
  fastWay[0][0] = e[0] + a[0][0];
  f[1][0] = e[1] + a[0][1];
  l[0][0] = 1;
  l[1][0] = 2;
  if (fastWay[0][j-1] < fastWay[1][j-1] + tNode[1][j-1]) {
    fastWay[0][j] = fastWay[0][j-1] + aNode[0][j];
    l[0][j] = 1;
  }
  else {
    fastWay[0][j] = fastWay[1][j-1] + tNode[1][j-1]+ aNode[0][j];
    l[0][j] = 2
  }
  //上面一段可以写成 fastWay[0][j] = Math.min(fastWay[0][j-1], fastWay[1][j-1] + tNode[1][j-1]) + aNode[0][j]
  if(fastWay[1][j-1] < fastWay[0][j-1] + tNode[0][j-1])
     {
         fastWay[1][j] = fastWay[1][j-1] + aNode[1][j];
         l[1][j] = 2;
     }
    else
     {
         fastWay[1][j] = fastWay[0][j-1] + tNode[0][j-1] + aNode[1][j];
         l[1][j] = 1;
     }
    //这一段也可以写成 fastWay[1][j] = Math.min(fastWay[0][j-1] + tNode[0][j-1], fastWay[1][j-1]) + aNode[1][j],同时通过?:三元符号可以对l指针对象进行赋值
//最终条件,临界条件
if(fastWay[0][n-1] + xNode[0] < fastWay[1][n-1] + xNode[1])
     {
         last_f = fastWay[0][n-1] + xNode[0];
         last_l = 1;
     }
     else
     {
         last_f = fastWay[1][n-1] + xNode[1];
         last_l = 2;
     }
//这样写更加好 Go\Python last_f, last_l = (fastWay[0][n-1] + xNode[0] < fastWay[1][n-1] + xNode[1]) ? (fastWay[0][n - 1] + xNode[0], 1):(fastWay[1][n-1]+xNode[1], 2)
 
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言前言 随着科学技术的飞速发展和科学技术的日新月异,产品更新换代的速度也越来越快,复杂零件的个数也越来越多,产...
    穆山阅读 5,916评论 0 10
  • 摘要:说到BP(Back Propagation)算法,人们通常强调的是反向传播,其实它是一个双向算法:正向传播输...
    暖夏未眠丶阅读 5,279评论 0 5
  • 成长路上的艰难险阻数不胜数,但是,哪些才是决定性因素,归根结底是人的信仰。 我的一位老师,数十年坚持研究儿童的教育...
    修彦红阅读 3,933评论 0 1
  • 今天是母亲节,虽然是西方人的节日但作为体现子女孝顺又何不拿来主义一把。离母亲近的可回家一次,分开两地可打电话问候一...
    艾冰台阅读 1,839评论 0 2