实验4贪心法(作业调度问题)(代码片段)

Roninaxious Roninaxious     2023-02-02     747

关键词:

1.问题的已知
设有n个独立的作业1, 2, …, n,由m台相同的机器M1, M2, …, Mm进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。

2.所求的目标
要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

3.算法步骤
当n>m时,首先将n个作业从大到小排序,然后依此顺序将作业分配给空闲的处理机。也就是说从剩下的作业中,选择需要处理时间最长的,然后依次选择处理时间次长的,直到所有的作业全部处理完毕,或者机器不能再处理其他作业为止。

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("为每一台机器分工一个作业");
            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("将机器" + mac.getId() + "从" + mac.getAvaile() + "到" + (mac.getAvaile() + jobs.get(i).getTime()) + "分配给作业" + 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;
    
    @Override
    public 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;
    

    @Override
    public int compareTo (Object o) 
        int otherTime = ((Machine) o).getAvaile();
        if (this.availe < otherTime) return -1;
        if (this.availe == otherTime) return 0;
        return 1;
    

5.测试数据

测试数据一:

测试数据二:

6.测试结果

7.结果分析

经分析结果符合预想!
时间复杂度为O(nlogn)

贪心法----------区间调度问题

本题的关键是从可选择方法中选择哪一类最优化答案是结束时间最早的一类源代码#include<iostream>#include<algorithm>#include<cstdio>#definemaxn100100usingnamespacestd;structw   intendd,beginn;;boolcmp(wA,wB) 查看详情

c_cpp【分支限界法】批处理作业调度(代码片段)

查看详情

c_cpp【回溯法】批处理作业调度【5.3】(代码片段)

查看详情

dp之流水作业调度问题(代码片段)

1#include<iostream>2#include<cstdio>3#include<string>4#include<algorithm>5usingnamespacestd;6constintN=100;7structnode8inttime;9intindex;10boolgroup;11;1213boolcmp(nodea,node 查看详情

最佳调度问题_分支限界法(代码片段)

...ts/stdc++.h>2usingnamespacestd;3intn,k;4intx[100];//机器5intx1[100];//作业6intmaxnum=1000000;78voidtask(intlevel)91 查看详情

贪心算法的多机调度问题

设有n个独立的作业1,2,…,n,由m台相同的机器进行加工处理。作业i所需的处理时间为ti。现约定,任何作业可以在任何一台机器上加工处理,但未完工前不允许中断处理。任何作业不能拆分成更小的子作业。要求给出一种作业调... 查看详情

区间调度问题-贪心策略(代码片段)

区间调度问题-贪心策略有n项工作,每项工作分别在si时间开始,在ti时间结束.对于每项工作,你都可以选择参与与否.如果选择了参与,那么自始至终都必须全程参与.此外,参与工作的时间段不能重复(即使是开始的瞬间和结束的瞬间的... 查看详情

《justdoit!》团队作业4-基于原型的团队项目需求调研与分析(代码片段)

一、实验目的与要求(1)体验以原型设计为基础的团队软件项目需求获取技巧与方法。(2)学习利用UML模型描述用户需求。(3)编写软件需求规格说明书。二、实验环境要求(1)实验七开发的团队项目原型;(2)UML绘制工具... 查看详情

(贪心)多机调度问题

某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间。 输入第... 查看详情

先进先出调度算法处理缺页中断(代码片段)

...硬件的地址转换和用先进先出调度算法处理缺页中断 实验内容与步骤↓↓↓编写程序,模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断。假定主存的每块长度为1024个字节,现有一个共7页... 查看详情

acm_区间调度问题(贪心)(代码片段)

Meetings系列一TimeLimit:2000/1000ms(Java/Others)ProblemDescription:多年之后的广财ACM编协如日中天,下系多个部门,且编协成员几近过百。这一次,为了庆祝ACM编协近年飞速的发展,各部门都决定在同一天召开会议。请注意:这次由于资源... 查看详情

simpy仿真js-agv联合调度(考虑agv运输时间的作业车间调度)小实验(一:演示框架)(代码片段)

...一个比较好玩的第三方库simpy,由此引发了这一个小实验的灵感,本项目涉及内容:    路径优化算法:A*算法(采用A*做一个无路径冲突的AGV调度),其中节点间距离采用曼哈顿距离。    界面开发... 查看详情

javaitsa第57次月赛问题5.作业调度问题(代码片段)

查看详情

第1415教学周作业

要求二7-1求最大值及其下标一,实验代码二,设计思路三,程序框图四,遇到的问题及解决方法五,运行结果图六,提交列表7-3将数组中的数逆序存放一,实验代码二,设计思路三,程序框图四,遇到的问题及解决方法五,运行... 查看详情

leetcode周赛题--有关任务调度的贪心问题(代码片段)

文章目录题目解题思路解题代码题目有点像操作系统的任务调度。解题思路完成全部任务的情况:我们假设最大任务量刚好与剩余任务总量相等,那么此时可以以(1次最大任务+1次剩余任务)搭配完成全部任务... 查看详情

贪心算法(代码片段)

Wiki关于算法的定义贪心算法(英语:greedyalgorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。[1]比如在旅行推销员问题中,如果旅行... 查看详情

第十二章并发编程(代码片段)

...、程序、进程控制三跨部分组成调度算法先来先服务:长作业有利,短作业无利短作业优先:短作业优先度高,不利于长作业时间片轮转法:将CPU处理时间切成时间片,进程用完时间片还没执行完,就排到末尾等待下一次执行多... 查看详情

回溯法批处理作业调度问题

问题:给定n个作业的集合J1,J2,…,Jn。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需(1≤i≤n)要机器j(1≤j≤2)的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在... 查看详情