首页 > 编程语言 >贪心算法——多机调度问题

贪心算法——多机调度问题

时间:2024-04-04 20:32:49浏览次数:29  
标签:count 机器 cout int 任务 算法 num 多机 贪心

问题描述

下面用一道2013上半年软件设计师的软考题来说明这个问题。

      设有 M 台完全相同的机器运行 N 个独立的任务(任务不可分割),运行任务 i 所需要的时间为t_{i}要求确定一个调度方案,使得完成所有任务所需要的时间最短,任务运行时独占机器。

      这里要求定义的变量如下,所有数组的下标皆从0开始:

      设m是机器数,n 是任务数,t[ ] 的长度为 n,其中每个元素表示各个任务的运行时间。

      s[ ][ ]长度为 mn,下标从0开始,其中 s[ i ][ j ] 表示机器 i 运行的任务 j 。

      d[ ]长度为 m,其中 d[ i ]表示机器i运行的时间。

      count[ ]长度为 m,其中元素 count[ i ] 表示机器i运行 的任务数。

      max 为完成所有任务的时间。min,i,j,k 为临时定义变量,无意义。

输入样例

机器数:5

任务数:7

每个任务的运行时间(从大到小):16   14   6   5   4   3   2

输出样例

完成所有任务需要的时间为:16
各个机器执行的耗时一览:
机器0: 16
机器1: 14
机器2:  6
机器3:  5   2
机器4:  4   3

运行截图 

#include <iostream>
using namespace std;
void schedule(int m, int n, int t[]) {
    int i, j, k, max = 0;//i表示机器编号,j表示任务,max表示机器最大运行时间
    int d[100], s[100][100], count[100];
    for (i = 0; i < m; i++) {//循环设置s数组和d数组
        d[i] = 0;
        for (j = 0; j < n; j++) {
            s[i][j] = -1;//-1代表不执行任何任务,不与0号任务混淆
        }
    }
    /*机器数大于任务数*/
    if (m > n) {
        cout << "完成所有任务需要的时间:" << t[0] << endl;
        for (i = 0; i < m; i++) { // 循环输出机器执行的耗时
            s[i][0] = i;// 判断是否有任务运行
            d[i] += t[i];//运行时间
        }
        cout << "各个机器执行的耗时一览:" << endl;
        for (i = 0; i < m; i++) {
            if (i + 1 > n) {
                cout << "机器" << i << ":没有任务运行!" << endl;
            }
            else {
                cout << "机器" << i << ":" << t[i] << endl;
            }
        }
    }
    /*任务数大于机器数*/
    else {//分配前m个任务,必然是每个机器先分别接受1个任务
        for (i = 0; i < m; i++) {
            s[i][0] = i;
            d[i] += t[i];//累计运行时间
            count[i] = 1;//计数
        }
        /*判断哪个机器任务耗时最少,让其接受任务,尽可能地并行、平均分配任务,使得每台机器最后的运行时间接近*/
        for (i = m; i < n; i++) {
            int min = d[0];
            k = 0;
            for (j = 1; j < m; j++) {//确定空闲机器,实质是在求当期任务总时间最少的机器
                if (min > d[j]) {
                    min = d[j];
                    k = j;//机器k空闲
                }
            }
            s[k][count[k]] = i;//在机器k的执行队列添加第i号任务
            count[k] += 1;//机器k的任务数+1
            d[k] += t[i];//机器k的任务执行时间+t[i],也就是+第i号任务的耗时
        }
        for (i = 0; i < m; i++) {//确定完成所有任务需要的时间,实质是求分配完所有任务之后耗时最多的机器的运行时间
            if (max < d[i]) {
                max = d[i];
            }
        }
        cout << "完成所有任务需要的时间:" << max << endl;
        cout << "各个机器执行的耗时一览:" << endl;
        for (i = 0; i < m; i++) {
            cout << "机器" << i << ":";
            for (j = 0; j < n; j++) {
                if (s[i][j] == -1) {
                    break;
                }
                cout << t[s[i][j]] << "\t";
            }
            cout << endl;
        }
    }
}
int main() {
    int num_t, num_mach;//任务数,机器数
    cout << "请输入机器数num_mach:";
    cin >> num_mach;
    cout << "请输入任务数num_t:";
    cin >> num_t;
    int* time = new int[num_t];//使用动态内存分配声明时间数组来表示各个任务的执行所需时间
    cout << "请输入任务所需执行时间(从大到小):";
    for (int i = 0; i < num_t; i++) {
        cin >> time[i];
    }
    schedule(num_mach, num_t, time);
    delete[] time;  // 释放动态分配的内存
    return 0;
}

标签:count,机器,cout,int,任务,算法,num,多机,贪心
From: https://blog.csdn.net/weixin_63131750/article/details/137381326

相关文章

  • 蓝桥杯算法题:开心
    https://www.lanqiao.cn/problems/3824/learningeg:n=1234,k=2可以简单的列出这些选项:●1+2+34●1+23+4●12+3+4利用DFS和回溯的思想,程序推导如下:将n分成左右两部分,l表示left左侧的值,r表示right右侧的值。先将l加入res,再将r作为新的n......
  • 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调
    一、问题:1.当系统采用短进程优先调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间2.当系统采用优先权调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间  二、参考答案上面是短进程优先调度算法下面是优先权调度算法 ......
  • 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调
    一、问题:有5个进程A、B、C、D、E,他们的到达时间分别为0,10,20,30,35ms,预计他们的运行时间分别为100、60、20、40、80ms。其优先数分别为3、1、4、5、2(优先级数值越小,表示优先级越高)。要求1.分别给出采用短进程优先调度算法、非抢占式优先权调度算法时,进程的启动顺序2.分别计算上......
  • Python常用算法思想--递归算法思想详解【附源码】
    递归算法能够重复性的将问题分解为同类的子问题,然后解决这些子问题,最终达到解决最开始的问题为目的。以下从解决“阶乘”问题、“汉诺塔”问题、“斐波那契数列”问题、“最大公倍数和最小公约数”问题、“小球弹跳”、“深度优先”与“广度优先”问题等六个经典递归算法的案例......
  • 文心一言 VS 讯飞星火 VS chatgpt (229)-- 算法导论16.5 2题
    二、说明如何利用引理16.12的性质2在O(|A|)时间内确定一个给定任务集合A是独立的。文心一言:引理16.12的性质2可能是指某个特定引理中关于任务集合独立性的一个性质。由于具体的引理内容没有给出,我将基于任务集合独立性的通用概念来提供一个一般性的解释。任......
  • 算法绘本-选择排序
    选择排序也是一种比较简单的排序方式,其原理是在给定的一系列值中,首先找出最小的值放在第一位,然后在剩下的值中找出最小的值放在第二位,以此类推,直到剩下的值只有一个的时候,则完成了排序。下面看一个例子,假设给定一组数字3,2,8,2,4,9,1首先是第一轮,假设第一个数字3为最小值,记录下......
  • 算法 哈希表 day03
    哈希表当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。牺牲了空间换取了时间当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。数组set(集合)map(映射)第一题:242.有效的字母异位词-力扣(LeetCode)//暴力publicstaticboo......
  • deepspeed学习-多机all_reduce
    deepspeed学习-多机all_reduce一.安装nvidia-docker二.构建容器1.创建容器2.更新apt源3.安装依赖4.安装cuda12.1(编译deepspeed需要)5.设置ssh端口和密码(为避免跟hostsshd冲突,修改了容器里sshd端口)6.运行sshd服务7.安装pytorch8.测试nccl9.安装deepspeed10.退出容器......
  • 操作系统综合题之“采用时间片轮转调度算法(Round-Robin,RR)执行,分时系统中的进程可能出
    一、问题:某分时系统中的进程可能出现下图所示的状态变化,请回答下列问题:1.根据图示,您认为该系统采用的是什么进程调度策略?2.把图中所示的每一个状态变化的原因填在下表相应位置。变化原因1 2 3 4 5 6 二、参考答案答:1.时间片轮转调度......
  • 【信号处理】基于期望最大化算法EM的最大似然递归状态估计附matlab代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......