博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
流水作业调度
阅读量:4984 次
发布时间:2019-06-12

本文共 2279 字,大约阅读时间需要 7 分钟。

2018-03-18 20:37:06

问题描述:

n个作业 N={1,2,…,n}要在2台机器M1和M2组成的流水线上完成加工。每个作业须先在M1上加工,然后在M2上加工。M1和M2加工作业 i 所需的时间分别为 ai 和bi,每台机器同一时间最多只能执行一个作业。

流水作业调度问题要求确定这n个作业的最优加工顺序,使得所有作业在两台机器上都加工完成所需最少时间。

问题求解:

流水作业调度问题的每个作业都会被分成若干部分,例如本例中的2部分,然后这两部分会有先后的在两台不同的机器上进行执行,最后求解的是在最终所有任务完成的时间。

流水作业问题是个NPC问题,在m > 2的时候目前没有找到很好的解决方法。在n = 2的前提下,可以使用Johnson法则在O(nlogn)完成求解。

Johnson法则:

对作业i,j,若满足min{bi, aj} >= min{bj, ai},则称,作业i,作业j满足Johnson法则。

已经被证明所有满足John法则的调度都是最优调度,Johnson法则的证明过程是比较繁琐的,可以进行定性的证明:

直观上,一个最优调度应该使机器M1没有空闲时间,且机器M2的空闲时间最少。

bi和aj是产生重叠的部分,如果该部分越大,则说明机器M2的空闲时间越少,因此我们所有的调度都应该满足这个法则。

因此本题就规约为了如何构造出一个满足Johnson法则的调度。

可以采取以下的策略进行构造:

public class MultiDispatch {    class Pair{        int index;        int val;        boolean flag;        Pair(int index, int val, boolean flag) {            this.index = index;            this.val = val;            this.flag = flag;        }    }    int multiDispatch(int[] a, int[] b) {        int[] res = new int[a.length];        boolean[] visited = new boolean[a.length];        Arrays.fill(visited, false);        Pair[] queue = new Pair[a.length + b.length];        int j = 0;        for (int i = 0; i < a.length; i++) {            queue[j++] = new Pair(i, a[i], true);            queue[j++] = new Pair(i, b[i], false);        }        Arrays.sort(queue, new Comparator
() { @Override public int compare(Pair o1, Pair o2) { return o1.val - o2.val; } }); int s = 0; int e = res.length - 1; for (int i = 0; i < queue.length; i++) { if (visited[queue[i].index]) continue; if (queue[i].flag) { res[s++] = queue[i].index; visited[queue[i].index] = true; } else { res[e--] = queue[i].index; visited[queue[i].index] = true; } } int m1 = 0; int m2 = 0; for (int i = 0; i < res.length; i++) { m1 += a[res[i]]; m2 = Math.max(m1, m2) + b[res[i]]; } return m2; } public static void main(String[] args) { MultiDispatch md = new MultiDispatch(); System.out.println(md.multiDispatch(new int[]{5,12,4,8}, new int[]{6,2,14,7})); }}

 

转载于:https://www.cnblogs.com/TIMHY/p/8597548.html

你可能感兴趣的文章
C++整理
查看>>
Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片
查看>>
排序算法(一) —— 冒泡排序
查看>>
No.026:Remove Duplicates from Sorted Array
查看>>
SpringBoot项目的几种创建方式,启动、和访问
查看>>
django Rest Framework---缓存通过drf-extensions扩展来实现
查看>>
linux find 命令用法
查看>>
更新根据条件查出的语句
查看>>
设置gdb反汇编语法为intel(转载)
查看>>
$_ENV
查看>>
SQL中得到最后一个“-”后面的字符串
查看>>
窗外【1】
查看>>
js固定两位小数toFixed(2)
查看>>
[leetcode] Brick Wall
查看>>
产品设计利器--axure
查看>>
解决"disabled". Expected Boolean, got Number with value 0
查看>>
Android 四大组件之Service
查看>>
【NLP新闻-2013.05.15】How Google is setting the new search standard with voice and knowledge graph...
查看>>
OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
查看>>
day10,day11—基本数据类型语法
查看>>