贪婪算法

应用场景

  1. 教室课程调度问题,如何让一个教室不冲突地上更多的课?

  2. 如何用一个容量有限的背包装价值总和最多的东西?

  3. 广播节目费用,如何用最少的费用将广告传播到更广阔的区域?

贪婪算法很简单:每步都采取最优的做法。在这个示例中,你每次都选择结束最早的 课。用专业术语说,就是你每步都选择局部最优解,最终得到的就是全局最优解。显然,贪婪算法并非在任何情况下都行之有效,但它易于实现!

在有些情况下,完美是优秀的敌人。有时候,你只需找到一 个能够大致解决问题的算法,此时贪婪算法正好可派上用场,因为它们实现起来很容易,得到的 结果又与正确结果相当接近。

判断近似算法优劣的标准如下:

  1. 速度有多快;

  2. 得到的近似解与最优解的接近程度。

NP完全问题

NP完全问题的简单定义是,以难解著称的问题,如旅行商问题和集合覆盖问题。很多非常 聪明的人都认为,根本不可能编写出可快速解决这些问题的算法。这种情况下最好就是用简单的近似算法,得到一个近似的答案即可。

如何判断是不是NP完全问题:

  1. 元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。

  2. 涉及“所有组合”的问题通常是NP完全问题。

  3. 不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。

  4. 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。

  5. 如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。

  6. 如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。

Python实现代码:

利用最少的广播站台,覆盖所有的目标州:

Last updated

Was this helpful?