流水作业调度

来源:互联网 发布:网络兼职干什么好 编辑:程序博客网 时间:2024/05/17 22:56
#include<stdio.h>
#include<iostream>
using namespace std;
#include<time.h>
#include<stdlib.h>
#define random(x) (rand()%x)

typedef struct {
    int key; //以Ai还是Bi作为关键字排序
    bool job;//标志是Ai>Bi还是Ai<Bi型,从而分别归在N1或N2集合中
    int index;//将它作为第index个作业
}JobType;

void BubbleSort(JobType * R,int n)//冒泡排序
{
    int i,j;
    JobType temp;
    bool exchange; //交换标志
    for(i = 0;i < n;i ++){ //最多做n-1趟排序
        exchange = false; //本趟排序开始前,交换标志应为假
        for(j = n - 1;j >= i;j --)
            if(R[j+1].key < R[j].key){
                temp = R[j+1];
                R[j+1] = R[j];
                R[j] = temp;
                exchange=true; //发生了交换,故将交换标志置为真
            }
            if(!exchange) //本趟排序未发生交换,提前终止算法
                return;
    }
}

int FlowShop(int n, int *a, int *b, int *c)
//n为作业数,a、b为数组,分为放n个作业在机器M1和M2上执行的时间,c数组存放最优流水次序
{
    JobType d[4];
    
    for (int i=0; i<n; i++) {
        d[i].key = a[i]>=b[i] ? b[i] : a[i];//key值保存较小者
        d[i].job = a[i]<b[i];//将作业分为N1和N2两组
        d[i].index = i;
    }
    
    BubbleSort(d,n);//对n个作业以其key值升序排列
    
    int j=0, k=n-1;
    for (i=0; i<n; i++) {
        if (d[i].job) c[j++] = d[i].index;
        else c[k--] = d[i].index;
    }
    printf("最优次序为:");
    for (i=0; i<n; i++) {
        printf("%d ",c[i] + 1);
    }
    
    
//计算按最优次序执行作业的时间    
    j = a[c[0]];
    k = j + b[c[0]];    
    for (i = 1; i < n; i++) {
        j += a[c[i]];
        k = j < k ? k + b[c[i]] : j + b[c[i]];
    }
    
    return k;
}
void Compare(int n, int *a, int *b, int *c)//n为作业数,a、b为数组,分为放n个作业在机器M1和M2上执行的时间,c数组存放流水次序
{
    int  j=4,p,q,t;
    //对作业的调度次序随机排序
    while(j--)
    {
        p=rand()%4;
        q=rand()%4;        
        t=c[p];
        c[p]=c[q];
        c[q]=t;
    }
        
    printf("加工次序为:");
    for (int i=0; i<n; i++) {
        printf("%d ",c[i]+1);
    }
//计算按此加工次序用的时间    
    j = a[c[0]];
    int k = j+b[c[0]];
    
    for (i=1; i<n; i++) {
        j+= a[c[i]];
        k = j<k ? k+b[c[i]] : j+b[c[i]];
    }
    
    printf("\n加工时间为:%d",k);
}
void main(){
    
    int n;//作业数
    int *a;//存放每个作业在M1上加工的时间
    int * b;//存放每个作业在M2上加工的时间
    int *c;//存放最优次序
    char m ;//保存是否要比较
    printf("输入作业数:");
    scanf("%d",&n);
    a = new int[n];
    b = new int[n];
    c = new int[n];
    printf("输入每个作业在M1上加工的时间:");
    for(int i = 0;i < n;i++)
        scanf("%d",&a[i]);
    printf("输入每个作业在M2上加工的时间:");
    for(i = 0;i < n;i++)
        scanf("%d",&b[i]);    
    printf("\n最少加工时间为:%d\n",FlowShop(n,a,b,c));
        
    printf("\n要比较吗?(Y/N)");
    scanf("%s",&m);
    while(m == 'Y')
    {
        Compare(n,a,b,c);
        printf("\n要比较吗?(Y/N)");
        scanf("%s",&m);    
    }
        
    delete a;
    delete b;
    delete c;
    
}


原创粉丝点击