贪婪算法+小应用(调度问题)

【0】README

0.1) 本文总结于 数据结构与算法分析, 旨在 理解 “DFS应用——贪婪算法” 的idea;


【1】贪婪算法

1.1)已经看到的三个贪婪算法: Dijkstra算、Prim算法 和 Kruskal 算法;(Dijkstra 寻找一个顶点到其他顶点的最短路径, Prim算法是选取顶点以找出最小生成树, Kruskal算法是一次选取权值最小的边 建立最小生成树)
1.2)贪婪算法是分阶段工作的 : 在每个阶段,可以认为所做的决定是最好的, 而不考虑将来的后果。一般来说, 这意味着选择的是某个局部的最优。
1.3)贪婪算法荔枝(使用最少数目的纸币找零钱):
说找零钱, 大部分人首先数出面值1元的纸币,然后是面值5角的纸币、2角的纸币、1角的纸币等等;这种贪婪算法使用最少数目的纸币找零钱;
贪婪算法的主要问题(添加1元2角的纸币): 该算法不能总是成功,为了找还15角的零钱,如添加面值1元2角的纸币(这仅仅是举例说明)可破坏这种找零钱算法, 因为此时它给出的答案(一个面值1元2角的纸币+1个面值2角的纸币+一个面值1角的纸币==3个)不是最优的(1个面值1元的纸币+1个面值5角的纸币==2个);


【2】一个简单的调度问题

2.1)问题说明: 有作业 j1, j2, ……, jN, 已知对应的运行时间为 t1, t2, …, tN, 而处理器只有一个, 为了把作用平均完成的时间最小化,调度这些作业最好的方式是什么?

对上图的分析(Analysis):

  • A1)我们看到, 2号调度是按照最短的作业最先进行来安排的, 这将总会产生一个最优调度;
  • A2)这个结果也指出了 为什么 os 调度程序一般吧优先权赋予给那些更短的作业的原因;
    2.2)多处理器的情况
  • 2.2.1)我们还是有作业 j1, j2, ……, jN,对应的运行时间为 t1, t2, …, tN,另外处理器的个数为P。不失一般性地, 我们将假设作业是有序的,最短的最先运行。
  • 2.2.2)看个实际荔枝:

2.3)将最后完成时间最小化(即越早结束越好)

  • 2.3.1)假设我们只关注最后作业的结束时间;
  • 2.3.2)看个荔枝(下图中的最小的最后完成时间是 34):
  • 2.3.3)这个问题是NPC类问题, 因此将最后完成时间最小化显然要比把 平均完成时间最小化困难得多;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 贪婪算法是一种基于贪心策略的算法,它通常通过局部最优解来得到全局最优解。当解决调度问题时,贪婪算法可以选择最小化完成时间或最大化完成任务的收益。在MATLAB中,可以使用贪婪算法解决调度问题,具体步骤如下: 1. 输入任务预计完成时间或任务收益。 2. 根据贪婪策略,选择当前能够最大化完成任务收益或最小化完成时间的任务。 3. 把选择的任务分配给可用的资源进行执行。 4. 更新可用资源的状态,计算任务的完成时间或收益。 5. 重复上述过程,直到所有的任务都被完成。 在MATLAB中,可以使用循环和条件语句来实现这些步骤。具体实现过程会因应用场景的不同而略有差异。例如,对于任务完成时间的最小化,可以使用动态规划算法和贪婪策略一起解决,而对于任务收益的最大化,可以使用贪婪算法配合线性规划等算法来解决。 总之,贪婪算法是解决调度问题的有效方法之一,可以帮助我们快速得到近似最优解。在MATLAB中,使用贪婪算法来解决调度问题可以提高计算效率和减少人工干预,尤其对大规模的调度问题具有重要的作用。 ### 回答2: 贪婪算法是一种解决优化问题的方法,它通过每一步选择局部最优解,最终获得全局最优解。在调度问题中,贪婪算法可以通过选择一组任务并分配给可用资源的方式来优化调度方案。 使用Matlab实现贪婪算法解决调度问题的步骤如下: 首先,需要定义每项任务的属性,包括任务名称、处理时间、开始时间和结束时间等信息。 然后,根据任务的属性,构建一个任务列表,并按照处理时间从小到大排序。 接下来,设置初始时间为0,并循环遍历任务列表,每次选择可用资源中处理时间最短的任务,并将其分配给资源。同时更新开始时间、结束时间和可用资源信息。 最后,输出每项任务的详细信息,包括开始时间、结束时间和处理时间等,以评估所提出的调度方案的性能。 使用贪婪算法解决调度问题的优点是简单易用、计算速度快,并且可以得到较为快速的优化调度方案。然而,贪婪算法也存在一定的局限性,仅能求得局部最优解,可能无法得到全局最优解。因此,在实际应用中需要结合其他优化算法来实现更好的性能。 ### 回答3: 贪婪算法是解决调度问题的常用方法之一,在MATLAB中也有不少应用调度问题,简言之即为为了最小化某个目标函数(如待机时间最少、任务完成时间最短等),对一些任务按照某种规则安排其执行时间,以达到最优化目的的问题。在贪婪算法中,我们按照一定的策略贪心地将任务逐个加入到可行解中去,直到得到最终的最优解。 在MATLAB中,我们可以先将所有的任务按照某种规则进行排序,如按执行时间长短、优先级等,然后从头开始一个一个加入到已安排的任务中。具体来说,我们可以遍历所有任务,每次选出能够安排在当前任务之后且能够最短化目标函数的任务,并将其安排在当前任务的后面。这样的过程一直持续到所有任务都被安排完为止,得到的序列即为最优解。 举例来说,如果我们要安排一些任务的执行时间,我们可以先根据任务执行所需的时间从小到大进行排序,然后选取等待时间最少的任务进行安排。在安排任务过程中,我们可以反复采用贪心策略,即每次选取等待时间最少的可执行任务进行安排,并将其从待安排的任务中删除。这样逐步构造出可行的执行序列,直到所有任务都被安排为止。 总之,贪婪算法是解决调度问题的一种常用且有效的方法,配合MATLAB的强大计算功能,可以高效地解决实际问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值