流水作业调度

简介:

流水作业调度问题
描述:
N个作业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。
M1和M2加工作业i所需的时间分别为ai和bi,1≤i≤n。流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在
机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
可以假定任何任务一旦开始加工,就不允许被中断,直到该任务被完成,即非优先调度。
输入:
输入包含若干个用例,第一行为一个正整数K(1<=K<=1000),表示用例个数,接下来K个用例,每个用例第一个为作业数N(1<=N<=1000),
接下来N行,每行两个非负整数,分别表示在第一台机器和第二台机器上加工时间。
输出:
每个用例用一行输出采用最优调度所用的总时间,即从第一台机器开始到第二台机器结束的时间。
样例输入:
1
4
5 6
12 2
4 14
8 7
样例输出:
33


算法描述:

1 令N1={i | ai < bi},N2={i | ai>=bi}

2 将n1中作业按ai的非减排序,n2 作业按bi非增排序

3 构成满足Johnson法则的最优调度

复制代码
#include <iostream>
#include <algorithm>
using namespace std;
class JOB
{
public:
    int key,index;
    bool job;
};
bool cmp(JOB a,JOB b)
{
    return a.key<b.key;
}
int func(int n,int a[],int b[],int c[])
{
    int i,j,k;
    JOB *d =new JOB[n];
    for(i=0;i<n;i++)
    {
        if(a[i]<b[i])
        {
           
            d[i].job =true;
            d[i].key =a[i];
        }
        else
        {
            d[i].job=false;
            d[i].key=b[i];
        }
        d[i].index=i;
    }
    sort(d,n+d,cmp);
    j=0,k=n-1;
    for(i=0;i<n;i++)
    {
        if(d[i].job ==true)
            c[j++]=d[i].index;
        else 
            c[k--]=d[i].index;
    }
    j=a[c[0]];
    k=j+b[c[0]];
    for(i=1;i<n;i++)
    {
    j=j+a[c[i]];
    k= j<k ? k+b[c[i]] : j+b[c[i]] ;
    }
    delete d;
    return k;
}
int main()
{
    int i,n,m,a[100],b[100],c[100];
    cin>>n;
    while(n--)
    {
        cin>>m;
        for(i=0;i<m;i++)
        {
            cin>>a[i];
            cin>>b[i];
        }
        cout<<func(m,a,b,c)<<endl;
    }
    return 0;
}
复制代码

运行结果:

本文转自博客园xingoo的博客,原文链接:流水作业调度,如需转载请自行联系原博主。
相关文章
|
4月前
|
调度
Dataphin中重跑与强制重跑的区别
本文主要解析了Dataphin产品中重跑与强制重跑的区别及运行原理,推荐用户根据不同的场景选择适合的操作。
|
12月前
|
监控 算法 安全
作业管理
一、作业管理 作业管理是操作系统中的一个重要功能,它负责对计算机系统中的作业进行调度和管理,以提高系统的利用率和效率。作业管理涉及到作业的提交、调度、执行和完成等过程。 作业管理的主要任务包括: 1. 作业提交:用户将自己编写的程序和相关的数据提交给操作系统,以便进行后续的处理和执行。作业提交可以通过命令行界面、图形界面或者其他方式进行。 2. 作业调度:作业调度是指根据一定的调度算法,从作业队列中选择一个或多个作业并分配给可用的处理器进行执行。作业调度的目标是提高系统的吞吐量、响应时间和资源利用率。 3. 作业执行:作业执行是指将作业加载到内存中,并由处理器执行作业中的指令。作业执行需要进行
112 0
|
4月前
|
数据采集 分布式计算 DataWorks
DataWorks产品使用合集之如何控制周期业务流程的并发执行
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
38 1
|
5月前
|
DataWorks
DataWorks的周期业务流程怎么设置并发?
【1月更文挑战第25天】【1月更文挑战第121篇】DataWorks的周期业务流程怎么设置并发?
50 0
|
运维 测试技术
千万级乘客排队系统重构&压测方案——总结篇
千万级乘客排队系统重构&压测方案——总结篇
162 1
|
12月前
|
运维 数据挖掘 BI
【Dataphin运维】解放双手,支持补数据任务定时调度和手动运行,轻松实现回刷历史数据
Datatphin V3.11版本全新上线补数据任务功能,支持将单次补数据保存为补数据任务,保存补数据节点范围及运行规则;支持补数据任务定时调度,自动定期回刷历史数据;支持手动运行补数据任务。满足企业复杂多样的回刷历史数据的需求,减少人工操作成本。
230 0
|
资源调度 运维 监控
如何通过任务调度实现百万规则报警
报警是一个公司的日常需求,常见的形态除了满足运维过程中的基础设施监控报警(CPU/内存/磁盘等)之外,部分公司也会在应用指标(如 QPS、RT 等)及业务指标(如 GMV/日活 等)上有相应的报警需求。
3971 4
如何通过任务调度实现百万规则报警
|
存储 Java 调度
定时任务的调度问题
定时任务的调度问题
|
消息中间件 SQL 监控
ETL的灵魂:调度系统
ETL的灵魂:调度系统
2502 1
|
数据采集 SQL 存储
整体技术流程-数据入库(ETL)|学习笔记
快速学习整体技术流程-数据入库(ETL)
1088 1
整体技术流程-数据入库(ETL)|学习笔记