装配线问题

装配线问题:

韩鸡鸡一直强调的装配线问题其实很简单,也算是动态规划里面比较简单的问题了。

在上面的图中,我们可以看到也就是一个车间有两条装配线,每一个相对位置的功能是相同的。。如图中a11和a21,它们的功能是相同的,

都是装配一个零件,但是它们所需的时间却不相同。而且不同装配线间的移动是要花时间的。但是在同一条装配线上移动是不需要花时间的

,当然了,我们只能从左往右依次装配零件。那么问题来了,怎么样选择装配路线使得时间最少?当然每件装配线都有它的进入时间和移出

时间,这个就不多说了。

那么对于这个问题的解,我们还是可以采用典型的动态规划的问题解法,装原问题划分为子问题,找到原问题与子问题的关系,然后子问题

再划分为子问题了。

那么对于这个问题,原问题是我们在离开装配线1和2时,所花时间最少。当然我们可以有多种离开的方法,从装配线1离开或者2离开,我们

暂且不考虑离开的时间x1和x2.

假设是从装配线1离开,离开最后的点a1n ?所花的时间为Sn,?它花的时间假设是最少的,于是那么这个问题的子问题是会么呢?

那么Sn和Sn-1?有何联系呢,对于Sn的到达,其实有两条中径可以选第一条呢,就是通过a?1n-1,?第二条呢,就是通过从装配线2过来嘛,也就是?a?2n-1

?于是问题来了,S?n?和它们有什么关系呢,其实关系是有的。也就是我们的Sn肯定那两条选择的路径中所花时间最少的那条了,也就是


就是算法导论(第二版)中间的原话了。

我们可以看到其中还有一个f2,以及一个f1,那么,它们有什么关系呢?

其实f1和f2的引入是为了假设我们不知道最后是从第一条装配线出来还是从第二条装配线出来,那么我们就可以假设了,两者都要假设,然

后求两者的最小值,就可以了,而且求这两条装配线并不是独立的,而是它们间相互有关系。

你们看,我们的f1[j]是括号里面两者的较小值,也就是两条路径中选择时间最少的。这当然是肯定的。那么其中涉及到的f1[j-1]和f2[j-1]呢,那么

它们肯定也是在它们的情况选择两条可以到达它们路径中的较小值啊。。有点像“贪心算法”的问题,也就是每次总是选择是好的那种情况了。

刚刚我们是反着来,那么正着来呢,也就是从左边开始,往右边走,还是由

同理:

我们总是选择最好的那条路线。

  1. #ifndef ASSEMBLE_LINE_H
  2. #define ASSEMBLE_LINE_H
  3. #include<iostream>
  4. #include<string>
  5. class AssembleLine{
  6. private:
  7. int AssOneIn; //第一条装配线输入的代价
  8. int AssTwoIn; //第二条装配线输入的代价
  9. int AssOneOut; //第一条装配线输出的代价
  10. int AssTwoOut; //第二条装配线输出的代价
  11. int *Ass_one; //第一条装配线零件装配代价
  12. int Len_one; //第一条装配线的长度
  13. int *Ass_two; //第二条装配线零件的装配代价
  14. int Len_two; //第二条装配线的长度
  15. int *AssOneToTwo; //第一条装配线转入第二条的代价
  16. int *AssTwoToOne; //第二条装配线转入第一条的代价
  17. int *f1; //记录第一条装配线
  18. int *f2; //记录第二条装配线
  19. public:
  20. AssembleLine(int *&ass1,int len1,int *&ass2,int len2):Ass_one(ass1),Ass_two(ass2),Len_one(len1),Len_two(len2){
  21. }
  22. int assembleMin();
  23. };
  1. #include"AssembleLine.h"
  2. #define Min(a,b) a<b? a:b
  3. int AssembleLine::assembleMin(){
  4. f1[0]=this->AssOneIn+this->Ass_one[0];
  5. f2[0]=this->AssTwoIn+this->Ass_two[0];
  6. for(int i=1;i<this->Len_one; i++){
  7. f1[i]=Min((f1[i-1]+this->Ass_one[i]),(f2[i-1]+this->Ass_one[i]+this->AssTwoToOne[i-1]));
  8. f2[i]=Min((f2[i-1]+this->Ass_two[i]),(f2[i-1]+this->Ass_two[i]+this->AssOneToTwo[i-1]));
  9. }
  10. return Min((f1[this->Len_one-1]+this->AssOneOut),(f2[this->Len_two-1]+this->AssTwoOut));
  11. }

来自为知笔记(Wiz)

时间: 2025-01-07 00:07:32

装配线问题的相关文章

算法导论--动态规划(装配线调度)

装配线问题: 某个工厂生产一种产品,有两种装配线选择,每条装配线都有n个装配站.可以单独用,装配线1或2加工生产,也可以使用装配线i的第j个装配站后,进入另一个装配线的第j+1个装配站继续生产.现想找出通过工厂装配线的最快方法. 装配线i的第j个装配站表示为Si,j,在该站的装配时间是ai,j 如果从 Si,j装配站生产后,转移到另一个生产线继续生产所耗费的时间为ti,j 进入装配线花费时间ei,完成生产后离开装配线所耗费时间为xi 令f*表示通过生产所有路线中的最快的时间 令fi[j]表示从入

算法导论-动态规划-装配线调度

动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的.分治算法是指将问题划分为一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.在这种情况下,若用分治法则会做许多不必要的工作,即重复地求解公共的子子问题.动态规划对每个子子问题只求解一次,将结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问题可能有很多种可行解,每个解有一

动态规划—装配线调度

前言: 分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解. 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题.它适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题.在这种情况下,若用分治法会做许多不必要的工作,即重复地求解公共的子问题.动态规划对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常用于最优化问题.[此类问题可能有很多种可行解,我们希望找到一个

装配线调度问题的算法解析和验证

lienhua342014-10-06 1 问题描述 某个汽车工厂共有两条装配线,每条有 n 个装配站.装配线 i 的第 j个装配站表示为 Si,j ,在该站的装配时间为 ai,j .一个汽车底盘进入工厂,然后进入装配线 i(i 为 1 或 2),花费时间为 ei .在通过一条线的第 j 个装配站后,这个底盘来到任一条装配线的第(j+1)个装配站.如果它留在相同的装配线,则没有移动开销.但是,如果它移动到另一条线上,则花费时间为 ti,j .在离开一条装配线的第 n 个装配站后,完成的汽车底盘花

&lt;算法导论&gt;装配线调度

#include <unistd.h> #include <iostream> //算法导论PDF194页描述的问题 using namespace std; inline int min(int a,int b) { return a>b?b:a; } int a1[6]={7,9,3,4,8,4}; //a1装配线的时间 int a2[6]={8,5,6,4,5,7};//a2时间 int l2[6]={4,2,3,1,3,4}; //进入a2的时间 int l1[6]=

动态规划--装配线调度算法

一.问题描述 某个汽车工厂共有两条装配线,每条有 n 个装配站.装配线 i 的第 j个装配站表示为 Si,j ,在该站的装配时间为 ai,j .一个汽车底盘进入工厂,然后进入装配线 i(i 为 1 或 2),花费时间为 ei .在通过一条线的第 j 个装配站后,这个底盘来到任一条装配线的第(j+1)个装配站.如果它留在相同的装配线,则没有移动开销.但是,如果它移动到另一条线上,则花费时间为 ti,j .在离开一条装配线的第 n 个装配站后,完成的汽车底盘花费时间为 xi 离开工厂.待求解的问题是

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

流程的冬天来了?不,春天来了!

2011年,Facebook前工程总监黄易山强调,Facebook的新工作流程的通常模式是"只有在事情快要不可收拾的时候,才会考虑引入新的工作流程": 有人说,从2012年开始,互联网风潮的来袭让中国的流程管理好不容易在金融危机后攒起的激情火花慢慢消散: 2015年,谷歌掌门人的第一本国内引进作品<重新定义公司>,鼓励企业管理去流程化: 去年,张小龙在微信内部演讲中提到"警惕流程""破除流程管理"等观点: -- 据此,有人认为&quo

动态规划总结

动态规划通常应用于最优化问题,即要做出一组选择以达到一个最优解.在做选择的同时,经常出现同样形式的子问题.当某一特定的子问题可能出自于多于一种选择的集合时,动态规划是很有效的.关键技术是存储这些子问题每一个的解,以备它重复出现. 和分治法一样,动态规划是通过组合子问题的解而解决整个问题的.动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题.动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类