目录

1. 问题分析

1.1问题描述

1.2提出问题

1.3问题要求

2.设计思路

3算法设计

3.1算法流程

3.2运行代码

3.3运行结果

4. 问题求解中所遇到的问题及分析解决方案

4.1遇到的问题

4.2解决方案

4.2.1使用方法及解题思路

4.2.2回溯法优点

5. 贪心算法意义与应用

6.结论

7.心得体会


  1. 问题分析

1.1问题描述

多机调度问题是生产管理与控制的一个基本问题。按照加工设备数量和加工作业的流云方式,一般可分为单机调度、并行机调度、Flowshop调度、可重入式调度和Jobshop调度会多种类型。作业调度中的许多问题,不仅具有随机性、约束复杂、规模大及多目标冲突等点,而且许多都属于NP完全问题,即使在单机情形也是如此。因此,如何寻求有效可行的度求解方案,一直是生产管理与控制研究的热点和难点。多机调度问题是个NP完全问题,到目前为止没有有效的算法(求得最优解的有效的算法),但是利用贪心算法可以近似求出最优解,采用最长处理时间作业优先的贪心选择策略,可以设计出较好的解。

1.2提出问题

设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理。作业i所需时间为Ti. 约定:任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。要求给出一种作业执行次序,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

1.3问题要求

要求:随机生成n个作业相关信息,并计算由m台机器处理的最短时间。

2.设计思路

贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。按照最长处理时间作业优先的贪心策略,当m≥n时,只要将机器i的[0,ti)时间区间分配给作业i即可;当m<n时,首先将n个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。

使用贪心法,将n个作业所用时间存放到数组里t[i],对耗费时间进行降序排序,用另外一个数组f记录每一台机器的当前机器累加作业时间,将当前机器累加作业时间进行升序排序,将排出来当前机器累加作业时间的最小值(最先空闲的机器)与作业时间最大值相加,存入数组中f[0]+=t[i],再将f升序排序,for循环重复操作,最终将所有机器累加的时间进行排序,输出最大值。

例如:7个独立作业1,2,3,4,5,6,7由3台机器m1,m2,m3加工处理。各作业所需的处理时间为2,14,4,16,6,5,3。

3算法设计

3.1算法流程

多机调度问题python 多机调度问题属于_回溯法

图3-1流程图

3.2运行代码

  

多机调度问题python 多机调度问题属于_贪心算法_02

图3-2运行代码截图

3.3运行结果

多机调度问题python 多机调度问题属于_贪心算法_03

图3-3运行结果图

  1. 问题求解中所遇到的问题及分析解决方案

4.1遇到的问题

多机调用问题使用贪心算法,最大的问题是:贪心算法只能求得近似解或者最优解,并不能将所有解求得最优,具有一定的局限性。

4.2解决方案

4.2.1使用方法及解题思路

使用回溯法。从n个作业中找出有最小完成时间和的作业调度,所以批处理作业调度问题的解空间是一棵排列树。按照回溯法搜索排列树的算法框架,设开始时t=[1,2, ... , n]是所给的n个作业的完成时间,则相应的排列树由t[1:n]的所有排列构成。

数组len[]用于存储一组空间解,comp()函数用于计算一个完整调度的完成时间,search()函数用来做搜索,best记录相应的当前最佳作业调度完成时间。

当dep>n时,算法搜索至叶子结点,得到一个新的作业调度方案。此时算法适时更新当前最优值和相应的当前最佳调度。

当dep<n时,若当前扩展结点位于排列树的第(n-1)层,此时算法选择下一个要安排的作业进行搜索且向第(n-2)层回溯,以深度优先方式递归的对相应的子树进行搜索,对不满足上界约束的结点,则剪去相应的子树向第(n-2)层回溯。

多机调度问题python 多机调度问题属于_贪心算法_04

图4-2树

4.2.2回溯法优点

回溯法可称为通用的解题法。回溯是一个带有系统性又带有跳跃性的搜索算法,用它可以系统地搜索-一个问题的所有解或任意解。对于用回溯法求解的问题,首先要将问题进行适当的转化,得出状态空间树。这棵树的每条完整路径都代表了一种解的可能。通过深度优先搜索这棵树,枚举每种可能的解的情况;从而得出结果。但是,回溯法中通过构造约束函数,可以大大提升程序效率,因为在深度优先搜索的过程中,不断的将每个解(并不一定是完整的,事实上这也就是构造约束函数的意义所在)与约束函数进行对照从而删除一些不可能的解,这样就不必继续把解的剩余部分列出从而节省部分时间。

回溯法有如下好处:它在包含问题的所有解的空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间的任--结点时,总是先判断该结点是否肯定不包含问题的解。如果不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索;回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都要被搜索遍才结束。而回溯法在用来求问题的任意解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解算法适用于解一些组合数较大的问题。

  1. 贪心算法意义与应用

贪心算法优点:可以用用很小的计算量,就能获得最优解或近似最优解;缺点:贪心算法只考虑眼前利益,不通盘考虑问题的所有可能,每一步做出当时看起来最佳的选择,寄希望于这样的选择能导致全局最优解,但不一定每个问题都可以得到最优解,但确实很多问题可以用这种方式求得最优解,从而避免了“杀鸡用牛刀”,使用过于复杂的算法。某些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似解。

应用:解决背包问题、最小生成树问题、活动安排问题、均分纸牌问题、线段覆盖问题等

6.结论

贪心算法在几个基本算法是相对简单的算法了,思路也简单,每一步都能做出当前最好的选择。从全局来看,运用贪心策略解决的问题在程序的运行过程中无回溯过程,后面的每一步都是当前看似最佳的选择,这种选择依赖于已做出的选择,但不依赖于未做出的选择。

贪心算法存在的问题:①不能保证求得的最后解是最佳的。由于贪心策略总是采用从局部看来是最优的选择,因此并不从整体上加以考虑。②贪心算法只能用来求某些最大或最小解的问题。例如找零钱问题要求得到最小数量,就可以采用贪心算法,但是在另外一个求解权值最小路径时采用贪心算法得到的结果并不是最佳。③贪心算法只能确定某些问题的可行性范围。

7.心得体会

在整理实验报告的过程中,我们对我们的选题进行了深度的分析,并找出适合的解决方案。每个人对多机调度的算法都存在着一定的理解,这也就是很多同学的算法实现不同的原因。很有可能是自己理解的不够透彻,我们认为我们的实验设计还不够完善,直接原因就是我们自己对c语言的掌握还不够深,做这个实验的过程中有时还会觉得我们自己的想法与实现的算法存在着很大差距。同时,通过这个实验在很大程度上还增进我们的合作能力,并且对于算法程序设计回溯法有了深刻的了解。