• 贪心算法-最长作业优先


    使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。

    可以考虑以下的贪心策略:

    1)最长处理时间作业优先的贪心选择策略。

    2)最短处理时间作业优先的贪心选择策略。

    3)作业到达时间优先的贪心选择策略。

    package test;
    
    import java.util.*;
    public class TxDjdu{
    static int N=7; //作业数
    static int M=3; //机器数 
    static int[] s=new int[M];//每台机器当前已分配的作业总耗时 
    
    public static void main(String arg[]) 
    {
        
        int[] time =new int[]{2,14,4,6,16,5,3};
        Sort(time,N);//处理时间按从大到小排序 
        int maxtime = 0;
        if(M >= N)
        {
             maxtime = work1(time,N);
        }
        else
        {
             maxtime = work2(time,N); 
        } 
        
        System.out.print("最长作业优先算法耗费时间:"+maxtime);
    }
    
    //冒泡排序
    static void Sort(int t[],int n){
        int temp;
        for(int i=1;i<n;i++){
            for(int j=0;j<n-i;j++){
                if(t[j]<t[j+1]){
                    temp=t[j];
                    t[j]=t[j+1];
                    t[j+1]=temp;
                }
            }
        }
    }
    
    //机器数大于待分配作业数
    static int work1(int t[],int n)
    {
      int i;
      for(i=0;i<n;i++)
      {
         s[i] = t[i];
      }
      int ma = maxWork(s,N);//s中最长的机器工作时间为结果
      return ma;
    }
    
    //机器数小于待分配作业数 
    static int work2(int t[],int n)
    {
        int i;
        int mi = 0;
        for(i=0;i<n;i++)
        {
          mi = min(M);//找到空闲的机器号
          System.out.printf("%d,时间和最小的机器号为%d.时间和为%d:
    ",i,mi,s[mi]);
          s[mi] = s[mi]+t[i];//每次取最长的作业放入机器中
        
        }
        int ma = maxWork(s,M);//s中最长的机器工作时间为结果
        return ma;
    }
    
    //求出目前处理作业的时间和 最小的机器号
    static int min(int m)
    {
        int min = 0;
        int i;
        for(i=1;i<m;i++)
        {
            if(s[min] > s[i])
            {
               min = i;
            }
        }
        return min;
        
    }
    //求最终结果(最长处理时间)
    static int maxWork(int s[],int num)
    {
        int max = s[0];
        int i;
        for(i=1;i<num;i++)
        {
            max=Math.max(max, s[i]);
        }
        
        return max;
    
    } 
    }
  • 相关阅读:
    Coding.net进阶,使用Git管理代码
    经典算法问题
    浅谈三款常用软件
    Coding.net简单使用指南
    湖北宜化总结
    天顺风能经验总结
    Vue中watch的高级用法
    html 锚点三种实现方法
    【机器学习】EM算法详细推导和讲解
    【机器学习】BP神经网络实现手写数字识别
  • 原文地址:https://www.cnblogs.com/ljs-666/p/8108079.html
Copyright © 2020-2023  润新知