文章目录

  • 什么是NP完全问题:
  • 贪婪算法:
  • 算法实现:
  • 如何识别NP完全问题:
什么是NP完全问题:

算法导论中这样描述NP完全问题:在多项式时间内可解的问题是易处理的问题,在超多项式时间内解决的问题是不易处理的问题。NP完全问题就是后者。通俗说就是:以难解著称的问题,比如旅行商问题和集合覆盖问题,人们普遍认为这些问题,不可能编写出可快速解决的算法。

旅行商问题:

一个旅行商要前往5个不同的城市,同时确保行程最短。如何计算最短的行程。5个城市有120种组合。这是一个阶乘问题,随着城市数目的增加,运行时间增长非常快。无法快速解出。

集合覆盖问题:

假设你办了个广播节目,要让全美50个州的听众都收听得到。为此,你需要决定在哪些广播台播出。在每个广播台播出都需要支付费用,因此你力图在尽可能少的广播台播出。

把一个广播包覆盖的州作为一个集合,有n个不同的集合,每个集合包含若干州,如果覆盖所有州的最小集合个数。这里的组合有2的n次方个。我们称为幂集。计算时间为O(2^n) 如果n是100,每秒可以计算10万个子集,花费的时间将是一个天文数字。

所以针对NP完全问题,我们无法给出快速求取精确解的算法。所以我们一般用近似算法来解决此类问题,获取一个近似解。

近似算法优劣的两个标准:

1.速度有多快

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

贪婪算法:

贪婪算法(或贪心算法) 是近似算法的一种。贪心算法的核心思想是:每一步都选择局部最优解,最终得到的就是最优解。

旅行商问题:先随便找一个城市作为起点城市,然后每次都选剩余城市中距离当前城市最近的一个城市,直到选择完毕。

集合覆盖问题:

1.选出这样一个集合,它覆盖了最多的未覆盖的城市。

2.重复第一步,直到覆盖所有城市。

算法实现:

出于简化考虑,这里假设要覆盖的州没有那么多,广播台也没有那么多

stations = {}
stations["ktwo"] = set(["wa", "id", "mt"])
stations["kone"] = set(["id", "nv", "ut","wa","mt"])
stations["kthree"] = set(["or", "nv", "ca"])
stations["kfour"] = set(["nv", "ut"])
stations["kfive"] = set(["ca", "az"])

完整代码:

#最终要覆盖的所有州
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])#该散列表用来记录每个广播台和其覆盖的州
stations = {}
stations["ktwo"] = set(["wa", "id", "mt"])
stations["kone"] = set(["id", "nv", "ut","wa","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 = Nonestates_covered = set()#从剩余集合中找到最优解for station,states in stations.items():#计算两个集合的交集covered = states_needed & statesif len(covered) > len(states_covered):best_station = stationstates_covered = covered#排除已经选择的集合中覆盖的州states_needed -= states_coveredfinal_stations.add(best_station)print(final_stations)

小结:

贪心算法的特点是简单快速。核心思想是不断选择局部最优解,获得最终的解。结果是一个近似解。

如何识别NP完全问题:

断问题是不是NP完全问题很难,易于解决的问题和NP完全问题的差别通常很小。以下一些特征可以作为参考:

❑ 元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
❑ 涉及“所有组合”的问题通常是NP完全问题。
❑ 不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。
❑ 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。
❑ 如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。
❑ 如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。

NP完全问题贪婪算法相关推荐

  1. NP完全问题与近似算法:贪婪策略|Python实现

    1. 集合覆盖问题 假设我们创建了一个自己的电台,希望让整个市区的人都可以听到我们的节目.然而,这个城市有许多不同的广播公司,购买它们服务的电台可以让自己的节目覆盖某一块区域,并且这些区域常常是重叠的 ...

  2. 《算法图解》学习笔记(八):贪婪算法和NP完全问题(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  3. 判断NP完全问题的一些蛛丝马迹

    一般来说我们没有简单的办法判断问题是不是NP完全问题,但还是有一些蛛丝马迹可寻(来自<算法图解>) 元素较少时算法的运行速度非常快,但是随着元素数量的增加,速度会变得非常慢: 涉及所有组合 ...

  4. 【计算理论】计算复杂性 ( NP 完全问题 | 顶点覆盖问题 | 哈密顿路径问题 | 旅行商问题 | 子集和问题 )

    文章目录 一.顶点覆盖问题 二.哈密顿路径问题 三.旅行商问题 四.子集和问题 五.NP 完全问题 一.顶点覆盖问题 顶点覆盖 ( Vertex Cover ) : 给定一个 无向图 G\rm GG ...

  5. 【计算理论】计算复杂性 ( 无向图独立集问题 | 独立集问题是 NP 完全问题证明思路 | 证明独立集问题是 NP 完全问题 )

    文章目录 一.独立集问题 二.独立集问题是 NP 完全问题证明思路 二.证明独立集问题是 NP 完全问题 一.独立集问题 无向图的独立集 , 指的是在无向图中找到点集的子集 , 使得它们两两之间 , ...

  6. 【计算理论】计算复杂性 ( 证明团问题是 NP 完全问题 )

    文章目录 一.团问题是 NP 完全问题 证明思路 二.证明团问题是 NP 完全问题 一.团问题是 NP 完全问题 证明思路 证明一个命题是 NP\rm NPNP 完全问题 : ① 证明是 NP\rm ...

  7. 【计算理论】计算复杂性 ( 3-SAT 是 NP 完全问题 | 团问题是 NP 完全问题 | 团问题是 NP 完全问题证明思路 )

    文章目录 一.3-SAT 是 NP 完全问题 二.团问题是 NP 完全问题 三.团问题是 NP 完全问题 证明思路 一.3-SAT 是 NP 完全问题 布尔可满足性问题 ( Boolean Satis ...

  8. P、NP、NPC(NP完全问题)、NP-hard问题概述

    P.NP.NPC(NP完全问题).NP-hard问题概述 一.概念总结 1.P问题: 能在多项式时间内解决的问题 2.NP问题: 不能在多项式时间内解决或不确定能不能在多项式时间内解决,但能在多项式时 ...

  9. P、NP、NP完全问题、NP难问题

    可以在多项式时间内求解的问题称为易解的,而不能在多项式时间内求解的问题称为难解的. P类问题:多项式类型,是一类能够用(确定性的)算法在多项式的时间内求解的判定问题. 只有判定问题才属于P 不可判定问 ...

  10. np完全问题的例子_MIT开发光子算法,试图解决世界7大数学难题的“NP完全问题”...

    2000年5月,美国克雷数学研究所(Clay Mathematics Institute,CMI)提出7个数学难题,称为"千禧年大奖难题",挑战者每解出1道题目,若通过两年验证期和 ...

最新文章

  1. 心情不能平静,慢慢的调节
  2. PHP中htmlentities跟htmlspecialchars的区别
  3. 我心目中未来的计算机200字,我心目中未来的计算机.doc
  4. biosrecovery什么意思_BIOS中的每个中文是什么意思
  5. 解决 IntelliJ IDEA 读取不了 datasource.properties
  6. MATLAB2016打开mat格式图片
  7. phpstrom配置Xdebug
  8. 莫陷入点击和评论陷阱
  9. SQL 查询CET使用领悟
  10. php如何防止恶意DDoS攻击,避免带宽占用问题方法
  11. 移动MM收费:钱不是问题
  12. C语言习题:输入10个学生5门课的成绩,分别用函数实现下列功能:①计算每个学生的平均分;②计算每门课的平均分;③找出所有50个分数中最高的分数所对应的学生和课程;④计算平均分方差;
  13. HelpingKind.org:一个有偿的市场
  14. [附源码]Python计算机毕业设计大学生校园社团管理系统
  15. wxPython中文教程入门实例
  16. Escape Codec Library: ecl.js Shift_JISエンコードやEUC-JPエンコードなども可能な escape エンコード・デコード関数のライブラリ
  17. 重装系统后发现只有系统盘c盘怎么办?
  18. limma | 配对样本的差异分析怎么搞!?(一)
  19. LVSDR模式+keepalived
  20. linux vim插件

热门文章

  1. RELYUM—针对关键系统的物联网和网络安全解决方案 (二)
  2. C++ Concurrency in Action, 2nd Edition 免积分下载
  3. js复制到剪贴板html5,移动端web 复制到剪贴板 怎么实现?
  4. RapidMiner Studio入门
  5. 如何判断对方列表里是不是好友_QQ怎么知道自己是不是对方好友
  6. myeclipse linux 安装,安装MyEclipse
  7. Nordic--nrf52832--FDS(二)基本使用
  8. 数据分类分级指南分级方法
  9. 提醒:本周欢乐时光和美丽杀变种病毒发作(转)
  10. Fcitx 在 LumaQQ中的设置