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

一、问题描述

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

  问题提供的变量

  ei:进入装配线i的时间

  aij:在装配站ij所花费的时间

  tij:从装配站ij装配完成之后离开该装配线额外花费的时间

  xi:装配完成离开i的时间

二、思路分析

  观察一条通过装配站 S1,j 的最快路线,发现它必定是经过装配线 1 或2 上的装配站(j-1)。因此,通过装配站 S1,j 的最快路线只能是以下二者之一:

  ? 通过装配站 S1,j?1 的最快路线,然后直接通过装配站 S1,j

  ? 通过装配站 S2,j?1 的最快路线,从装配线 2 转移到装配线 1,然后通过装配站 S1,j

  故寻找通过任一条装配线上的装配站 j 的最快路线,我们可以规划为先寻找通过两条装配线上的装配站 j-1 的最快路线。

  j-1的最优情况可以由j-2的情况来确定,一直向前能推到S0,0和S1,0,而S0,0可以由e0和a0,0相加来确定,S1,1可以由e1和a1,0相加来确定。

三、代码实现

  代码用path存放路径,表示最短路径代表的装配线。装配线为2条,每条装配线有6个装配站。其他数据结构含义见注释。

int main()
{
	//两条装配线
	//进入装配线i的时间
	int e[2] = {1,2};
	//在装配站ij所花费的时间
	int a[2][6] = { {4,2,3,5,3},{7,2,4,2,4} };
	//从装配站ij装配完成之后离开该装配线额外花费的时间
	int t[2][6] = { {2,3,2,2,1},{1,1,2,4,2} };
	//装配完成离开i的时间
	int x[2] = {2,1};
	//用path存放最短路径
	int path[6] = { 0 };
	//每条装配线包含的装配站个数
	int n = 6;

	//result[i][j]表示离开装配站ij所花费的最少时间
	int result[2][6] = {0};
	result[0][0] = e[0] + a[0][0];
	result[1][0] = e[1] + a[1][0];

	if (result[0][0] < result[1][0])
		path[0] = 0;
	else
		path[0] = 1;

	for (int j = 1; j < n; j++) {
		if (result[0][j - 1] < result[1][j - 1] + t[1][j - 1])
			result[0][j] = result[0][j - 1] + a[0][j];
		else
			result[0][j] = result[1][j - 1] + a[0][j] + t[1][j - 1];

		if (result[0][j - 1] + t[0][j - 1] < result[1][j - 1])
			result[1][j] = result[0][j - 1] + a[1][j] + t[0][j-1];
		else
			result[1][j] = result[1][j-1] + a[1][j];
		//保存路径
		if (result[0][j] < result[1][j])
			path[j] = 0;
		else
			path[j] = 1;
	}

	result[0][5] = result[0][5] + x[0];
	result[1][5] = result[1][5] + x[1];

	for (int i = 0; i < 5; i++)
		cout << path[i] << endl;

	if (result[0][5] < result[1][5])
		cout << result[0][5] <<endl;
	else
		cout << result[1][5] << endl;

	system("pause");
    return 0;
}

  

时间: 2024-10-31 02:22:08

动态规划--装配线调度算法的相关文章

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

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

动态规划—装配线调度

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

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

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

动态规划总结

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

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划 我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++) 这里说一下,遇到动态规划应该如何去想,才能找到解决办法. 最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系. minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[

[转]常见的动态规划问题分析与求解

动态规划(Dynamic Programming,简称DP),虽然抽象后进行求解的思路并不复杂,但具体的形式千差万别,找出问题的子结构以及通过子结构重新构造最优解的过程很难统一,并不像回溯法具有解决绝大多数问题的银弹(全面解析回溯法:算法框架与问题求解).为了解决动态规划问题,只能靠多练习.多思考了.本文主要是对一些常见的动态规划题目的收集,希望能有所帮助.难度评级受个人主观影响较大,仅供参考. 目录(点击跳转) 动态规划求解的一般思路 备忘录法 1.硬币找零 扩展1:单路取苹果 扩展2:装配线

装配线问题

装配线问题: 韩鸡鸡一直强调的装配线问题其实很简单,也算是动态规划里面比较简单的问题了. 在上面的图中,我们可以看到也就是一个车间有两条装配线,每一个相对位置的功能是相同的..如图中a11和a21,它们的功能是相同的, 都是装配一个零件,但是它们所需的时间却不相同.而且不同装配线间的移动是要花时间的.但是在同一条装配线上移动是不需要花时间的 ,当然了,我们只能从左往右依次装配零件.那么问题来了,怎么样选择装配路线使得时间最少?当然每件装配线都有它的进入时间和移出 时间,这个就不多说了. 那么对于

算法学习 - 动态规划(DP问题)(C++)

这几天一直再看,觉得看懂了一些,先记下来. 动态规划 动态规划是运筹学的一个方向,就是把多级最优化问题分解成一系列的单阶问题.在不断增加的过程中,不断的计算当前问题的最优解. 一般分为如下四个部分: 线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等: 区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等: 树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等: 背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等: 汽车

算法导论——lec 11 动态规划及应用

和分治法一样,动态规划也是通过组合子问题的解而解决整个问题的.分治法是指将问题划分为一个一个独立的子问题,递归地求解各个子问题然后合并子问题的解而得到原问题的解.与此不同,动态规划适用于子问题不是相互独立的情况,即各个子问题包含公共的子子问题.在这种情况下,如果用分治法会多做许多不必要的工作,重复求解相同的子子问题.而动态规划将每个子问题的解求解的结果放在一张表中,避免了重复求解. 一. 动态规划介绍 1. 动态规划方法介绍: 动态规划主要应用于最优化问题, 而这些问题通常有很多可行解,而我们希