问题描述
已知
作业个数n=10
各个作业第一道工序所须时间ai(I=1,2……,n)
各个作业第二道工序所须时间bi(I=1,2……,n)
作业序号: 1 2 3 4 5 6 7 8 9 10
a; 25 30 35 40 45 50 55 60 65 70
b; 21 31 41 51 61 39 49 59 69 79
规定: (1)任一个作业必须先做完第一道工序才能做第二道工序
(2) 任一个作业的任一道工序必须连续做完,才能中断而让别的作业做完.
求: 一种最优调度方案,即使总的完成时间最短的调度方案,用长度为n的一维数组s表示,使s[i]为按先后次序排在第ii位进行处理的作业的序号.
调度规则
(1)用一个4*20的结构体二维数组M,第1行存放按从小到大排序的20个所给出的ai和bi,第2行存放相应的作业序号,第3行存放1或2(1代表是来自ai,2代表是来自bi), 第4行存放0或1(0代表作业序号未进入最优调度方案;1代表作业序号已进入最优调度方案)
(2)把全部ai和bi分别成非降序列, 排序完后,按课本所述方法求一种最优调度方案,存放在S中。
(3)按照这一分类次序考察此序列;如果序列中下一个数是aj且作业j还没有调度,那末在还没有使用的最左位置调度作业j;如果下个数是bj且作业j还没有调度,那末在还没有使用的最右位置调度作业j;如果已经调度了作业j,则转到该序列的下一个数。
例:设n=4,(a1,a2,a3,a4)=(3,4,8,10)和(b1,b2,b3,b4)=(6,2,9,15),对这些a和b分类后的序列是 (b2,a1,a2,b1,a3,b3,a4,b4)=(2,3,4,6,8,9,10,15),设σ1,σ2,σ3,σ4是最优调度。由于最小数是b2,置σ4=2,下一个数是a1, 置σ1=1,接着的最小数是a2,由于作业2已被调度,转向再下一个数b1,作业1已被调度,再转向下一个数a3,置σ2=3,最后剩σ3是空的,而作业4还没调度,从而σ3=4。
{ 1 3 4 2 }
#include<stdio.h>
#include<stdlib.h>struct homework {
int x;
int p;
int lei;
int t;
};
void sort(struct homework c[20]);
void tiaodu(struct homework c[20],int s[10]);
void search(struct homework c[20],int );
int main(){
struct homework c[20]={{25,1,1,0},{21,1,2,0},{30,2,1,0},{31,2,2,0},{35,3,1,0},{41,3,2,0},{40,4,1,0},{51,4,2,0},{45,5,1,0},
{61,5,2,0},{50,6,1,0},{39,6,2,0},{55,7,1,0},{49,7,2,0},{60,8,1,0},{59,8,2,0},{65,9,1,0},{69,9,2,0},{70,10,1,0},{79,10,2,0}};
int s[10];
sort(c);
tiaodu(c,s);
return 0;
}
void sort(struct homework c[20]){
int i,j;
struct homework temp;
for(i=0;i<20-1;i++)
for(j=0;j<20-i-1;j++){
if(c[j].x>c[j+1].x){
temp=c[j];
c[j]=c[j+1];
c[j+1]=temp ;
}
}
for(i=0;i<20;i++){
printf("%d ",c[i].x);
printf("%d ",c[i].p);
printf("%d ",c[i].lei);
printf("%d ",c[i].t);
printf("\n");
}
printf("\n");
}
void tiaodu(struct homework c[20],int s[10]){
int i,k=0,g=9;
for(i=0;i<20;i++){
if(c[i].t==1) continue;
if(c[i].lei==1&&c[i].t==0){
s[k]=c[i].p;
k++;
search(c,c[i].p);
}
if(c[i].lei==2&&c[i].t==0){
s[g]=c[i].p;
g--;
search(c,c[i].p);
}
}
for(i=0;i<10;i++){
printf("%d ",s[i]);
}
printf("\n");
}
void search(struct homework c[20],int goal){
int i;
for(i=0;i<20;i++){
if(c[i].p==goal) c[i].t=1;
}
}
本题的结果为 2 3 4 5 9 10 8 7 6 1