首页 > 其他分享 >独立任务最优调度问题-动态规划

独立任务最优调度问题-动态规划

时间:2023-05-25 17:03:06浏览次数:33  
标签:机器 temp min int 作业 调度 处理 最优 动态


问题描述:

用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>bi,而对于某些j,j≠i,有aj>bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例:

(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。

对于给定的2台处理机A和B处理n个作业,找出一个最优调度方案,使2台机器处理完这n个作业的时间最短。

思路:

首先要注意每个作业仅需要处理一次就行,不需要被机器A和B各处理一遍

采用动态规划;

定义F[i][j]为:表示完成i个作业且机器A花费j时间的条件下机器B所花费时间的最小值,那么F[i][j] = min{F[i - 1][j] + b[i], F[i - 1][j - a[i]]}。解释一下:

假设前i - 1件已经被处理了,那么第 i 件作业由谁来处理呢?
可以分两种情况:
1:由机器A处理i,则机器B的时间为 F[i - 1][j - a[i]];
2:由机器B处理i,则机器B的时间为 F[i - 1][j] + b[i];

特殊情况:如果j < a[i],则不可能由机器A来完成,此时F[i][j] = F[i - 1][j] + b[i];

最终F[i][j] 选择 1 和 2 中较小的一个,即F[i][j] = min{F[i - 1][j] + b[i], F[i - 1][j - a[i]]}。

代码:

#include <bits/stdc++.h>
using namespace std;
int n;
int time_a = 0; //最终的时间一定小于time_a, 即 min_t < time_a
int min_t = 0x3f3f3f;
int a[1024];
int b[1024];
int F[1024][1024];
void inPut()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
    {
     scanf("%d", &a[i]);
     time_a += a[i];
    }
    for(int i = 1; i <= n; ++i)
        scanf("%d", &b[i]);

}
void solve()
{
    memset(F, 0, sizeof(F));
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 0; j <= time_a; ++j)
        {
            if(j > a[i])
            {
                F[i][j] = min(F[i - 1][j - a[i]], F[i - 1][j] + b[i]);
            }
            else
            {
                F[i][j] = F[i - 1][j] + b[i];
            }
        }
    }
    int temp;
    for(int i = 0; i <= time_a; ++i)
    {
        temp = max(F[n][i], i);
        if(min_t > temp)
            min_t = temp;
    }
}
int main()
{
    inPut();
    solve();
    printf("%d\n", min_t);
}

代码2:(路径压缩)

#include <bits/stdc++.h>
using namespace std;
int n;
int *a;
int *b;
int *t;
int sa = 0;
int result = 0x3f3f3f;
void outPut()
{
    int temp;
    for(int i = 0; i <= sa; ++i)
    {
        temp = i > t[i] ? i : t[i];
        if(result > temp)
            result = temp;
    }
    printf("the result is %d\n",result);
    delete []a;
    delete []b;
    delete []t;
}
void solve()
{
    t = new int[sa + 1];
    memset(t, 0, sizeof(t)); //t初始化为0
    for(int k = 0; k < n; ++k)
    {
        for(int i = sa; i >= 0; --i)
        {
            if(i >= a[k])
            {
                t[i] = min(t[i] + b[k], t[i - a[k]]);
            }
            else
            {
                t[i] = t[i] + b[k];
            }
        }
    }
}
void inPut()
{
    scanf("%d", &n);
    a = new int[n];
    b = new int[n];
    for(int i = 0; i < n; ++i)
    {
        scanf("%d", &a[i]);
        sa += a[i];
    }
    for(int i = 0; i < n; ++i)
        scanf("%d", &b[i]);

}
int main()
{
    inPut();
    solve();
    outPut();
}


         

标签:机器,temp,min,int,作业,调度,处理,最优,动态
From: https://blog.51cto.com/u_16129621/6350081

相关文章

  • 0-1背包问题详解-动态规划-两种方法
    问题描述:给定n种物品和一背包。物品i的重量为wi,其价值为vi,背包容量为c。问应如何选择装入背包中的物品,使得背入背包的物品的总价值最大?解析:此问题形式化的描述是,给定c>0,wi,vi,1<=i<=n(c为背包容量),要找出一个n元0-1向量(x1,x2,...,xn),xi ∈{0,1},1<=i<=n,使......
  • 流水调度问题-动态规划-Johnson法则-两种方法
    问题描述:n个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,后在M2上加工。在两台机器上加工的时间分别为ai和bi。 确定这n个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。 递归关......
  • SpringBoot中使用@Scheduled实现定时任务通过读取配置文件动态开关
    场景SpringBoot中定时任务与异步定时任务的实现:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/117083609上面讲的通过@Scheduled注解实现简单定时任务的方式。如果定时任务有多个,不同业务场景下需要动态配置某个定时任务的开关。可以通过@ConditionalOnPropert......
  • 动态远程桌面如何用来做爬虫
    爬虫需要动态IP主要是为了避免被目标网站封禁或限制访问。如果使用固定IP进行爬取,很容易被目标网站识别出来并封禁,导致无法继续爬取数据。而使用动态IP可以让爬虫在不同的IP地址之间切换,降低被封禁的风险。此外,动态IP还可以帮助爬虫绕过一些反爬虫机制,提高爬取效率。远程桌面VPS可......
  • Quartz.Net 调度器
    首先需要引入Quartz.Net的命名空间,例如: usingQuartz;usingQuartz.Impl;​然后创建一个调度器工厂(SchedulerFactory),并使用该工厂创建一个调度器(IScheduler)对象: ISchedulerFactoryschedulerFactory=newStdSchedulerFactory();ISchedulerscheduler=await......
  • 8、动态规划基础
    内容来自刘宇波老师玩转算法面试1、什么是动态规划/***斐波那契数列FibonacciSequence*F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)*/publicstaticintfib(intn){if(n<=1)returnn;returnfib(n-1)+fib(n-2);}2、第一个动态规划......
  • 【一文教你学会动态内存管理】
    1.为什么会存在动态内存分配?2.动态内存函数的介绍2.1malloc函数和free函数2.2calloc函数2.3realloc3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开辟空间的越界访问3.3对非动态开辟内存使用free释放3.4使用free释放一块动态开辟内存的一部分3.5对同一块动......
  • 【Spring从成神到升仙系列 一】2023年再不会动态代理,就要被淘汰了
    ......
  • 泛型是一种将类型参数化的动态机制,使用得到的话,可以从以下的方面提升的你的程序
    泛型是一种将类型参数化的动态机制,使用得到的话,可以从以下的方面提升的你的程序:安全性:使用泛型可以使代码更加安全可靠,因为泛型提供了编译时的类型检查,使得编译器能够在编译阶段捕捉到类型错误。通过在编译时检查类型一致性,可以避免在运行时出现类型转换错误和 ClassCastExcept......
  • 基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》
    在上一篇中构思了把查询子句描述出来的数据结构,那么能否用代码将其表达出来,如何表达呢?再次回顾考察,看下面的查询子句:Id>1andId<10如上所示,有两个独立的条件分别为Id>1和Id<10,用一个逻辑操作符and连接起来。再看下面这条,后面也是两个独立条件通过操作符or连接,并包在括号......