动态规划-流水线调度(Assembly Line Scheduling, ALS)

流水线调度问题,直接上图:

e为开始为进入流水线花费时间,a为station花费的时间,t为切换流水线花费时间,x为出流水线的时间,

代码中用total[0][i]和total[1][i]分别表示第0条和第1条流水线到station i 所花费的最短时间

代码(C语言写的心累):

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<string.h>
#include<fstream>
#define MAX 200000
int assembleLineSequence(int *e, int t[][MAX], int a[][MAX],int *x, int n)
{
    int *total[2];    //记录到达每个station最小的时间花费
    total[0] = (int *)malloc(sizeof(int)*n);
    total[1] = (int *)malloc(sizeof(int)*n);
    total[0][0] = e[0] + a[0][0];
    total[1][0] = e[1] + a[1][0];
    for(int i=1; i<n; i++){
        if(total[0][i-1] + a[0][i] < total[1][i-1] + t[1][i-1] + a[0][i])
            total[0][i] = total[0][i-1] + a[0][i];
        else
            total[0][i] = total[1][i-1] + t[1][i-1] + a[0][i];
        if(total[1][i-1] + a[1][i] < total[0][i-1] + t[0][i-1] + a[1][i])
            total[1][i] = total[1][i-1] + a[1][i];
        else
            total[1][i] = total[0][i-1] + t[0][i-1] + a[1][i];
    }
    if(total[0][n-1] + x[0] < total[1][n-1] + x[1])
        return total[0][n-1] + x[0];
    return total[1][n-1] + x[1];
}

int main()
{
    FILE *fp;
    int result;
    clock_t start, end;    
    for(int i=1; i<=10; i++){
        start = clock();
        char data[20] = "";  //给足够大的长度才不会出现段错误
        char s[2];
        sprintf(s,"%d",i);
        strcat(data,s);
        strcat(data, "组.txt");
        if((fp=fopen(data,"r"))==NULL){
            printf("Cannot open file strike any key exit!");
            return -1;
        }
        bool flag = false;    //记录当前字符是否与上一字符拼接成新数字
        int num,j=0,n=0,line=1;    //n记录数据个数
        int t[2][MAX],a[2][MAX];
        int e[2] = {0,0},x[2] = {0,0};
        char nc;
        while(!feof(fp)){
            nc = fgetc(fp);
            if(isdigit(nc)){
                if(flag == true){
                    num = num * 10 + (nc - '0');
                }else{
                    num = nc - '0';
                }
                flag = true;
            }else {                
                if(nc=='\n'){
                    n = j;
                    j = 0;                    
                    line++;
                }
                if(nc == ' '){
                    switch(line){
                        case 1:
                            t[0][j++] = num;
                            break;
                        case 2:
                            a[0][j++] = num;
                            break;
                        case 3:
                            t[1][j++] = num;
                            break;
                        case 4:
                            a[1][j++] = num;
                            break;
                        default:
                            printf("第%d行default\n",line);
                            break;
                    }
                }
                flag = false;
            }
        }
        end = clock();
        printf("花费时间:%fs\t",(double)(end - start)/CLOCKS_PER_SEC);
        result = assembleLineSequence(e,t,a,x,n);
        printf("第%d组:%d\n",i,result);
        fclose(fp);
    }
        
    return 0;
}

测试数据:

http://yunpan.cn/c3weMQSFtyvaw (提取码:625f)

第一行表示流水线0切换到流水线1的切换时间

第二行表示流水线0中station的处理时间

第三行表示流水线1切换到流水线0的切换时间

第四行表示流水线1中station的处理时间

结果:

花费时间:0.020000s	第1组:996644
花费时间:0.020000s	第2组:1092030
花费时间:0.030000s	第3组:1179822
花费时间:0.020000s	第4组:1268183
花费时间:0.020000s	第5组:1363569
花费时间:0.030000s	第6组:1452373
花费时间:0.030000s	第7组:1543059
花费时间:0.040000s	第8组:1631089
花费时间:0.030000s	第9组:1722228
花费时间:0.030000s	第10组:1813060

 

posted @ 2015-11-29 23:16  挖掘鸡  阅读(3673)  评论(0编辑  收藏  举报