JAVA实现贪心算法中的多机调度问题

题目如下:

  1. 设有n个独立的作业{1,2,…,n},由m台相同的机器{1,2, …,m}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但未完工前不允许中断,任何作业也不能拆分成更小的子作业。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

例如,有7个独立的作业{1,2,3,4,5,6,7},由3台机器{1,2,3}加工处理,各作业所需的处理时间如下:

作业编号

1

2

3

4

5

6

7

作业的处理时间

2

14

4

16

6

5

3

 分析:

首先,按照什么方式处理作业呢?

           这里只列举最短作业优先最长作业优先

           根据上面表格的计算。

按照作业处理时间由少到多进行排序,依次放入机器加工。若以最短作业优先的方式,机器1处理1,6,4三份作业,机器2处理7,5两份作业,机器三处理3,2两份作业,共计23秒(这里就以秒为时间单位吧!不重要)。若依最长作业优先的方式,机器1处理4一份作业,机器2处理2,7两份作业,机器三处理5,6,3,1四份作业,共计17秒。

           经分析可得:贪心法求解多机调度问题的贪心策略是最长处理时间作业优先;即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。

         按照最长处理时间作业优先的贪心策略,当m≥n时,只要将机器i的[0,ti)时间区间分配给作业i即可;

        当m<n时,首先将n个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。

接下来,要进行算法的构建以及数据结构的使用了。

1.确定数据结构

         由题意可得,每一份作业处理时间需要用数据结构存储,很显然,这里使用数组存储。

         那每台机器上要处理多少份作业呢?这里用数组num存储。

         那可不可以用一个二维数组存储每台机器的第n份作业是什么呢?

         最后,每台机器最终需要多少时间需要用一个数组来表示,来进行最终花费时间的比较,求得最终结果。

         这些都是我们需要输出的,可以看出,这个题目需要用大量数组来实现的。

2.用贪心法完成多机调度问题

         每一步最优化,取得局部最优化结果。

         首先,将作业排序,这里按降序排序,因为是最长作业优先。

         然后,通过求得当下的空闲机器放入作业,循环至遍历完所有作业。

         最后,通过比较各台机器被占用时间,最大值为花费时间。

最后,就是程序实现了。

        一部分功能如下:

比较机器最小占用时间

//比较机器最小占用时间

 public static void min(int[] ctime,int m) {
            int min=0x3f3f3f3f;
            int t=0;
            for(int j=0;j<m;j++) {
                if(ctime[j]<min)
                    min=ctime[j];
            }
            for(int j=0;j<m;j++) {
                if(ctime[j]==min)
                    t=j;
            }
        }

求出机器最大总时长,求得最终结果。 

//求出机器最大总时长,求得最终结果。

public static void max(int[] ctime,int m) {
            int max=0;
            for(int j=0;j<m;j++) {
                if(ctime[j]>max)
                    max=ctime[j];
            }  
        }

       

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值