java调度问题的贪心算法_多机调度问题-贪心算法

本文通过一个Java程序实例展示了如何利用贪心算法解决多机调度问题,以求得完成所有任务的最短时间。当任务数量小于或等于处理机数量时,最长时间的任务决定总完成时间;否则,按任务完成时间从大到小分配给当前时间最短的处理机。
摘要由CSDN通过智能技术生成

有n个完成时间不同的独立任务,m台处理机,n个任务在任意一台处理机上完成及为完成,一台处理机在同一时间只能处理一个任务,要求给定任务时间和处理机数量时,完成所有任务的最短时间。

多机调度问题是一个NP完全问题,目前没有有效解法,可以使用贪心算法获得近似最优解的答案。当n<=m时,所有任务可以单独占有一台处理机,所以任务完成时间最长的任务就决定了所有任务完成的最短时间;当n>m时,将所有任务按从大到小顺序排列,依次分别放入每次使用中最短时间的机器,就可以获得贪心算法下的近似最优解。package test;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

* Created by saishangmingzhu on 2018/12/11.

*/

public class MultiMachineScheduling {

public static void main(String[] arg) {

new MultiMachineScheduling().greedyAlgorithm();

}

public void greedyAlgorithm(){

List taskList=new ArrayList<>();

taskList.add(new Task("J1",2));

taskList.add(new Task("J2",14));

taskList.add(new Task("J3",4));

taskList.add(new Task("J4",16));

taskList.add(new Task("J5",6));

taskList.add(new Task("J6",5));

taskList.add(new Task("J7",3));

List machineList=new ArrayList<>();

machineList.add(new Machine("m1",0));

machineList.add(new Machine("m2",0));

machineList.add(new Machine("m3",0));

Collections.sort(taskList, new Comparator() {

@Override

public int compare(Task o1, Task o2) {

return o2.getTime()-o1.getTime();

}

});

if (taskList.size()<=machineList.size()){

System.out.println(taskList.get(0).getTime());

}

for (Task task:taskList){

Collections.sort(machineList, new Comparator() {

@Override

public int compare(Machine o1, Machine o2) {

return o1.getTime()-o2.getTime();

}

});

Machine machine=machineList.get(0);

machine.getTaskList().add(task);

machine.setTime(machine.getTime()+task.getTime());

}

int minTime=machineList.get(machineList.size()-1).getTime();

System.out.println(minTime);

for (Machine machine:machineList){

System.out.print(machine.getName()+":");

for (Task task:machine.getTaskList()){

System.out.print(task.getName()+",");

}

System.out.println();

}

}

class Machine{

private String name;

private List taskList=new ArrayList<>();

private int time;

public Machine(String name, int time) {

this.name = name;

this.time = time;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public List getTaskList() {

return taskList;

}

public void setTaskList(List taskList) {

this.taskList = taskList;

}

public int getTime() {

return time;

}

public void setTime(int time) {

this.time = time;

}

}

class Task{

private String name;

private int time;

public Task(String name, int time) {

this.name = name;

this.time = time;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getTime() {

return time;

}

public void setTime(int time) {

this.time = time;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值