为了账号安全,请及时绑定邮箱和手机立即绑定

多机调度问题-贪心算法

标签:
Java


        有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;

        }

    }

}

©著作权归作者所有:来自51CTO博客作者塞上名猪的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消