1. 程式人生 > >多機排程問題-貪心演算法

多機排程問題-貪心演算法

        有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<Task> 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<Machine> 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<Task>() {
            @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<Machine>() {
                @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<Task> 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<Task> getTaskList() {
            return taskList;
        }

        public void setTaskList(List<Task> 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;
        }
    }
}