先來先服務,短作業優先,最高響應比三種演算法下求平均週轉和帶權週轉時間的實現
codear發表於 2006年04月11日 21:20:00 (http://blog.csdn.net/coDear)
#include<iostream.h>
#define N 6
struct time{
float arriveTime;
float runTime;
float finishTime;
float totalTime;
float weightTotalTime;
char name;
};
void InputTime(time *p)
{
int i;//counter
cout<<"input name & arrive time & run time:"<<endl;
for(i=0;i<=N-1;i++){
float temp1,temp2;
char name;
cout<<"作業名:"<<endl;
cin>>name;
p[i].name=name;
cout<<"到達時:"<<endl;
cin>>temp1;
p[i].arriveTime=temp1;
cout<<"執行時間:"<<endl;
cin>>temp2;
p[i].runTime=temp2;
}
}
void Print(time *p,float totalTimeSum,float weightTotalTimeSum){
cout<<"執行次序:"<<endl;
for(int k=0;k<=N-1;k++)
{
cout<<p[k].name<<" ";
}
cout<<endl;
cout<<"平均週轉時間:"<<totalTimeSum/N<<endl;
cout<<"平均帶權週轉時間:"<<weightTotalTimeSum/N<<endl;
}
void sort(time *p)
{
for(int i=0;i<=N-1;i++)
for(int j=0;j<=i;j++)
if(p[i].arriveTime<p[j].arriveTime)
{
time temp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
void deal(time *p,float &totalTimeSum,float &weightTotalTimeSum)
{
int k;//counter
for(k=0;k<=N-1;k++)
{
if(k==0)
p[k].finishTime=p[k].arriveTime+p[k].runTime;
else
p[k].finishTime=p[k-1].finishTime+p[k].runTime;
}
for(k=0;k<=N-1;k++)
{
p[k].totalTime=p[k].finishTime-p[k].arriveTime;
p[k].weightTotalTime=p[k].totalTime/p[k].runTime;
totalTimeSum+=p[k].totalTime;
weightTotalTimeSum+=p[k].weightTotalTime;
}
}
void FCFS(time *p)
{
float totalTimeSum=0,weightTotalTimeSum=0;
sort(p);
deal(p,totalTimeSum,weightTotalTimeSum);
cout<<"先來先服務:"<<endl;
Print(p,totalTimeSum,weightTotalTimeSum);
}
void SWF(time *p)
{
float totalTimeSum=0,weightTotalTimeSum=0;
sort(p);
for(int m=0;m<N-1;m++)
{
if(m==0)
p[m].finishTime=p[m].arriveTime+p[m].runTime;
else
p[m].finishTime=p[m-1].finishTime+p[m].runTime;
int i=0;
for(int n=m+1;n<=N-1;n++)
{
if(p[n].arriveTime<=p[m].finishTime)
i++;
}
float min=p[m+1].runTime;
int follow=m+1;
for(int k=m+1;k<m+i;k++)
{
if(p[k+1].runTime<min)
{min=p[k+1].runTime;
follow=k+1;}
}
time temp;
temp=p[m+1];
p[m+1]=p[follow];
p[follow]=temp;
}
deal(p,totalTimeSum,weightTotalTimeSum);
cout<<"短作業優先:"<<endl;
Print(p,totalTimeSum,weightTotalTimeSum);
}
void TRRF(time *p){
float totalTimeSum=0,weightTotalTimeSum=0;
sort(p);
for(int m=0;m<N-1;m++)
{
if(m==0)
p[m].finishTime=p[m].arriveTime+p[m].runTime;
else
p[m].finishTime=p[m-1].finishTime+p[m].runTime;
int i=0;
for(int n=m+1;n<=N-1;n++)
{
if(p[n].arriveTime<=p[m].finishTime)
i++;
}
float max=(p[m].finishTime-p[m+1].arriveTime)/p[m+1].runTime;
int follow=m+1;
for(int k=m+1;k<m+i;k++)
{
if(max<=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime){
max=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime;
follow=k+1;
}
}
time temp;
temp=p[m+1];
p[m+1]=p[follow];
p[follow]=temp;
}
deal(p,totalTimeSum,weightTotalTimeSum);
cout<<"最高響應比優先:"<<endl;
Print(p,totalTimeSum,weightTotalTimeSum);
}
void main(){
time a[N];
InputTime(a);
time *b=a;time *c=a;
FCFS(a);
SWF(b);
TRRF(c);
}
/*
input name & arrive time & run time:
作業名:
a
到達時:
0
執行時間:
6
作業名:
b
到達時:
2
執行時間:
50
作業名:
c
到達時:
5
執行時間:
20
作業名:
d
到達時:
5
執行時間:
10
作業名:
e
到達時:
12
執行時間:
40
作業名:
f
到達時:
15
執行時間:
8
先來先服務:
執行次序:
a b c d e f
平均週轉時間:74.1667
平均帶權週轉時間:5.2425
短作業優先:
執行次序:
a d f c e b
平均週轉時間:44.8333
平均帶權週轉時間:1.6025
最高響應比優先:
執行次序:
a d c f b e
平均週轉時間:48.5
平均帶權週轉時間:2.0275
Press any key to continue
*/