美文网首页
2019-08-09

2019-08-09

作者: lenny611 | 来源:发表于2019-08-09 16:57 被阅读0次
    package experiment;
    
    import java.util.*;
    
    import java.text.DecimalFormat;
    
    class Process
    
    {
    
    Process(){}
    
    Process(String Name,int ArrivalTime,int ServiceTime)
    
    {
    
    this.Name=Name;
    
    this.ArrivalTime=ArrivalTime;
    
    this.ServiceTime=ServiceTime;
    
    }
    
    public String getName() {
    
    return Name;
    
    }
    
    public void setName(String name) {
    
    Name = name;
    
    }
    
    public int getArrivalTime() {
    
    return ArrivalTime;
    
    }
    
    public void setArrivalTime(int arrivalTime) {
    
    ArrivalTime = arrivalTime;
    
    }
    
    public int getServiceTime() {
    
    return ServiceTime;
    
    }
    
    public void setServiceTime(int serviceTime) {
    
    ServiceTime = serviceTime;
    
    }
    
    public int getFinishTime() {
    
    return FinishTime;
    
    }
    
    public void setFinishTime(int finishTime) {
    
    FinishTime = finishTime;
    
    }
    
    public int getWholeTime() {
    
    return WholeTime;
    
    }
    
    public void setWholeTime(int wholeTime) {
    
    WholeTime = wholeTime;
    
    }
    
    public double getWeightWholeTime() {
    
    return WeightWholeTime;
    
    }
    
    public void setWeightWholeTime(double weightWholeTime) {
    
    WeightWholeTime = weightWholeTime;
    
    }
    
    private String Name;  //进程名称
    
    private int ArrivalTime; //到达时间
    
    private int ServiceTime;//服务时间
    
    private int FinishTime; //完成时间
    
    private int WholeTime;//周转时间
    
    private double WeightWholeTime; //带权周转时间
    
    public  void WholeTime(Process[]process)
    
    {
    
    //求进程的周转时间  周转时间=完成时间-到达时间
    
    for(int i=0;i<process.length;i++)
    
    process[i].setWholeTime(process[i].getFinishTime()-process[i].getArrivalTime());
    
    }
    
    public  void WeightWholeTime(Process[]process)
    
    {
    
    //求进程的带权周转时间
    
    DecimalFormat a = new DecimalFormat(".##");
    
    for(int i=0;i<process.length;i++)
    
    process[i].setWeightWholeTime(Double.parseDouble(a.format((double)process[i].getWholeTime()/(double)process[i].getServiceTime())));
    
    }
    
    public  double AVG_WholeTime(Process[]process)
    
    {
    
    //求进程的平均周转时间
    
    DecimalFormat a = new DecimalFormat(".##");
    
    double AVG_WholeTime=0;
    
    for(int i=0;i<process.length;i++)
    
    AVG_WholeTime=AVG_WholeTime+process[i].getWholeTime();
    
    return  (  Double.parseDouble(a.format(AVG_WholeTime/process.length)) );
    
    }
    
    public  double AVG_WeightWholeTime(Process[]process)
    
    {
    
    //求进程的平均带权周转时间
    
    DecimalFormat a = new DecimalFormat(".##");
    
    double AVG_WeightWholeTime=0;
    
    for(int i=0;i<process.length;i++)
    
    AVG_WeightWholeTime=AVG_WeightWholeTime+process[i].getWeightWholeTime();
    
    return (Double.parseDouble(a.format(AVG_WeightWholeTime/process.length)));
    
    }
    
    public void SortWithArrivalTime(Process[]process)
    
    {
    
    //按到达时间排序
    
    for(int i=0;i<process.length;i++)
    
    {
    
    for(int j=i+1;j<process.length;j++)
    
    {
    
    if(process[i].getArrivalTime()>process[j].getArrivalTime())
    
    swap(process[i],process[j]);
    
    }
    
    }
    
    }
    
    public void SortWithServiceTime(Process[]process)
    
    {
    
    //按服务时间排序
    
    int lastProcessFinishTime=0;//上一个进程的完成时间
    
    for(int i=0;i<process.length;i++)
    
    {
    
    for(int j=i+1;j<process.length;j++)
    
    {
    
    //在到达时间排序的基础上,进行服务时间的排序
    
    if(process[j].getArrivalTime()<lastProcessFinishTime)
    
    {
    
    if(process[i].getServiceTime()>process[j].getServiceTime())
    
    swap(process[i],process[j]);
    
    }
    
    }
    
    lastProcessFinishTime=lastProcessFinishTime+process[i].getServiceTime();
    
    }
    
    }
    
    public void swap(Process process1,Process process2)
    
    {
    
    //交换两个进程
    
        Process newProcess=new Process(process1.getName(),process1.getArrivalTime(),process1.getServiceTime());
    
        process1.setName(process2.getName());
    
        process1.setArrivalTime(process2.getArrivalTime());
    
        process1.setServiceTime(process2.getServiceTime());
    
    
    
        process2.setName(newProcess.getName());
    
        process2.setArrivalTime(newProcess.getArrivalTime());
    
        process2.setServiceTime(newProcess.getServiceTime());
    
    
    
    }
    
    public  void ProcessDetail(Process[] process,int totalTime)
    
    {
    
    //打印进程的过程
    
    for(int time=0;time<=totalTime;time++)
    
    {
    
    for(int i=0;i<process.length;i++)
    
    {
    
    if(process[i].getArrivalTime()==time)
    
    System.out.println("时刻"+time+"进程"+process[i].getName()+"到达");
    
    if(i==0&&time<process[i].getFinishTime())
    
    System.out.println("时刻"+time+"进程"+process[i].getName()+"正在执行");
    
    if(1<=i)
    
    {
    
    if(process[i-1].getFinishTime()<=time&&time<process[i].getFinishTime()&&time>=process[i].getArrivalTime())
    
    System.out.println("时刻"+time+"进程"+process[i].getName()+"正在执行");
    
    }
    
    if(process[i].getFinishTime()==time)
    
    System.out.println("时刻"+time+"进程"+process[i].getName()+"完成");
    
    if(i<process.length-1)
    
    {
    
    if(time>process[i].getFinishTime()&&time<process[i+1].getArrivalTime())
    
    {
    
    while(time!=process[i+1].getArrivalTime())
    
    {
    
    System.out.println("时刻"+time+"系统空闲");
    
    time++;
    
    }
    
    }
    
    }
    
    }
    
    }
    
    }
    
    }
    
    class FCFS
    
    {
    
    public  void PrintProcess(Process[] process)
    
    {
    
    //打印进程的名称,到达时间,服务时间
    
    for(int i=0;i<process.length;i++)
    
          {
    
        System.out.println("第"+(i+1)+"个进程的名称"+process[i].getName()+" "+"到达时间"+process[i].getArrivalTime()+"  "+"服务时间"+process[i].getServiceTime()+" "+"完成时间"+process[i].getFinishTime()+"  "+"周转时间"+process[i].getWholeTime() +"  "+"带权周转时间"+process[i].getWeightWholeTime());
    
          }
    
    }
    
    public  int FinishTime(Process[] process)
    
    {       
    
        //求先来先服务算法的完成时间
    
    //按到达时间排序
    
    new Process().SortWithArrivalTime(process);
    
    int totalTime=0;
    
    int lastProcessFinishTime=process[0].getArrivalTime();//因为已经排序了 ,第一个进程到达的时间用来初始化上一个进程的完成时间
    
    for(int i=0;i<process.length;i++)
    
    {
    
    if(i==0)
    
    {
    
      //第一个进程单独处理
    
      process[i].setFinishTime(process[i].getServiceTime()+lastProcessFinishTime);
    
      lastProcessFinishTime=process[i].getServiceTime()+lastProcessFinishTime;
    
    }
    
    while(i!=0)
    
    {
    
    if(process[i].getArrivalTime()<=lastProcessFinishTime)
    
    { 
    
    //当前进程到达时间小于上一个进程的完成时间
    
    process[i].setFinishTime(process[i].getServiceTime()+lastProcessFinishTime);
    
    lastProcessFinishTime=process[i].getServiceTime()+lastProcessFinishTime;
    
    break;
    
    }
    
      while(process[i].getArrivalTime()>lastProcessFinishTime)
    
      {
    
      //当前进程在上一个进程完成时还没到达
    
      lastProcessFinishTime++;
    
      }
    
    }      
    
    }
    
    totalTime=lastProcessFinishTime;//返回给系统总时间
    
    return totalTime;
    
    }
    
    }
    
    class SJF
    
    {
    
    public  void PrintProcess(Process[] process)
    
    {
    
    //打印
    
    for(int i=0;i<process.length;i++)
    
          {
    
    System.out.println("第"+(i+1)+"个进程的名称"+process[i].getName()+" "+"到达时间"+process[i].getArrivalTime()+"  "+"服务时间"+process[i].getServiceTime()+" "+"完成时间"+process[i].getFinishTime()+"  "+"周转时间"+process[i].getWholeTime() +"  "+"带权周转时间"+process[i].getWeightWholeTime());
    
          }
    
    }
    
    public void swap(Process process1,Process process2)
    
    {
    
    //交换两个进程
    
        Process newProcess=new Process(process1.getName(),process1.getArrivalTime(),process1.getServiceTime());
    
        process1.setName(process2.getName());
    
        process1.setArrivalTime(process2.getArrivalTime());
    
        process1.setServiceTime(process2.getServiceTime());
    
    
    
        process2.setName(newProcess.getName());
    
        process2.setArrivalTime(newProcess.getArrivalTime());
    
        process2.setServiceTime(newProcess.getServiceTime());
    
    
    
    }
    
    public  int FinishTime(Process[] process)
    
    {
    
    //求短作业优先的完成时间
    
    //在FCFS的基础上,再对服务时间进行排序
    
    new Process().SortWithArrivalTime(process);
    
    new Process().SortWithServiceTime(process);
    
    int totalTime=0;
    
    int lastProcessFinishTime=process[0].getArrivalTime();
    
    for(int i=0;i<process.length;i++)
    
          {
    
    if(i==0)
    
    {
    
    //第一个进程单独处理
    
      process[i].setFinishTime(process[i].getServiceTime()+lastProcessFinishTime);
    
      lastProcessFinishTime=process[i].getServiceTime()+lastProcessFinishTime;
    
    }
    
    while(i!=0)
    
    {
    
    if(process[i].getArrivalTime()<=lastProcessFinishTime)
    
    {
    
    //当前进程到达时间小于上一个进程的完成时间
    
    process[i].setFinishTime(process[i].getServiceTime()+lastProcessFinishTime);
    
    lastProcessFinishTime=process[i].getServiceTime()+lastProcessFinishTime;
    
    break;
    
    }
    
    while(process[i].getArrivalTime()>lastProcessFinishTime)
    
    {
    
    //当前进程在上一个进程完成时还没到达
    
    lastProcessFinishTime++;
    
    }
    
    }      
    
          }
    
    totalTime=lastProcessFinishTime;
    
    return totalTime;
    
    }
    
    }
    
    public class experiment {
    
    public static void sjf(Process[] process)
    
    {
    
    //进程个数为5
    
    //预期输出结果如下
    
    //    名称  到达时间  服务时间    完成时间      周转时间              带权周转时间                  平均周转时间为 7.8 平均带权周转时间为2.233
    
    //  A  0      4    4      4          1.0
    
    //      B  1      3    9      8          2.666
    
    //      C  2      4    13      11        2.75
    
    //      D  3      2    6      3          1.5
    
    //      E  4      4    17      13        3.25
    
    System.out.println("SJF算法结果如下:——————————————————");
    
    int totalTime=new SJF().FinishTime(process);
    
    new Process(). WholeTime(process);
    
    new Process().WeightWholeTime(process);            
    
            new Process().ProcessDetail( process, totalTime);
    
            System.out.println("SJF算法结束:——————————————————");
    
            new SJF(). PrintProcess(process);
    
    
    
            System.out.println("平均周转时间为"+new Process().AVG_WholeTime(process));
    
            System.out.println("平均带权周转时间为"+new Process().AVG_WeightWholeTime(process));
    
    }
    
    public static void fcfs(Process[] process)
    
    {
    
    //进程个数为5
    
    //预期输出结果如下
    
    //    名称  到达时间  服务时间    完成时间      周转时间              带权周转时间                  平均周转时间为 8.4 平均带权周转时间为2.7
    
    //  A  0      4    4      4          1.0
    
    //      B  1      3    7      6          2.0
    
    //      C  2      4    11      9          2.25
    
    //      D  3      2    13      10        5.0
    
    //      E  4      4    17      13        3.25
    
    System.out.println("FCFS算法结果如下:——————————————————");
    
    int totalTime=new FCFS().FinishTime(process);
    
        new Process().WholeTime(process);
    
        new Process().WeightWholeTime(process);                
    
            new Process().ProcessDetail( process, totalTime);
    
            System.out.println("FCFS算法结束:——————————————————");
    
            new FCFS().PrintProcess(process);
    
            System.out.println("平均周转时间为"+new Process().AVG_WholeTime(process));
    
            System.out.println("平均带权周转时间为"+new Process().AVG_WeightWholeTime(process));
    
    }
    
    public static void main(String[] args)  {
    
    Scanner Input=new Scanner(System.in);
    
    //  System.out.println("请输入进程个数:");
    
    //  int num=Input.nextInt();
    
    //        Process [] process=new Process[num];     
    
    //        for(int i=0;i<num;i++)
    
    //        {
    
    //        System.out.println("请输入第"+(i+1)+"个进程的名称,到达时间,服务时间");
    
    //        String name=Input.next();
    
    //        int arrivalTime=Input.nextInt();
    
    //        int ServiceTime=Input.nextInt();
    
    //        process[i]=new Process(name,arrivalTime,ServiceTime);
    
    //        }            
    
          Process [] process=new Process[5];
    
          process[0]=new Process("A",0,4);
    
          process[1]=new Process("B",1,3);
    
          process[2]=new Process("C",2,4);
    
          process[3]=new Process("D",3,2);
    
          process[4]=new Process("E",4,4);
    
    //        process[0]=new Process("A",1,2);
    
    //        process[1]=new Process("B",6,3);
    
    //        process[2]=new Process("C",14,5);
    
    //        process[3]=new Process("D",9,2);
    
    //        process[4]=new Process("E",20,3);  //考虑乱序,两个进程之间产生空闲时间
    
          System.out.println("选择FCFS算法请输入1,选择SJF算法请输入2,退出请输入0");
    
          String exe=Input.next(); 
    
          Input.close();
    
          if(Integer.parseInt(exe)==1)
    
          fcfs(process);         
    
          if(Integer.parseInt(exe)==2)
    
          sjf(process);   
    
          if(Integer.parseInt(exe)==0)
    
          return;
    
    }
    
    }
    

    相关文章

      网友评论

          本文标题:2019-08-09

          本文链接:https://www.haomeiwen.com/subject/bkwhjctx.html