本章内容:
学习NP完全问题,如何处理不可能完成的任务。
学习识别NP完全问题,以免浪费时间去寻找解决它们的快速算法。
学习近似算法,使用它们可快速找到NP完全问题的近似解。
学习贪婪策略----一种非常简单的问题解决策略。
8.1教室调度问题
贪婪算法的优点----简单易行。每步都采取最优的做法。就是每步都选择局部最优解。
8.2近似算法
在获得精确解的时间太长时,可以使用近似算法。判断近似算法的优劣标准如下:速度有多快;得到的近似解与最优解的近似程度。
贪婪算法是不错的选择,简单而且速度快,运行时间为O(n2)
states_needed=set(["mt","wa","or","id","nv","ut","ca","az"]) stations = {} stations["kone"] = set(["id", "nv", "ut"]) stations["ktwo"] = set(["wa", "id", "mt"]) stations["kthree"] = set(["or", "nv", "ca"]) stations["kfour"] = set(["nv", "ut"]) stations["kfive"] = set(["ca", "az"]) final_stations=set() while states_needed: best_station =None states_covered = set() for station,state in stations.items(): covered = states_needed & state if len(covered) > len(states_covered): best_station = station states_covered = covered final_stations.add(best_station) states_needed -= states_covered print(final_stations)
集合
并集意味着将集合合并
交集意味着找出两个集合中都有的元素。
差集意味着将从下一个集合中剔除出现在另一个集合的元素。
集合类似于列表,只是不能包含重复的元素
8.4NP完全问题
旅行商问题和集合覆盖问题有一些共同之处:你需要计算所有的解,并从中选出最小/最短的那个。这两个问题都属于NP完全问题。
NP完全问题的简单定义是:以难解著称的问题。
8.4.1如何识别NP完全问题
元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
涉及所有组合的问题通常是NP完全问题。
不能将问题分成小问题,必须考虑各种可能的情况,这可能是NP完全问题。
如果问题涉及序列或集合且难以解决,它可能就是NP完全问题。
如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。
8.5小结
贪婪算法寻找局部最优解,企图以这种方式获得全局最优解。
对于NP完全问题,还没有找到快速解决的方案。
面临NP完全问题时,最佳的做法是使用近似算法。
贪婪算法易于实现,运行速度快,是不错的近似算法。