【算法导论】动态规划算法之装配线调度

简介:         和分治算法一样,动态规划是通过组合子问题的解而解决整个问题的。但是与分治算法不同的是,动态规划算法适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。

        和分治算法一样,动态规划是通过组合子问题的解而解决整个问题的。但是与分治算法不同的是,动态规划算法适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。动态规划通常用于最优化问题的求解。看一个问题是否适合采用动态规划算法,主要有两个标志 :最优子结构重叠子问题。
最优子结构:问题的一个最优解包含了子问题的最优解。
重叠子问题:当一个递归算法不断地调用同一问题时,我们说该最优子问题包含重叠子问题。
动态规划算法的设计步骤如下:
1.描述最优解的结构。
2.递归定义最优解的值。
3.按自底向上的方式计算最优解的值。
4.由计算出的结果构造一个最优解。
        下面利用动态规划算法求解一些最优化问题,本文解决装配线调度问题,问题如下:
假设有2条生产线,每条生产线有6个装配点。两条生产线对应点的功能相同,但是时间有所差别。产品需要经过这6个点才能完成生产。在同一条生产线上,产品从一个装配点转到下一个装配点的时间可以忽略,但是从一条生产线到另一条生产线则需要时间消耗。我们的问题是如何找到最短时间的路径。
      上面问题的一般模型如下图:

我们将上述一般模型实例化,可以转换为下图:
        
在上图中,f1[i]为到达第一条生产线中第i个装配站的时间(包括在第i站的时间);f2[i]为到达第二条生产线中第i个装配站的时间(包括在第i站的时间);l1[i]为到达第一条生产线中第i个装配站的上一站是哪条生产线;l2[i]为到达第一条生产线中第i个装配站的上一站是哪条生产线。f*为最终的最短时间,l*为产品最终在哪条生产线上完成生产。
算法思想如下:

        正如上面所说,我们先分别计算到两个装配线的站点1的最短路径,然后计算到站点2的最短路径,直到最终的最短路径。因为到一个站点的最短路径可以由前一个站点的最短路径加上前一个站点到本站点的最短路径。换句话说,到站点6的最短路径最优解包含到站点5的最优解,到站点5的最短路径最优解包含到站点4的最优解,……依此类推,最终可以变为到站点1的最优解。

算法实现如下:
#include<stdio.h>
#include<stdlib.h>

void print_route(int *l1,int *l2,int lfinal,int n);
int Fastest_way(int *a1,int n1,int *a2,int n2,int *t12,int n3,int *t21,int n4,int e1,int e2,int x1,int x2,int *l1,int *l2,int lfinal );

void main()
{
	
	int a1[]={7,9,3,4,8,4};//初始化各节点的时间消耗  
	int a2[]={8,5,6,4,5,7};
	int t12[]={2,3,1,3,4};
	int t21[]={2,1,2,2,1};
	int e1=2;
	int e2=4;
	int x1=3;
	int x2=2;
	int n1=sizeof(a1)/sizeof(int);
	int n2=sizeof(a2)/sizeof(int);
	int n3=sizeof(t12)/sizeof(int);
	int n4=sizeof(t21)/sizeof(int);
	//printf("%d%d%d%d\n",n1,n2,n3,n4);
	int l1[6]={0};//第一个元素没有使用,每个元素的值代表前一次所在的生产线
	int l2[6]={0};
	int lfinal=0;//表示产品最终在哪个条线完成装配
	lfinal=Fastest_way(a1,n1,a2,n2,t12,n3,t21,n4,e1,e2,x1,x2,l1,l2,lfinal );
	print_route(l1,l2,lfinal,n1);	

}
/******************************************************\
函数功能:寻找最短时间路径
输入:各个节点的时间消耗
输出:最终完成装配所在的生产线
\******************************************************/
int Fastest_way(int *a1,int n1,int *a2,int n2,int *t12,int n3,int *t21,int n4,int e1,int e2,int x1,int x2,int *l1,int *l2,int lfinal )
{

	int f1[6]={0};
	int f2[6]={0};
	int final=0;//为总的最短时间消耗
	f1[0]=e1+a1[0];
	f2[0]=e2+a2[0];
	

	for(int i=1;i<n1;i++)
	{
		if((f1[i-1]+a1[i])<=(f2[i-1]+a1[i]+t21[i-1]))
		{
			f1[i]=f1[i-1]+a1[i];
			l1[i]=1;
		}
		else
		{
			f1[i]=f2[i-1]+a1[i]+t21[i-1];
			l1[i]=2;
		}

		if((f2[i-1]+a2[i])<=(f1[i-1]+a2[i]+t12[i-1]))
		{
			f2[i]=f2[i-1]+a2[i];
			l2[i]=2;
		}
		else
		{
			f2[i]=f1[i-1]+a2[i]+t12[i-1];
			l2[i]=1;
		}
	}

	if((f1[n1-1]+x1)<(f2[n1-1]+x2))
	{
		final=f1[n1-1]+x1;
		lfinal=1;
	}
	else
	{
		final=f2[n1-1]+x2;
		lfinal=2;
	}
	
	//for(int i=0;i<6;i++)
	//	printf("%d ",f1[i]);
	//printf("\n");

	//for(int i=0;i<6;i++)
	//	printf("%d ",f2[i]);
	//printf("\n");

	//for(int i=1;i<6;i++)
	//	printf("%d ",l1[i]);
	//printf("\n");

	//for(int i=1;i<6;i++)
	//	printf("%d ",l2[i]);
	//printf("\n");

	return lfinal;
}

/**************************************************\
函数功能:逆向打印装配所经过的线路节点
输入:    记录经过的节点的数组了l1和l2、最终完成装配所在的生产线
输出:    打印装配所经过的路程
\**************************************************/
void print_route(int *l1,int *l2,int lfinal,int n)
{
	int flag=0;
	printf("line: %d ,station: %d\n",lfinal,n);
	for(int i=n-1;i>0;i--)
	{
		if(i==n-1)
		{
			if(lfinal==1)
			{
			  printf("line: %d ,station: %d\n",l1[i],i);
			  if(l1[i]==1)
			      flag=1;
			  else
				  flag=2;
			}
			else
			{
			  printf("line: %d ,station: %d\n",l2[i],i);
			  if(l2[i]==1)
				  flag=1;
			  else
			      flag=2;
			}
		}
		else
		{
			if(flag==1)
	        {
			  printf("line: %d ,station: %d\n",l1[i],i);
			   if(l1[i]==1)
			      flag=1;
			  else
				  flag=2;
			}
			else
			{
			  printf("line: %d ,station: %d\n",l2[i],i);
			   if(l2[i]==1)
				  flag=1;
			  else
			      flag=2;
			}
			
		}

	}
	
}


目录
相关文章
|
15天前
|
机器学习/深度学习 算法 调度
基于NSGA-III算法求解微电网多目标优化调度研究(Matlab代码实现)
基于NSGA-III算法求解微电网多目标优化调度研究(Matlab代码实现)
|
16天前
|
机器学习/深度学习 运维 算法
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
137 0
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
|
18天前
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
231 1
|
18天前
|
机器学习/深度学习 边缘计算 监控
【创新】【微电网多目标优化调度】五种多目标优化算法(MOJS、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(Matlab代码实现)
【创新】【微电网多目标优化调度】五种多目标优化算法(MOJS、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(Matlab代码实现)
|
24天前
|
机器学习/深度学习 算法 安全
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)
|
10天前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
|
15天前
|
运维 算法 搜索推荐
基于天牛须(BAS)与NSGA-Ⅱ混合算法的交直流混合微电网多场景多目标优化调度(Matlab代码实现)
基于天牛须(BAS)与NSGA-Ⅱ混合算法的交直流混合微电网多场景多目标优化调度(Matlab代码实现)
|
15天前
|
机器学习/深度学习 边缘计算 分布式计算
基于差分进化算法的微电网调度研究(Matlab代码实现)
基于差分进化算法的微电网调度研究(Matlab代码实现)
|
18天前
|
机器学习/深度学习 存储 算法
【微电网优化调度】五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度比较研究【创新未发表】(Matlab代码实现)
【微电网优化调度】五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度比较研究【创新未发表】(Matlab代码实现)
|
10天前
|
机器学习/深度学习 运维 算法
【复现】基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)
【复现】基于改进秃鹰算法的微电网群经济优化调度研究(Matlab代码实现)

热门文章

最新文章