独立任务最优调度
算法设计与分析的实验报告

实验一递归与分治策略一、实验目的1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。
二、实验内容1、①设a[0:n-1]是已排好序的数组。
请写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。
当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
②写出三分搜索法的程序。
三、实验要求(1)用分治法求解上面两个问题;(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)1、已知a[0:n-1]是一个已排好序的数组,可以采用折半查找(二分查找)算法。
如果搜索元素在数组中,则直接返回下表即可;否则比较搜索元素x与通过二分查找所得最终元素的大小,注意边界条件,从而计算出小于x的最大元素的位置i和大于x的最小元素位置j。
2、将n个元素分成大致相同的三部分,取在数组a的左三分之一部分中继续搜索x。
如果x>a[2(n-1)/3],则只需在数组a的右三分之一部分中继续搜索x。
上述两种情况不成立时,则在数组中间的三分之一部分中继续搜索x。
五、实验结果分析二分搜索法:三分搜索法:时间复杂性:二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为O(log n)。
(n代表集合中元素的个数)三分搜索法:O(3log3n)空间复杂度:O(1)。
六、实验体会本次试验解决了二分查找和三分查找的问题,加深了对分治法的理解,收获很大,同时我也理解到学习算法是一个渐进的过程,算法可能一开始不是很好理解,但是只要多看几遍,只看是不够的还要动手分析一下,这样才能学好算法。
七、附录:(源代码)二分搜索法:#include<iostream.h>#include<stdio.h>int binarySearch(int a[],int x,int n){int left=0;int right=n-1;int i,j;while(left<=right){int middle=(left+right)/2;if(x==a[middle]){i=j=middle;return 1;}if(x>a[middle])left=middle+1;else right=middle-1;}i=right;j=left;return 0;}int main(){ int a[10]={0,1,2,3,4,5,6,7,8,9};int n=10;int x=9;if(binarySearch(a,x,n))cout<<"找到"<<endl;elsecout<<"找不到"<<endl;return 0;}实验二动态规划——求解最优问题一、实验目的1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。
指令调度名词解释__概述说明以及解释

指令调度名词解释概述说明以及解释1. 引言1.1 概述在计算机领域,在执行指令的过程中,指令调度起着重要的作用。
指令调度是操作系统对CPU处理器进行任务分配和进程管理的关键部分。
它通过合理安排和调度进程的执行顺序,可以提高CPU利用率、降低响应时间,并改善系统性能。
1.2 文章结构本文将首先对指令调度进行名词解释,包括定义、功能和作用,分类和特点等方面进行详细说明。
接着,将概述指令调度的背景与重要性,探讨其执行流程和原则,并介绍常见的调度算法及其评估标准。
然后,将解释指令调度的关键要点,包括就绪队列管理与进程优先级划分策略、时间片轮转算法以及抢占式调度策略等内容。
最后,在结论部分总结主要观点和结论,展望指令调度的发展前景和未来研究方向,并提出存在问题并给予建议。
1.3 目的本文旨在全面解释和说明指令调度相关的核心概念和原理,并深入分析其功能、作用以及应用场景。
通过本文的阐述,读者可以了解指令调度的重要性、优化策略和算法,并对当前的研究热点和未来发展进行展望。
同时,通过指出存在的问题并提供建议,为进一步研究和改善指令调度提供参考。
2. 指令调度名词解释2.1 定义:指令调度是操作系统中的一个重要概念,它是指根据一定的策略将处于就绪状态的进程分配给处理器执行的过程。
具体而言,指令调度负责选择哪个进程将被优先执行以及在多个进程竞争处理器时如何进行调度。
2.2 功能和作用:指令调度的主要功能是合理安排系统资源,提高计算机处理效率。
通过合适地安排进程之间的执行顺序,可以充分利用CPU,并确保各个进程得到公平的机会使用处理器。
同时,指令调度也能够有效地响应用户请求,并保证每个进程都能及时得到运行并完成任务。
2.3 分类和特点:根据不同的需求和策略,指令调度可以分为多种类型。
常见的几种调度算法包括先来先服务(First-Come-First-Served)、短作业优先(Shortest Job First)、最高优先权(Highest Priority)和时间片轮转(Round Robin)等。
一种独立任务的同型机调度快速算法

越 短 , 资 源 利 用 率就 越 高 . 独 立 任 务 的 多 机 调 度 问题 常 总 完 成 时 间最 短 为 目标 函数 . 总 因此
独 立 任 务 的 多 机 调 度 使 总完 成 时 间 最 短 的 问题 是 一 个 NP难 题 …, 可 能 存 在 多 项 式 时 间 复杂 度 的 算法 以 不 找 到 全 局 最 优 解 但 在 实 际 的 生 产 调 度 中 即便 是 近 似 最 优 解 也 能 缩 短工 期 、 降 低 成 本 或 减 少 拖 期 惩 罚. 也 是 这 企 业 追 求 的 目标 对 于 这 类 问题 按 照 初 始 时 刻 所 有 机 器 的 是 否 都 空 闲 分 为 :MS (i l a o smut rc so S P smut e u lp o es r a i sh d f g po lm) NI S (o s l n ol mut rc so c e u ig po lm) 决 NMS c e u o rbe 和 v P n n i t e l l p o es rsh d l rbe 解 l l mu a t S i n P的 多项 式 复 杂度 的 寻 找 近 似 最 优 解 的 算 法 一 大 多 是 改 进 解 S P 的 算 法 ; 目前 较 典 型 的 解 S P 的 算 法 有 : T 1n e t MS 而 MS LP ( g s o
维普资讯
10. 2t 0t ( )82 6 009 5 02 3 4 1. 8 2 10 0 0
 ̄ 02 or lf o w r 软 件 学 报 20 u ao Sf a J n t e
v!! N _ o !. o . 4
一
种 独 立 任 务 的 同 型 机 调 度 快 速 算 法
如何定义某任务的优先级

如何定义某任务的优先级学号:SA13217009 姓名:朱苗苗一,任务的优先级调度法在实时任务调度中,调度策略中使用最多的是优先级调度法。
当实时任务到达时,指派一个优先级,进入任务队列。
在任务队列中,优先级最高的任务排在第一位,由高到低顺序排列。
优先级调度法主要有单调速率算法、截止期最早最优先(earliest deadline first,简称EDF)、空闲时间最短最优先(least slack first,简称LSF)、最早放行最优先、可达截止期最早最优先、价值最高最优先、价值密度最大最优先等策略,其中,EDF和LSF是讨论最为广泛的两种策略。
二,任务优先级的确定任务的优先级通常由任务的一个或多个特征参数来确定,如截止期、空闲时间或关键性(任务的重要程度)等.如果优先级仅仅是由某个特征参数来确定是不够的,如EDF策略将最高优先级指派给具有截止期最早的任务,LSF策略将最高优先级指派给具有空闲时间最短的任务。
因为截止期短的任务不一定是非常关键的,其空闲时间也不一定短,反之亦然,所以需要研究至少利用两个特征作为任务的独立特征参数,建立任务优先级与这些特征参数之间的、一对一的对应关系。
目前的许多研究比较集中在综合关键性与截止期这两个任务属性上,如关键性-截止期优先(基于相对截止期与关键性之比值来分配优先级)和加权的最早截止期价值密度优先。
有很多嵌入式实时操作系统一般都是支持优先级的抢占式操作系统。
它们的根本特点就是一旦某个高优先级的任务就绪就可以马上获得CPU资源得以运行。
任务优先级的安排在这类型操作系统中非常关键。
如果任务调度是基于优先级的,任务必须是可阻塞的。
一个非阻塞的任务会使比它优先级低的任务永远得不到运行机会。
在优先级的安排上,如果两个任务无任何关系,赋予运行时间短(从运行到阻塞)或者运行频率低的任务更高的优先级,这样会使整个系统中的任务的平均响应时间最短。
对于单向任务间通信的两个任务,一般赋予接收消息或信号量的任务更高的优先级。
任务分片方案

任务分片方案任务分片方案是指将一个大型任务或工程分解成若干个小的子任务或子工程,并按照一定的规则和策略对这些子任务或子工程进行分配、调度和执行的方案。
在实际的项目管理和工程实施中,任务分片方案能够有效地提高工作效率、优化资源利用、降低风险,并且有利于任务的分解和组织。
本文将从任务分片的目的、方法、原则以及实际应用等方面进行探讨,希望能够为相关工程管理人员提供一定的参考和借鉴。
一、任务分片的目的任务分片的根本目的是为了有效地组织和管理大型任务或工程,将庞大的任务分解成小的可控单元,以便更好地对任务进行调度和分配,并最终完成整个任务。
任务分片的目的主要包括以下几个方面:1. 提高工作效率:通过合理地划分任务,可以将大型任务转化为小任务,各部分相对独立,有利于任务并行执行,提高工作效率。
2. 降低风险:分片后的任务规模小,风险控制更加可控。
一旦某一部分任务出现问题,可以通过调整该部分任务的资源和进度,降低对整体任务的影响。
3. 优化资源利用:任务划分后,可以更加合理地分配资源,充分利用各种资源,提高资源利用效率,降低成本。
4. 便于监控和评估:任务分片后,各个子任务可以独立进行监控和评估,及时发现问题并采取相应措施,有利于保障任务进度和质量。
二、任务分片的方法任务分片主要有自顶向下法和自底向上法两种方法。
自顶向下法是指先将整体任务分割成若干个子任务,再对子任务分解成更小的可控单元,一直到能够直接指派给执行者的最小单元为止。
自底向上法则是从具体的任务和操作出发,逐级聚集,最终形成一个大的任务或工程。
在实际应用中,一般需要根据具体的项目特点和任务要求,灵活运用自顶向下和自底向上相结合的方法,综合考虑任务复杂性、执行难度和资源投入等因素,确定合适的任务分片方法。
三、任务分片的原则在制定任务分片方案时,应遵循以下几项原则:1. 单一责任原则:每个子任务应该有一个明确的、独立的责任。
一个子任务不应该包含多个独立的职责。
并行机下独立任务调度的无秩序代价分析

21 00年 5月
管
理
科
学
学
报
V 1 1 . 0 . 3 No 5 Ma 0 0 v2 1
J URNA F MAN O LO AGE ME CI NT S ENC S I E N CHI NA
并 行 机 下 独 立 任 务 调 度 的 无 秩 序 代 价 分 析①
的低 效 率 , 而 导 致 系 统 全 局 目标 的 恶化 . 献 从 文 [] 1 最早提 出无 秩 序 代价 ( r eo n rh , O pi f ac y P A) c a 的概 念来 定量描 述竞争 可导致 的最 差全 局结 果 和 系统期望 的最优 全 局结 果 之 问 的关 系 , 即博弈 理 论所 阐述 的个体 理性 与集 体 理性 的 冲突程 度 . 由 于反 映个体 理性 的 N s q ibim( E) 结 果 ahE ul r i u N
标 , 网络 系统 的 目标 则 是平 衡 每 条 网络 通 道上 而 的通 信数 据负荷 . 义 了 自利 客 户 竞 争资 源 的混 定
合 N 定 量分析 了 P A 文献 [ 0 首 先通 过一 个 E, O. 1]
常常不 唯一 . 秩 序代 价 就 是 最 差 N 无 E结 果 与 反 映集体 理性 的全局 最 优 性 能之 间 的 比值 . 秩 序 无 代 价对 于分析 系统 特 性 , 研究 竞 争 中个 体 的策 略
作者简介 : 王长军( 96 ,男 , 17 ~) 安徽人 , 士,讲师.E l: ja g h .d .n 博 ma cw n@d u eu c l
第 5期
王长军等 : 行机下独立任务调度 的无秩 序代价分析 并
一 4 一 5
基于动态适应度的独立任务调度算法

王 秀 丽 , 正 元 宁
( 福建农林大学 计算机与信 息学院, 福建 福 州 3 00 ) 5 02
摘
( zf@1 6 cm ny n 2 .o ) 要: 在分析现有启发式调度算法的优缺点的基础上 , 综合考虑 负载平衡和使尽 可能 多的任务
ag rtm r d c sb t rrs t. lo h p o u e e t e u s i e l
Ke r s h trg n o sc mp t g sse ; n e e d n ak c e uig d n mi td ge ; nmu c mpein y wo d : eeo e e u o ui y tms id p n e tts s sh d n ; y a c f e re mii m o lt n l i o
维普资讯
第2 6卷第 l 期 2
20 0 6年 1 2月
文 章 编 号 :0 1 0 1 20 ) 2—30 0 10 —9 8 (0 6 1 0 1— 3
计 算机 应 用
Co u e p iai n mp tr Ap lc to s
Vo . 6 No 1 12 . 2
d srb d b akSDF c e . T e po oe lo tm s d DF s te p o t, a d te t k w t igs F W ecie yts ’ D sh ma h rp sd ag r h u e D a h r r y n h a i bge tD D a i ii s h s
竞争使用机器, 调度的任务是把这 n 个任务合理地分配到 m
调度到更适合 它的机器上 , 出了基 于动态适应度 ( F ) 提 D D 的调度 算法, 任务 的 D D描述 了最早 完成 F 时间所在机器对任务的适应程度 , 本算法以任务的 D D为优先级 , F 优先调 度 D D高的任务 与参考 F 文献 中其他算法进行 比较表明, 本算法能产生更好的调度结果。 关 键词 : 异构计 算 系统 ; 立任务 调度 ; 态适 应 度 ; 独 动 最早 完成 时 间
solutions

算法设计与分析课程实验与设计福州大学王晓东第1章算法概述算法实现题1-1 统计数字问题算法实现题1-2 字典序问题算法实现题1-3 最多约数问题算法实现题1-4 金币阵列问题算法实现题1-5 最大间隙问题第2章递归与分治策略算法实现题2-1 输油管道问题算法实现题2-2 众数问题算法实现题2-3 邮局选址问题算法实现题2-4 马的Hamilton周游路线问题算法实现题2-5 半数集问题算法实现题2-6 半数单集问题算法实现题2-7 士兵站队问题算法实现题2-8 有重复元素的排列问题算法实现题2-9 排列的字典序问题算法实现题2-10 集合划分问题算法实现题2-11 集合划分问题2算法实现题2-12 双色Hanoi塔问题算法实现题2-13 标准2维表问题算法实现题2-14 整数因子分解问题第3章动态规划算法实现题3-0 独立任务最优调度问题算法实现题3-1 最少硬币问题算法实现题3-2 序关系计数问题算法实现题3-3 多重幂计数问题算法实现题3-4 编辑距离问题算法实现题3-5 石子合并问题算法实现题3-6 数字三角形问题算法实现题3-7 乘法表问题算法实现题3-8 租用游艇问题算法实现题3-9 汽车加油行驶问题算法实现题3-10 最小m段和问题算法实现题3-11 圈乘运算问题算法实现题3-12 最大长方体问题算法实现题3-13 正则表达式匹配问题算法实现题3-14 双调旅行售货员问题算法实现题3-15 最大k乘积问题算法实现题3-16 最少费用购物算法实现题3-17 收集样本问题算法实现题3-18 最优时间表问题算法实现题3-19 字符串比较问题算法实现题3-20 有向树k中值问题算法实现题3-21 有向树独立k中值问题算法实现题3-22 有向直线m中值问题算法实现题3-23 有向直线2中值问题算法实现题3-24 树的最大连通分支问题算法实现题3-25 直线k中值问题算法实现题3-26 直线k覆盖问题算法实现题3-27 m处理器问题算法实现题3-28 红黑树的红色内结点问题第4章贪心算法算法实现题4-1 会场安排问题算法实现题4-2 最优合并问题算法实现题4-3 磁带最优存储问题算法实现题4-4 磁盘文件最优存储问题算法实现题4-5 程序存储问题算法实现题4-6 最优服务次序问题算法实现题4-7 多处最优服务次序问题算法实现题4-8 d森林问题算法实现题4-9 汽车加油问题算法实现题4-10 区间覆盖问题算法实现题4-11 硬币找钱问题算法实现题4-12 删数问题算法实现题4-13 数列极差问题算法实现题4-14 嵌套箱问题算法实现题4-15 套汇问题算法实现题4-16 信号增强装置问题算法实现题4-17 磁带最大利用率问题算法实现题4-18 非单位时间任务安排问题算法实现题4-19 多元Huffman编码问题算法实现题4-20 多元Huffman编码变形算法实现题4-21 区间相交问题算法实现题4-22 任务时间表问题算法实现题4-23 最优分解问题算法实现题4-24 可重复最优分解问题算法实现题4-25 可重复最优组合分解问题算法实现题4-26 旅行规划问题算法实现题4-27 登山机器人问题第5章回溯法算法实现题5-1 子集和问题算法实现题5-2 最小长度电路板排列问题算法实现题5-3 最小重量机器设计问题算法实现题5-4 运动员最佳匹配问题算法实现题5-5 无分隔符字典问题算法实现题5-6 无和集问题算法实现题5-7 n色方柱问题算法实现题5-8 整数变换问题算法实现题5-9 拉丁矩阵问题算法实现题5-10 排列宝石问题算法实现题5-11 重复拉丁矩阵问题算法实现题5-12 罗密欧与朱丽叶的迷宫问题算法实现题5-13 工作分配问题算法实现题5-14 独立钻石跳棋问题算法实现题5-15 智力拼图问题算法实现题5-16 布线问题算法实现题5-17 最佳调度问题算法实现题5-18 无优先级运算问题算法实现题5-19 世界名画陈列馆问题算法实现题5-20 世界名画陈列馆问题(不重复监视)算法实现题5-21 2´2´2魔方问题算法实现题5-22 魔方(Rubik’s Cube)问题算法实现题5-23 算24点问题算法实现题5-24 算m点问题算法实现题5-25 双轨车皮编序问题算法实现题5-26 多轨车皮编序问题算法实现题5-27 部落卫队问题算法实现题5-28 虫蚀算式问题算法实现题5-29 完备环序列问题算法实现题5-30 离散01串问题算法实现题5-31 喷漆机器人问题算法实现题5-32 子集树问题算法实现题5-33 0-1背包问题算法实现题5-34 排列树问题算法实现题5-35 一般解空间搜索问题算法实现题5-36 最短加法链问题算法实现题5-37 n2-1谜问题算法实现题6-1 最小长度电路板排列问题算法实现题6-2 最小长度电路板排列问题算法实现题6-3 最小权顶点覆盖问题算法实现题6-4 无向图的最大割问题算法实现题6-5 最小重量机器设计问题算法实现题6-6 运动员最佳匹配问题算法实现题6-7 n皇后问题算法实现题6-8 圆排列问题算法实现题6-9 布线问题算法实现题6-10 最佳调度问题算法实现题6-11 无优先级运算问题算法实现题6-12 世界名画陈列馆问题算法实现题6-13 子集树问题算法实现题6-14 排列树问题算法实现题6-15 一般解空间的队列式分支限界法算法实现题6-16 子集树问题算法实现题6-17 排列树问题算法实现题6-18 一般解空间的优先队列式分支限界法算法实现题6-19 骑士征途问题算法实现题6-20 推箱子问题算法实现题6-21 图形变换问题算法实现题6-22 行列变换问题算法实现题6-23 重排n2宫问题算法实现题6-24 最长距离问题算法实现题7-1 模平方根问题算法实现题7-2 素数测试问题算法实现题7-3 集合相等问题算法实现题7-4 逆矩阵问题算法实现题7-5 多项式乘积问题算法实现题7-6 皇后控制问题算法实现题7-7 3SAT问题算法实现题7-8 战车问题算法实现题7-9 圆排列问题算法实现题7-10 骑士控制问题算法实现题7-11 骑士对攻问题第8章线性规划与网络流算法实现题8-1 飞行员配对方案问题算法实现题8-2 太空飞行计划问题算法实现题8-3 最小路径覆盖问题算法实现题8-4 魔术球问题算法实现题8-5 圆桌问题算法实现题8-6 最长递增子序列问题算法实现题8-7 试题库问题算法实现题8-8 机器人路径规划问题算法实现题8-9 方格取数问题算法实现题8-10 餐巾计划问题算法实现题8-11 航空路线问题算法实现题8-12 软件补丁问题算法实现题8-13 星际转移问题算法实现题8-14 孤岛营救问题算法实现题8-15 汽车加油行驶问题算法实现题8-16 数字梯形问题算法实现题8-17 运输问题算法实现题8-18 分配问题算法实现题8-19 负载平衡问题算法实现题8-20 深海机器人问题算法实现题8-21 最长k可重区间集问题算法实现题8-22 最长k可重线段集问题算法实现题8-23 火星探险问题算法实现题8-24 骑士共存问题第9章NP完全性理论与近似算法算法实现题9-1旅行售货员问题的近似算法算法实现题9-2 可满足问题的近似算法算法实现题9-3 最大可满足问题的近似算法算法实现题9-4 子集和问题的近似算法算法实现题9-5 子集和问题的完全多项式时间近似算法算法实现题9-6 2SAT问题的线性时间算法算法实现题9-7 实现算法greedySetCover《算法设计与分析》期中试卷1 试题1 数列极差问题试题2 双调TSP回路问题试题3 最佳调度问题《算法设计与分析》期中试卷2 试题1 石子合并问题试题2 整数因子分解问题试题3 汽车加油问题《算法设计与分析》期终试卷1 试题1 乘法表问题试题2 工作分配问题试题3 飞行员配对方案问题《算法设计与分析》期终试卷2 试题1 直线k中值问题试题2 图形变换问题试题3 无向图的最大割问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
参考资料1——独立任务最优调度问题:独立任务最优调度,又称双机调度问题:用两台处理机A和B处理n个作业。
设第i个作业交给机器A处理时所需要的时间是a[i],若由机器B来处理,则所需要的时间是b[i]。
现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。
设计一个动态规划算法,使得这两台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。
研究一个实例:n=6a = {2, 5, 7, 10, 5, 2};b = {3, 8, 4, 11, 3, 4}.分析:当完成k个作业,设机器A花费了x时间,机器B所花费时间的最小值肯定是x的一个函数,设F[k][x]表示机器B所花费时间的最小值(注意,这是B 机器所花费的时间,即当B机器停机时的时间点)。
则有F[k][x]=Min{ F[k-1][x]+b[k], F[k-1][x-a[k]] };其中,F[k-1][x]+b[k]表示第k个作业由机器B来处理(完成k-1个作业时机器A 花费的时间仍是x,前提就是A机器停机的时间是x),F[k-1][x-a[k]]表示第k个作业由机器A处理(完成k-1个作业时机器A花费的时间是x-a[k])。
那么x(表示A机器的停机时间)、F[k][x](表示B机器的停机时间)两者取最晚停机的时间,也就是两者中最大的时间,是在AB在此时间中完成k任务最终的时间:Max(x, F[k][x])。
而机器A花费的时间x在此期间是一个变量,其取值可以是即x=0,1,2……x(max),(理论上x的取值是离散的,但为编程方便,设为整数连续的)由此构成了点对较大值序列。
要求整体时间最短,取这些点对较大值序列中最小的即是。
理解难点在于B是A的函数表达式,也即动态规划所在。
花点时间,看懂表达式,加上思考,理解了这点一切OK,后面的编程实现完全依据这个思想。
先用前两个任务的枚举示例来帮助理解。
示例:前两个作业示例足矣。
初始化第一个作业:下标以0开始。
首先,机器A所花费时间的所有可能值范围:0 <= x <= a[0].设x<0时,设F[0][x]= ∞,则max(x, ∞)= ∞;记法意义见下。
x=0时,F[0][0]=3,则Max(0,3)=3,机器A花费0时间,机器B花费3时间,而此时两个机器所需时间为3;x=1时,F[0][1]=3,Max(1,3)=3;x=2时,F[0][2]=0,则Max(2,0)=2;那么上面的点对序列中,可以看出当x=2时,完成第一个作业两台机器花费最少的时间为2,此时机器A花费2时间,机器B花费0时间。
来看第二个作业:首先,x的取值范围是:0 <= x <= (a[0] + a[1]).当x<0时,记F[1][x] = ∞;这个记法编程使用,因为数组下标不能小于0。
在这里的实际含义是:x是代表完成前两个作业机器A的时间,a[1]是机器A完成第2个作业的时间,若x<a[1],则势必第2个作业由机器B来处理,即在Min()中取前者。
x=0,则F[1][0]= Min{ F[0][0]+b[2], F[0][0-a[1]] }= Min{3+8,∞}=11,进而Max(0,11)=11;x=1,则F[1][1]= Min{ F[0][1]+b[2], F[0][1-a[1]] }= Min{3+8,∞}=11,进而Max(11)=11;x=2,则F[1][2]= Min{ F[0][2]+b[2], F[0][2-a[1]] }= Min{0+8,∞}=8,进而Max(2,8)=8;x=3,则F[1][3]= Min{ F[0][3]+b[2], F[0][3-a[1]] }= Min{0+8,∞}=8,进而Max(3,8)=8;x=4,则F[1][4]= Min{ F[0][4]+b[2], F[0][4-a[1]] }= Min{0+8,∞}=8,进而Max(4,8)=8;x=5,则F[1][5]= Min{ F[0][5]+b[2], F[0][5-a[1]] }= Min{0+8,3}=3,进而Max(5,3)=5;x=6,则F[1][6]= Min{ F[0][6]+b[2], F[0][6-a[1]] }= Min{0+8,3}=3,进而Max(6,3)=6;x=7,则F[1][7]= Min{ F[0][7]+b[2], F[0][7-a[1]] }= Min{0+8,0}=0,进而Max(7,0)=7;那么上面的点对序列中,可以看出当x=5时,完成两个作业两台机器花费最少的时间为5,此时机器A花费5时间,机器B花费3时间。
程序代码如下:[csharp]view plaincopyprint?1.<span style="font-size: 16px;">using System;space zydd3.{4.class Program5.{6.//独立任务最优调度函数,参数为两组任务和任务个数,最优时间和顺序结果。
7.static void DlrwZydd(int[] a, int[] b, int n, int[] least, string[] result)8.{9.//首先给一个大值。
10.f or (int i = 0; i < n; i++)11.{12.l east[i] = 99;13.}14.15.//若任务只有一台机器完成,求得两个时间。
16.i nt aSum = 0, bSum = 0;17.f or (int i = 0; i < n; i++)18.{19.a Sum += a[i];20.b Sum += b[i];21.}22.//小值加1作为数组的列数,减少存储空间。
23.i nt Sum = 1 + Math.Min(aSum, bSum);24.25.//创建四个行数列数相同的数组,timeA存储机器A可能用的时间,timeB存储对应机器B用的时间,26.//timeMax记录两者共需的时间,即较大的那个;who则标识完成该任务的机器是A还是B。
27.i nt[,] timeA = new int[n, Sum];28.i nt[,] timeB = new int[n, Sum];29.i nt[,] timeMax = new int[n, Sum];30.c har[,] who = new char[n, Sum];31.c har[] tempRlt = new char[n];//tempRlt记录机器完成任务的机器顺序,并逐一赋值给result32.33.34.//先计算第1个任务相关值,记录在四个数组的第0行。
35.f or (int i = 0; i <= a[0]; i++)36.{37.t imeA[0, i] = i;38.i f (i < a[0])39.{40.t imeB[0, i] = b[0];41.w ho[0, i] = 'b';42.}43.e lse44.{45.t imeB[0, i] = 0;46.w ho[0, i] = 'a';47.}48.t imeMax[0, i] = Math.Max(timeA[0, i], timeB[0, i]);49.}50.51.//尽管像下面一样,直接比较即可得出完成第1项任务的最优时间,但由于使用动态规划,计算上述值是必需的。
52.i f (a[0] <= b[0])53.{54.l east[0] = a[0];55.t empRlt[0] = 'a';56.}57.e lse58.{59.l east[0] = b[0];60.t empRlt[0] = 'b';61.}62.r esult[0] = new String(tempRlt);63.64.//计算第2个至第n个任务,分别记录在四个数组相应行。
65.f or (int k = 1; k < n; k++)66.{67.68.//tempSum记录完成前k项任务机器A最多需要的时间,即全部由A完成需要的时间,亦即机器A所有可能的取值范围。
69.i nt tempSum = 0;70.f or (int temp = 0; temp <= k; temp++)71.{72.t empSum += a[temp];73.}74.//计算出所有可能的点对(timeA,timeB),并取值timeMax。
75.f or (int i = 0; i <= tempSum; i++)76.{77.//机器A在完成前k项任务时所花费的时间为i。
78.t imeA[k, i] = i;79.80.//i即timeA[k, i],若机器A完成前k项任务的时间小于它完成第k项的时间,可能吗?不可能,所以第k项任务肯定由机器B做。
81.i f (i < a[k])82.{83.t imeB[k, i] = timeB[k - 1, i] + b[k];84.w ho[k, i] = 'b';85.}86.//按照前述动态规划方式的思想,确定机器A在花费i时间时,机器B花费的最优时间。
87.e lse88.{89.i f ((timeB[k - 1, i] + b[k]) <= timeB[k - 1, i - a[k]])90.{91.t imeB[k, i] = timeB[k - 1, i] + b[k];92.w ho[k, i] = 'b';93.}94.e lse95.{96.t imeB[k, i] = timeB[k - 1, i - a[k]];97.w ho[k, i] = 'a';98.}99.}100.//两台机器花费时间较大的那个为总花费时间。
101.timeMax[k, i] = Math.Max(timeA[k, i], timeB[k, i]);102.}103.104.//处理数组tempSum后面的值。
机器A时间全部设为最大,此时机器B则无需花费时间。
105.for (int i = tempSum + 1; i < aSum; i++)106.{107.timeA[k, i] = tempSum;108.timeB[k, i] = 0;109.}110.111.//完成第k项任务后,在timeMax所有可能值中,选取最小值即最优值。
112.int flag = 0;//记录最优值所在的位置i值,同时也是机器A所花费的时间。