算法笔记8----贪婪算法

本章内容:

学习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完全问题时,最佳的做法是使用近似算法。

贪婪算法易于实现,运行速度快,是不错的近似算法。

阅读更多
个人分类: 算法与数据结构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭