贪心算法的多机调度问题

一、问题分析

多机调度问题

问题描

设有N个独立的作业{1,2,...,n},由M台相同的机器进行加工处理。作业i所需时间为Ti.约定:任何作业可以在任何一台机器上加工,处理单位完工前不允许中断处理,人和作业不能拆分成更小的作业。要求给出一种作业调度方案,使所给的N个作业,在尽可能短的时间内有M胎机器加工处理完成。

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

分析多机调度问题使用的是贪心算法

贪心算法只考虑眼前利益,不通盘考虑问题的所有可能,每一步做出当时看起来最佳的选择(局部最优选择)利用贪心算法求解的问题往往具有两个重要的特性,谈心选择性质和最优子结构性质。如果满足这两个性质,就可以使用贪心算法了

贪心选择

所谓贪心选择性质,是指原问题的整体最优解,可以通过一系列局部最优的选择得到应用。同一规则,将原问题变为一个相似的,但规模更小的子问题,而后的每一步都是当前最佳的选择。这种选择依赖于自己做出的选择,但不依赖于味做出的选择。运用谈心策略解决的问题,在程序的运用过程中无回溯过程。

最优子结构

当一个问题的最优解包含其子问题的最优解释,称此问题具有最优子结构性质问题的最优子结构性质,是该问题是否可用贪心算法求解的关键。

  • 问题的设计思路

作业项数为n,机器数为m。若n<=m,则一台机器随机分配一项作业,最长作业时间为机器所用最少时间。若n>m,则使用贪心算法寻求最佳解决方案,如下:

假设:一共有七项作业,解决时间分别为{5,4,16,14,3,2,6}

一共有三台机器,M1,M2,M3

首先,按照作业完成时间将作业从大到小排序,为{16,14,6,5,4,3,2}

然后分别将16,14,6安排在M1 M2 M3三台机器上,然后进行比较。16,14,6。6最小,所以将下一项作业5安排在M3机器上。5+6=11。在将16,14,11进行比较,11最小所以将下一项作业4安排在M3机器上。6+5+4=15。在将16,14,15进行比较,14最小,所以将3安排在M2机器上,14+3=17。在将16,15,17进行比较,15最小,所以将下一项作业2安排在M3机器上,15+2=17,将所有作业安排完毕后进行比较,16,17,17,机器运行时间最长为17,所以机器处理最短时间为17。

 

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

遇到的问题:设计随机的作业所用时间问题

解决方案:使用C语言获取随机数并赋值给数组

首先,创建一个数组,使用for循环,rand()函数,time()函数获取随机数并赋值

所用知识:①rand(),srand()需要头文件<stdlib.h> ,time()需要头文件<time.h>

②rand()函数是用来生成随机数的函数,通常生成随机数范围为0~32767

③rand()函数生成的随机数是由一个特殊数经过特定公式生成的,这个特殊数通常称为”种子“,种子在每次开机后不变,故这种情况下生成的随机数组每次都一样。

④所以我们希望种子数是随时变化的,这里就用到了每一秒值都会变化的time()函数

⑤time(0)的值表示从1970年1月1日零点到现在过去了多少秒,这个值现在大约是15亿多

⑥srand()是用来重新设置随机数”种子“的,srand(time(0));语句即可重新设置种子,从而rand()生成的数为真随机数。

⑦通过 rand()%(right-left+1)+left 取模运输技巧控制想要的随机数范围

  • 问题求解特色及关键技术

使用for循环,rand()函数,time()函数获取随机数并赋值

先定义一个数组,使用srand(time(0));语句重新设置种子,使rand()生成的数为真随机数。利用for循环和rand()函数生成随机数,随机数范围为0~100,最后输出数组。

 

  • 算法测试与应用

若作业项数小于机器数,则取时间最长作业所用时间为机器运行最短时间

 

若作业项数大于机器数,如下

 

应用

早上妈妈烧开水用了六分钟,刷牙用了两分钟,洗脸用了三分钟,泡茶用了两分钟,喝茶用了一分钟,妈妈最少用了几分钟?

  • 结论

对于我们初次自己设计代码的学生来说,这次课设,是我们自学能力的一次测试(有些东西自己从来没有接触过),也是对我们所学的基础知识的测试。在本程序中我学到了不少的知识,但也发现了很多不足之处。我学到了函数生成随机数,并且将自己在学校学到的知识进行了整理。了解了在做课设的时候最重要的并不是写代码,而是去了解我们要做什么,怎么做,对工作流程的理解及需求的分析。认识到许多不足:

  1. 知识仅限于在书本上,对课设有一点了解。
  2. 2、动手能力太差,了解一定的原理但写不出来。
  3. 3、知识有限,还需加强。
  4. 4、思路不清晰,盲目的去完成代码。

本次课设也使我们有了做代码的经验

第一步: 需要理解整体构思,做到了然与胸

第二步: 动手之前,可以标注出注释,虽然代码里面注释越少越好,但是前期,注释可以代替我们的逻辑思维

第三步:优化代码,注意代码的可复用性,该提取的一定要提取,该总结的一定要总结

在这次课设中,除了让我们明白编程中需要能力,素质,知识之外,更重要的是学会了如何去完成一个任务,懂得了享受编程。当遇到问题,冷静,想办法一点一点的排除障碍,到最后获取成功,一种自信心由然而生,这就是编程的乐趣。有时候也需要虚心请教,从别人的身上学习到自己没有的东西,每一次的挫折都在为成功铺路。

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值