独立任务的最优调度问题(动态规划)

这篇具有很好参考价值的文章主要介绍了独立任务的最优调度问题(动态规划)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述:

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

算法讲解:

 一、首先,搞懂p是干嘛的,二维数组p存储的内容到底是什么

1、p数组的列坐标k记录n个作业,横坐标t是a机器单独处理所需要的时间 *

2、p数组元素值来记录加上b机器后,每次添加一个作业后,在a机器单独处理的每个时刻上加上b后的最优解 

3、p数组是一列一列更新的,即每次增加一个作业,在不同的时间下,b机器的最优用时 *

二、所以每次更新的值就是两种情况:

 1、新加入的k作业,当用时t<a[k]时,说明此时a机器根本无法处理k,只能是b来处理,所以就是直接更新p[t][k]的值为p[t][k-1]+b[k]; *

2、新加入的k作业,t>=a[k]时,此时a机器有直接处理k的能力,所以就要进行比较,比较的双方就是

 (1)a不处理k,b接着在t时刻,k-1次作业后继续处理k(也就是情况1) p[t][k]=p[t][k-1]+b[k];

 (2)a处理k,b此时的值就直接继承:a处理k用时后的剩余时间(t-a[k]),对应的前k-1个作业的用时 p[t][k]=p[t-a[k]][k-1]; *

三、动态更新完p数组之后,我们就得到了最后一列的值 

1、横坐标t结合数组内元素值p[t][n]分别是t时间内a机器单独处理用时 和b机器在a机器处理的基础上最优用时 ,说白了就是横坐标t就是a单独处理a的用时,p内值就是a、b并行工作后b的最优用时 2、分别比较每一行的两个数值,记录每一行的最大值,用一个变量min记录所有最大值的最小值,就得到了最优解

研究一个实例:(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。

(给张图片,Excel搞的,没画完,只画了前三列,不过应该已经足够你理解了,竖着一列一列的画,最重要的还是搞懂p里面记录的到底是什么,横坐标t到底是什么)

独立任务最优调度问题,动态规划,算法 

 代码如下:

#include<bits/stdc++.h>
using namespace std;
#define MAXTIME 500
int p[MAXTIME][MAXTIME];

int Dynamic(int a[],int b[],int n){
    int aTime = 0;//作业仅在机器a上运行是所需要的时间
    for(int k = 1;k<=n;k++){//从1开始,到n,方便操作
        aTime += a[k];//记录此时a机器单独操作需要的最大时间
        for(int t = 0;t<=aTime;t++){//一列一列的更新
            if(t<a[k]){//此时时间条件不允许a单独处理k
                p[t][k]=p[t][k-1]+b[k];//此处p元素值直接是b处理完k-1后继续处理k
            } else{//此时时间条件允许a处理新加入的k,进行比较
                p[t][k]=p[t-a[k]][k-1]>p[t][k-1]+b[k]?p[t][k-1]+b[k]:p[t-a[k]][k-1];
            }
        }
    }
    int minTime = 999999;
    for(int t = 0;t<aTime;t++){
        int maxt = max(t,p[t][n]);//找到每个时间段对应的两者的最大值
        minTime = minTime>maxt?maxt:minTime;//minTime每次更新,记录最小值
    }//说白了就是横坐标t就是a单独处理a的用时,p内值就是a、b并行工作后b的最优用时
    //在考虑到所有作业时,比较最后一列每一行两者的大小就能得到最优用时
    return minTime;
}
int main(){
    int n;//n个作业
    cin >> n; //读入作业个数
    int a[n+1];
    int b[n+1];
    for(int i=1;i<=n;i++)//读入机器A运行时间
        cin >> a[i];
    for(int i=1;i<=n;i++)//读入机器B运行时间
        cin >> b[i];
    int minTime = Dynamic(a,b,n);
    cout << minTime;
    return 0;
}
/*
 * 算法描述:
 * 一、首先,搞懂p是干嘛的,二维数组p存储的内容到底是什么
 * 1、p数组的列坐标k记录n个作业,横坐标t是a机器单独处理所需要的时间
 * 2、p数组元素值来记录加上b机器后,每次添加一个作业后,在a机器单独处理的每个时刻上加上b后的最优解
 * 3、p数组是一列一列更新的,即每次增加一个作业,在不同的时间下,b机器的最优用时
 * 二、所以每次更新的值就是两种情况:
 * 1、新加入的k作业,当用时t<a[k]时,说明此时a机器根本无法处理k,只能是b来处理,所以就是直接更新p[t][k]的值为p[t][k-1]+b[k];
 * 2、新加入的k作业,t>=a[k]时,此时a机器有直接处理k的能力,所以就要进行比较,比较的双方就是
 *   (1)a不处理k,b接着在t时刻,k-1次作业后继续处理k(也就是情况1)  p[t][k]=p[t][k-1]+b[k];
 *   (2)a处理k,b此时的值就直接继承:a处理k用时后的剩余时间(t-a[k]),对应的前k-1个作业的用时 p[t][k]=p[t-a[k]][k-1];
 * 三、动态更新完p数组之后,我们就得到了最后一列的值
 * 1、横坐标t结合数组内元素值p[t][n]分别是t时间内a机器单独处理用时 和b机器在a机器处理的基础上最优用时
 *    说白了就是横坐标t就是a单独处理a的用时,p内值就是a、b并行工作后b的最优用时
 * 2、分别比较每一行的两个数值,记录每一行的最大值,用一个变量min记录所有最大值的最小值,就得到了最优解
*/

运行结果如下:

独立任务最优调度问题,动态规划,算法 

 文章来源地址https://www.toymoban.com/news/detail-756070.html

到了这里,关于独立任务的最优调度问题(动态规划)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高等工程数学 —— 第五章 (2)非线性规划的最优条件

    无约束规划问题的最优性条件 简单说就是先用一阶必要条件求驻点,再用二阶充分条件来验证。 其实就是一阶导数为0然后解未知量的值 这里的Hesse矩阵如下: 再简单说说判断矩阵是否正定的两种方法: 求出A的所有特征值。若A的特征值均为正数,则A是正定的;若A的特征值

    2024年02月03日
    浏览(44)
  • 【最优化算法】基于【MATLAB】的最速下降仿真

    无约束问题的求解过程一般都是通过一系列的一维搜索来实现,搜索方向的不同,形成了不同的最优化方法。这篇文章从最速下降法入手,来进行搜索。 最速下降法又叫梯度法,通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。如果我们需要求解损

    2024年02月05日
    浏览(44)
  • Floyd算法实现实际问题——18个城市间最优路线规划

    离散数学大作业   —— 利用Floyd算法计算两城市间最优路径及距离   代码在最下面 一. 提出问题 在交通网络非常发达、交通工具和交通方式不断更新的今天,人们在出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需要的时间等问题也感兴趣。对于这样

    2024年02月10日
    浏览(38)
  • 11.动态规划:树形DP问题、树上最大独立集、树上最小支配集、换根DP、树上倍增(LCA)【灵神基础精讲】

    回溯和树形DP的区别(什么时候需要return结果?):对于回溯,通常是在「递」的过程中增量地构建答案,并在失败时能够回退,例如八皇后。对于递归,是把原问题分解为若干个相似的子问题,通常会在「归」的过程中有一些计算。如果一个递归能考虑用记忆化来优化,就

    2024年02月04日
    浏览(41)
  • 基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)

    目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量(解析法) 2.3 使用 GA 进行最佳功率因数确定和 DG 分配  3 仿真结果与讨论  3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真  4 结论 为了使系统网损达到最低值,人们提出了多种方法来确定分布式发电机

    2024年02月15日
    浏览(42)
  • 使用C语言构建一个独立栈协程和共享栈协程的任务调度系统

    使用了标准库头文件 setjmp.h 中的 setjmp 和 longjmp 两个函数,构建了一个简单的查询式协作多任务系统,支持 独立栈 和 共享栈 两种任务。 其中涉及到获取和设置栈的地址操作,因此还需要根据不同平台提供获取和设置栈的地址操作(一般是汇编语言,因为涉及到寄存器) 该

    2024年02月19日
    浏览(51)
  • 动态规划(dp)-最优路径

    蒜头君要回家,已知蒜头君在 左下角(1,1)位置,家在 右上角(n,n)坐标处。蒜头君走上一个格子就会花费相应体力,而且蒜头君只会往家的方向走,也就是只能往上,或者往右走。蒜头君想知道他回到家需要花费的最少体力是多少。 例如下图所示,格子中的数字代表走上该格子

    2024年04月24日
    浏览(43)
  • 动态规划:最优二叉搜索树

    给定一个序列 有n个有序且各不相同的键, 集合 表示在K中成功的搜索的概率; 为n+1 个不同的哑键,表示所有在和 之间的值, 表示不成功的搜索的概率. 创建二叉搜索树, 使得其期望搜索花费最小。 如果一棵最优二叉搜索树T的子树T’含有键那么这个子树T’肯定是子问题键

    2024年01月20日
    浏览(51)
  • 最优控制理论 九、Bellman动态规划法用于最优控制

    尽管DP也是最优控制理论的三大基石之一,但长久以来,动态规划法(Dynamic Programming)被认为只能在较少控制变量的多阶段决策问题中使用,维数灾难使他不可能搜索得了整个连续最优控制问题的高维状态空间,因此仍然只能在一些维数较低的离散决策变量最优选择中取得较好

    2024年02月01日
    浏览(48)
  • 【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

    视频算法专题 动态规划汇总 广度优先搜索 状态压缩 存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中,graph[i] 是一个列表,由所有与节点 i 直接相连的节点组成。 返回能够访问所有节点的最短路径的长度。你可

    2024年01月23日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包