贪婪算法
应用场景
教室课程调度问题,如何让一个教室不冲突地上更多的课?
如何用一个容量有限的背包装价值总和最多的东西?
广播节目费用,如何用最少的费用将广告传播到更广阔的区域?
贪婪算法很简单:每步都采取最优的做法。在这个示例中,你每次都选择结束最早的 课。用专业术语说,就是你每步都选择局部最优解,最终得到的就是全局最优解。显然,贪婪算法并非在任何情况下都行之有效,但它易于实现!
在有些情况下,完美是优秀的敌人。有时候,你只需找到一 个能够大致解决问题的算法,此时贪婪算法正好可派上用场,因为它们实现起来很容易,得到的 结果又与正确结果相当接近。
判断近似算法优劣的标准如下:
速度有多快;
得到的近似解与最优解的接近程度。
NP完全问题
NP完全问题的简单定义是,以难解著称的问题,如旅行商问题和集合覆盖问题。很多非常 聪明的人都认为,根本不可能编写出可快速解决这些问题的算法。这种情况下最好就是用简单的近似算法,得到一个近似的答案即可。
如何判断是不是NP完全问题:
元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
涉及“所有组合”的问题通常是NP完全问题。
不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。
如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。
如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。
如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。
Python实现代码:
利用最少的广播站台,覆盖所有的目标州:
Last updated
Was this helpful?