动态规划经典算法之装配站调度问题源代码

//Dynamic Programming经典算法之装配站调度问题
//Author:	milo
//Email:	498638441@qq.com
//Date:		2011/11/16 13:47
#include <stdio.h>
#include <stdlib.h>

static int a1[6]={7,9,3,4,8,4};//1号装配线的每个装配站装配时间
static int a2[6]={8,5,6,4,5,7};//2号装配线的每个装配站装配时间

static int e1=2,e2=4;//入装配线消耗
static int x1=3,x2=2;//出装配线消耗

static int t1[5]={2,3,1,3,4};//从装配线1的装配站到装配线2的下一装配站时间消耗
static int t2[5]={2,1,2,2,1};//从装配线2的装配站到装配线1的下一装配站时间消耗

static int f1[6];//到1号装配线的每一个装配站的最小时间消耗
static int f2[6];//到2号装配线的每一个装配站的最小时间消耗
static int f_;//装配完成时间的最小消耗

static int s1[6];//到1号装配线的对应装配站前走的装配线号
static int s2[6];//到2号装配线的对应装配站前走的装配线号
static int s_;//装配完成时走的最后一条装配线号

//装配站调度核心算法之DP代替递归
static void assembly()
{
	/*1. 入装配站时间消耗*/
	f1[0]=e1+a1[0];
	f2[0]=e2+a2[0];//初始化第一个装配站的最小时间消耗

	/*2. 装配线内部最小时间消耗*/
	int i;
	for(i=1;i<6;i++){//顺序求解2-5个装配站的最小时间消耗
		if(f1[i-1]+a1[i] < f2[i-1]+t2[i-1]+a1[i]){//处理1号装配线第i号装配站
			f1[i]=f1[i-1]+a1[i];
			s1[i]=1;
		}else{
			f1[i]=f2[i-1]+t2[i-1]+a1[i];
			s1[i]=2;
		}
		if(f2[i-1]+a2[i] < f1[i-1]+t1[i-1]+a2[i]){//处理2号装配线第i号装配站
			f2[i]=f2[i-1]+a2[i];
			s2[i]=2;
		}else{
			f2[i]=f1[i-1]+t1[i-1]+a2[i];
			s2[i]=1;
		}
	}
	/*3. 出装配线时间消耗*/
	if(f1[5]+x1 < f2[5]+x2){//处理出装配线的情况
		f_=f1[5]+x1;
		s_=1;
	}else{
		f_=f2[5]+x2;
		s_=2;
	}

}

/*用于输出最小消耗装配过程,非递归实现
  降序输出,递归过程升序输出,自己写的
  递归过程感觉很狗屎,有写的精炼的记得
  发我邮箱啊,因为狗屎,本身已是个简单
  过程就不详加注视了*/
static int station=5;
static void print_path()
{
	/*注释部分为非递归实现*/
	//int line=s_;
	//printf("%dth\tline , %dth\tstation\n",s_,5);
	//int i;
	//for(i=5;i>0;i--){
	//	if(line==1){
	//		line=s1[i];
	//	}else{
	//		line=s2[i];
	//	}
	//	printf("%dth\tline , %dth\tstation\n",line,i-1);
	//}
	static int line=s_;
	if(station<0)
		return;
	int line_cp=line;
	if(line==1){
		line=s1[station];
	}else{
		line=s2[station];
	}
	station--;
	print_path();
	line=line_cp;
	station++;
	printf("%dth\tline | %dth\tstation\n",line,station);
}

int main(int argc,char *argv[])
{
	assembly();/*核心算法处理,获取结果*/
	printf("min total timecost:\t%d (s)\n",f_);/*输出最小值*/
	printf("===============================\n");
	print_path();/*输出最小时间消耗装配序列*/
	return 0;
}


  结果输出:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值