首页 > 其他分享 >贪心-多机调度问题

贪心-多机调度问题

时间:2024-08-17 13:24:45浏览次数:13  
标签:机器 int 作业 调度 时间 多机 排序 分配 贪心

多机调度问题分析

问题描述

在多机调度问题中,我们有 n 个独立的作业和 m 个相同的机器。每个作业 i 需要处理时间 ti。我们的目标是找到一个调度方案,使得所有作业尽可能快地完成。

贪心策略

  • 最长处理时间优先:优先分配处理时间最长的作业到最先可用的机器上。

情况分类

A: n < m

在这种情况下,每个作业可以独立地分配给一个机器,因为有足够的机器来处理所有作业。

B: n > m

当作业数超过机器数时,我们需要更智能的调度策略。以下是一个具体的例子:

示例

设有7个独立作业 {1, 2, 3, 4, 5, 6, 7} 由3台机器 {M1, M2, M3} 加工处理,各作业所需的处理时间分别为 {2, 14, 4, 16, 6, 5, 3}

贪心算法步骤

  1. 作业排序:首先,将作业按处理时间降序排序。

  2. 初始分配:将排序后的前 m 个作业分配给 m 台机器。

  3. 剩余作业分配:对于剩余的作业,将它们分配给当前完成时间最短的机器。

  4. 计算完成时间:最后,找出所有机器中完成时间最长的机器,该时间即为最短完成时间。

    在这里插入图片描述

贪心策略

采用贪心策略,优先处理花费时间长的任务。具体步骤如下:

  1. 作业排序:将作业按处理时间降序排序,确保最长的作业最先被考虑。
  2. 分配作业:将排序后的作业依次分配给最先空闲的机器。
  3. 计算完成时间:通过比较各台机器的占用时间,找出最大值,即为最短完成时间。

步骤

  1. 作业排序
    在这里插入图片描述

  2. 作业分配

    • 机器 M1 分配作业 4,时间为16
    • 机器 M2 分配作业 2,时间为14
    • 机器 M3 分配作业 5,时间为6
    • 在时间为6时,机器 M3 先结束,此时剩余任务里时间最长的是任务6,时间为5,选择任务6
    • 在时间为11时,机器 M3 先结束,此时剩余任务里时间最长的是任务3,时间为4,选择任务6
    • 在时间为14时,机器 M2 先结束,此时剩余任务里时间最长的是任务7,时间为3,选择任务7
    • 在时间为15时,机器 M3 先结束,此时剩余任务里时间最长的是任务1,时间为2,选择任务1
  3. 计算完成时间:比较各台机器的占用时间,找出最大值为17。
    在这里插入图片描述

代码:

#include<stdio.h> // 包含标准输入输出库,用于执行输入输出操作。

#define SIZE 100 // 定义一个宏SIZE,表示数组的最大大小。

// 函数声明,用于获取数组中的最小值。
int getmin(int a[], int n) {
    int min=0, i; // 初始化最小值索引为0,声明循环变量i。
    for(i = 0; i < n; i++) { // 遍历数组。
        if(a[i] < a[min]) // 如果当前元素小于已知最小值。
            min = i; // 更新最小值索引。
    }
    return min; // 返回最小值的索引。
}

// 函数声明,用于获取数组中的最大值。
int getmax(int a[], int n) {
    int max, i; // 声明最大值索引max,初始化为第一个元素的索引。
    a[max] = a[0]; // 将数组的第一个元素赋值给max。
    for(i = 0; i < n; i++) { // 遍历数组。
        if(a[i] > a[max]) // 如果当前元素大于已知最大值。
            max = i; // 更新最大值索引。
    }
    return max; // 返回最大值的索引。
}

int main() {
    int m, n, a[SIZE]; // 声明机器数m,作业数n,以及大小为SIZE的作业时间数组a。
    printf("请输入有几台机器:"); // 提示用户输入机器数。
    scanf("%d", &m); // 读取用户输入的机器数。
    printf("请输入有几个作业:"); // 提示用户输入作业数。
    scanf("%d", &n); // 读取用户输入的作业数。
    printf("请分别写出:"); // 提示用户输入每个作业的时间。
    for(int i = 0; i < n; i++) { // 循环读取每个作业的时间。
        scanf("%d", &a[i]); // 读取用户输入的作业时间。
    }
    
    // 冒泡排序,将作业时间从小到大排序。
    for(int i=0; i<n; i++) { 
        for(int j=i; j<n; j++) { // 内层循环进行相邻元素的比较。
            if(a[i] > a[j]) { // 如果前一个元素大于后一个元素。
                int tmp = a[j]; // 临时变量存储后一个元素的值。
                a[j] = a[i]; // 将前一个元素的值赋给后一个元素。
                a[i] = tmp; // 将临时变量的值赋给前一个元素。
            }
        }
    }
    
    // 将排序后的数组最大值(即最长作业时间)分配给m台机器。
    int w[SIZE]; // 声明一个数组w,用于存储每台机器的作业时间。
    for(int i=0; i<m; i++) {
        w[i] = a[n-i-1]; // 将排序后的数组的最后m个元素(最长的作业)分配给机器。
    }
    
    // 将剩余的作业时间分配给机器,使得完成时间最短。
    for(int j=n-m-1; j>=0; j--) {
        int t = getmin(w,m); // 找到当前机器中作业时间最短的机器。
        w[t] += a[j]; // 将当前作业时间加到该机器上。
    }
    
    // 计算并输出最短完成时间。
    int min = w[getmax(w,m)]; // 找到所有机器中作业时间最长的机器的时间。
    printf("最短时间为:%d", min); // 输出最短完成时间。
    return 0; // 程序结束。
}

运行截图:

在这里插入图片描述

标签:机器,int,作业,调度,时间,多机,排序,分配,贪心
From: https://blog.csdn.net/qq_52291558/article/details/141278956

相关文章

  • 反悔贪心 & 模拟费用流
    反悔贪心&模拟费用流参考资料来源cyt前言很多找到一种可行的方案,匹配(选择)某些东西,使价值最优化的问题可以建出费用流模型。但是直接跑费用流的复杂度是不对的。我们又想到可以用简单的贪心思路解决这些问题,然而一般的贪心都假掉了。于是我们考虑模拟费用流的退流操作来做......
  • 浅谈ChatGPT在云计算资源调度的应用
    本文分享自天翼云开发者社区《浅谈ChatGPT在云计算资源调度的应用》,作者:张****兵一、ChatGPT技术原理ChatGPT是基于GPT(GenerativePre-trainedTransformer)技术构建的大型语言模型。其技术原理主要包括以下几个方面:Transformer模型:GPT使用了Transformer模型作为其基础......
  • Day31 贪心算法part5
    目录任务56.合并区间思路738.单调递增的数字思路968.监控二叉树思路任务56.合并区间以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。思路......
  • .NET 轻量化定时任务调度 FreeScheduler
    前言在平时项目开发中,定时任务调度是一项重要的功能,广泛应用于后台作业、计划任务和自动化脚本等模块。FreeScheduler是一款轻量级且功能强大的定时任务调度库,它支持临时的延时任务和重复循环任务(可持久化),能够按秒、每天/每周/每月固定时间或自定义间隔执行(CRON表达式)。此外......
  • SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结
    目录1、SpringBoot的事务管理2、SpringBoot的异步任务3、SpringBoot定时任务调度4、SpringBoot整合Mail发送邮件5、Spring框架中的Bean的作用域6、Spring框架中的Bean的线程安全7、Spring框架中的Bean生命周期8、Spring框架如何解决循环依赖?9、Spring框架中有哪些注......
  • Day30 贪心算法part4
    目录任务452.用最少数量的箭引爆气球思路435.无重叠区间思路763.划分字母区间思路任务452.用最少数量的箭引爆气球有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组points,其中points[i]=[xstart,xend]表示水平直径在xstart和xend之间的......
  • 在K8S中,Pod多副本配置了硬亲和性,会调度到同⼀个节点上吗?
    在K8S(Kubernetes)中,Pod多副本配置硬亲和性(podAffinity的requiredDuringSchedulingIgnoredDuringExecution)时,并不意味着这些Pod一定会被调度到同一个节点上。硬亲和性的配置实际上是指定了Pod调度时必须满足的严格条件,但这些条件通常与Pod之间的相对位置(如是否在同一个节点、区域或......
  • 以定时器为例研究一手 Python asyncio 的协程事件循环调度
    在使用Python的asyncio库实现异步编程的过程中,协程与事件循环这两个概念可以说有着千丝万缕的联系,常常是形影不离的出现,如胶似漆般的存在,asyncio库到底是如何调度协程的?下面以Python3.8中的asyncio.sleep定时器为例研究一手asyncio的源码实现。几个主要的概念首先......
  • 操作系统-进程创建、同步与锁、通信、调度算法-学习笔记
    1.进程的基础概念1.1进程是什么?定义:进程是操作系统管理的一个程序实例。它包含程序代码及其当前活动的状态。每个进程有自己的内存地址空间,拥有独立的栈、堆、全局变量等。操作系统通过进程来分配资源(如CPU时间、内存等)并管理任务的执行。进程vs程序:程序:静态的代......
  • 日前、日内两阶段需求响应热电综合能源联合调度研究(Matlab代码实现)
    ......