实验4 贪心法(作业调度问题)
生活随笔
收集整理的這篇文章主要介紹了
实验4 贪心法(作业调度问题)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.問題的已知
設(shè)有n個獨(dú)立的作業(yè){1, 2, …, n},由m臺相同的機(jī)器{M1, M2, …, Mm}進(jìn)行加工處理,作業(yè)i所需的處理時間為ti(1≤i≤n),每個作業(yè)均可在任何一臺機(jī)器上加工處理,但不可間斷、拆分。
2.所求的目標(biāo)
要求給出一種作業(yè)調(diào)度方案,使所給的n個作業(yè)在盡可能短的時間內(nèi)由m臺機(jī)器加工處理完成。
3.算法步驟
當(dāng)n>m時,首先將n個作業(yè)從大到小排序,然后依此順序?qū)⒆鳂I(yè)分配給空閑的處理機(jī)。也就是說從剩下的作業(yè)中,選擇需要處理時間最長的,然后依次選擇處理時間次長的,直到所有的作業(yè)全部處理完畢,或者機(jī)器不能再處理其他作業(yè)為止。
4.程序
public class Greedy {private static int greedy (int[] arr, int m) {int n = arr.length;int sum = 0;if (n <= m) {for (int i = 0; i < n; i++) {if (sum < arr[i]) {sum = arr[i];}}System.out.println("為每一臺機(jī)器分工一個作業(yè)");return sum;}List<Job> jobs = new ArrayList<>();for (int i = 0; i < n; i++) {Job job = new Job(i + 1, arr[i]);jobs.add(job);}Collections.sort(jobs);LinkedList<Machine> machines = new LinkedList<>();for (int i = 1; i <= m; i++) {Machine machine = new Machine(i, 0);machines.add(machine);}for (int i = 0; i < n; i++) {Collections.sort(machines);Machine mac =machines.peek();System.out.println("將機(jī)器" + mac.getId() + "從" + mac.getAvaile() + "到" + (mac.getAvaile() + jobs.get(i).getTime()) + "分配給作業(yè)" + jobs.get(i).getId());int a = mac.getAvaile() + jobs.get(i).getTime();mac.setAvaile(a);sum = a;}return sum;} } class Job implements Comparable {private int id;private int time;public Job (int id, int time) {this.id = id;this.time = time;}public int getId () {return id;}public void setId (int id) {this.id = id;}public int getTime () {return time;}public void setTime (int time) {this.time = time;}@Overridepublic int compareTo (Object o) {int otherTime = ((Job) o).getTime();if (this.time < otherTime) return 1;if (this.time == otherTime) return 0;return -1;} }class Machine implements Comparable {private int id;private int availe;public Machine (int id, int availe) {this.id = id;this.availe = availe;}public int getId () {return id;}public void setId (int id) {this.id = id;}public int getAvaile () {return availe;}public void setAvaile (int availe) {this.availe = availe;}@Overridepublic int compareTo (Object o) {int otherTime = ((Machine) o).getAvaile();if (this.availe < otherTime) return -1;if (this.availe == otherTime) return 0;return 1;} }5.測試數(shù)據(jù)
測試數(shù)據(jù)一:
測試數(shù)據(jù)二:
6.測試結(jié)果
7.結(jié)果分析
經(jīng)分析結(jié)果符合預(yù)想!
時間復(fù)雜度為O(nlogn)
總結(jié)
以上是生活随笔為你收集整理的实验4 贪心法(作业调度问题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解计算机底层为什么采用补码运算【如
- 下一篇: 实验3 动态规划(0/1背包)