文章目录

  • 贪心算法
  • 最优装载问题
  • 教室调度问题
  • 背包问题
  • 不同问题的求借策略


贪心算法

定义:
在对问题求解时,总是作出在当前看来是最好的选择。也就是说,不从整体上加以考虑,
它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明)。

最优装载问题

问题提出:有一天海盗们截获了一艘装满各种各样古董的货船,每一件都价值连城,一旦打碎就是去了价值,
海盗船载重量为C,每件固定的重量为wi,海盗们该如何尽可能装载最多数量的古董呢?

古董重量清单:

python贪心法求流水作业调度问题 贪心算法活动安排python_贪心算法


算法设计:

  1. 船载重量固定为C,只要每次选择重量最小的古董,直到不能再装为止,这样装载的古董数量最大,
    这就是贪心策略;
  2. 把古董按重量从小到大排序,根据策略选出尽可能多的古董。

python贪心法求流水作业调度问题 贪心算法活动安排python_背包问题_02

教室调度问题

问题提出:
假设有如下课程表,你希望将尽可能多的课程安排在某间教室上。
但是你没法让这些课都在这间教室上,因为有些课的上课时间有冲突。

python贪心法求流水作业调度问题 贪心算法活动安排python_python贪心法求流水作业调度问题_03


python贪心法求流水作业调度问题 贪心算法活动安排python_python贪心法求流水作业调度问题_04


你希望在这间教室上尽可能多的课。如何选出尽可能多且时间不冲突的课程呢?

具体做法如下:

(1) 选出结束最早的课,它就是要在这间教室上的第一堂课。

(2) 接下来,必须选择第一堂课结束后才开始的课。同样,你选择结束最早的课,这将是要在这间教室上的第二堂课。

重复这样做就能找出答案!

背包问题

问题提出:假设山洞中有n种宝物,每种宝物有一定重量w和相应的价值v,毛驴运载能力
一种宝物只能拿一样,宝物可分割。怎样才能使毛驴运走宝物的价值最大呢?

解题思路:
可以尝试三种贪心策略:

  1. 每次挑选价值最大的装东西入背包;
  2. 每次挑选最重的东西;
  3. 每次选取单位重量价值最大的东西。

算法设计:

  1. 计算出每件宝物的性价比,按照从高到低排序;
  2. 根据贪心策略,按性价比从大到小选取宝物,直到达到毛驴的运载能力。每次选择宝物后判断是否
    小于m,如果不小于则取走宝物的一部分,程序结束

python贪心法求流水作业调度问题 贪心算法活动安排python_贪心算法Python_05

不同问题的求借策略

想一下如果宝物不可分割,贪心算法得到的是否是最优解?

注意: 物品可分割的装载问题称为背包问题,不可分割问题的装载问题称为0-1背包问题。
0-1背包问题不具有贪心选择性质,贪心算法不能得到全局最优解,仅仅是最优解的近似解。
0-1背包问题可用动态规划算法求解。