先來先服務,短作業優先,最高響應比三種算法下求平均週轉和帶權週轉時間的實現





codear發表於 2006年04月11日 21:20:00 (http://blog.csdn.net/coDear) <script type="text/javascript">function hide(){showComment();}</script>
#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
*/ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章