贪婪算法近似集合覆盖问题的解
实例:
假设你办了个广播节目,要让全美50个州的听众都听到。为次,你需要决定哪些广播台播出。在每个广播台播出都需要支付费用,因此你要尽可能少的在广播台播出。。
其中每个广播台覆盖特定的区域,不同广播台的覆盖区域可能重叠
这样的话要遍历所有的可能的子集合组合,就有2n2^n,其中n为广播台数目,用大O表示法运行时间为O(2n)O(2^n)。如果广播台很多,就成了一个NP难问题,而贪婪算法可以得到非常接近的解:
- 选出这样一个广播台,即它覆盖了最多的州。即便这个广播台覆盖了一些已覆盖的州,也没有关系
- 重复第一步,直到覆盖所有的州
这是一种近似算法,因为获得精确解需要的时间太长,而贪婪算法可以很好的近似。。
而贪婪算法的运行时间为O(n2)O(n^2),减少的时间不止一点点。。
# coding=utf-8# 要覆盖的州
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, states in stations.items(): # items()存储键值(广播台和相应的覆盖州)covered = states_needed & states # 集合的交集,判断还未覆盖的州与此广播台的交集个数 if len(covered) > len(states_covered): # 如果当前广播台州交集的个数大于当前要覆盖的州 best_station = station # 就替换为最优的广播台states_covered = covered # 替换已经覆盖的州states_needed -= states_covered # 从要覆盖的州中减去已经覆盖过的(集合相减)print 'states_needed:',states_neededfinal_stations.add(best_station) # 添加最优的广播台print final_stations
结果:
========== RESTART: C:\Users\LiLong\Desktop\Algorithm\set_cover.py ==========
states_needed: set(['ut', 'ca', 'az', 'or', 'nv'])
states_needed: set(['ut', 'az'])
states_needed: set(['ut'])
states_needed: set([])
set(['ktwo', 'kthree', 'kone', 'kfive'])
>>>
得到了最终选的广播台集合是:’ktwo’, ‘kthree’, ‘kone’, ‘kfive’这4个
这只是个很简单的NP难得例子,还有其他的很多,有待进一步学习。。
参考:《算法图解》
贪婪算法近似集合覆盖问题的解相关推荐
- matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题
介绍 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法 贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解 ...
- 三十六、贪心算法--集合覆盖问题
一.贪心算法介绍 1.贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 2.贪心算法不是对所有问题都 ...
- 贪心算法讲解(集合覆盖问题,旅行商问题求解)
教室调度问题 假设有如下课程表,你希望将尽可能多的课程安排在某间教室上. 你没法让这些课都在这间教室上,因为有些课的上课时间有冲突. 你希望在这间教室上尽可能多的课.如何选出尽可能多且时间不冲突的课程 ...
- 贪心算法:集合覆盖问题
文章目录 贪心算法 教室调度问题 背包问题 集合覆盖问题 NP完全问题 总结 贪心算法 贪心算法是一种解决问题的思路:每一步选择局部最优解,最终也许不会得到最优结果,但是也会接近最优结果. 贪心算法具 ...
- 【算法图解】 之 [贪婪算法(贪心算法)] 详解
入门算法学习,看的第一本是深入浅出的<算法图解>一书,本博客是对<算法图解>一书的学习笔记,将书中的分享的算法示例用Python3语言实现. 如果你也想要阅读这本书,百度云盘链 ...
- 贪心算法【区间调度】【背包问题】【集合覆盖】【旅行商问题】【哈夫曼构造价值树】
贪心算法 在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择, ...
- 集合框架 Queue---BlockingQueue详解
转载自 集合框架 Queue---BlockingQueue详解 摘要:本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的 ...
- Java集合迭代器原理图解_Java Iterator接口遍历单列集合迭代器原理详解
这篇文章主要介绍了Java Iterator接口遍历单列集合迭代器原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 ...
- matlab求解集合覆盖问题,Set Cover Problem (集合覆盖问题)
流网络-最大流问题(Maximum-flow problem) image.png 希望从0-7找到最大值,管道可以承载的最大值. 那么目标函数是objective:maximize X01+X02+ ...
最新文章
- C++ OpenCV创建xml,yml文件(图像)列表程序
- 如何使用 Python 操作 Git 代码?GitPython 入门介绍
- JAVA sql2000 连接细节
- qs.parse()、qs.stringify()使用方法
- [待]-optee的native_intr_handler中断处理流程
- 会议交流 - CCKS2020 | 2020年全国知识图谱与语义计算大会
- iOS之深入解析weak关键字的底层原理
- [译]C#8.0中一个使接口更加灵活的新特性-默认接口实现
- .NET Core 3.0之深入源码理解Startup的注册及运行
- 关于ArcObjects图层编辑的读写编辑锁
- 9月20日等级考试试题答案实时追踪中
- Java入门到进阶推荐书籍
- AI初学者用什么软件?适合AI新手的9款人工智能开源软件
- 固高运动控制卡跟随运动(Follow 运动模式)
- 计算机病毒是通过内存传播吗,计算机病毒的工作过程
- 删除日志文件 空间不释放
- Liunx服务器创建新用户
- python解包exe_Pyinstaller打包的EXE之解包
- 关于mask蒙尘效果触发
- QPushButton按钮互斥效果
热门文章
- OpenCV简单的几何绘图的实例(附完整代码)
- OpenCV透视变换应用于图像的实例(附完整代码)
- QT的QMultiSampleAntiAliasing类的使用
- QT的QHoverEvent类的使用
- 简单阻容降压电路图_X2安规电容用于阻容降压容量衰减原因及对策
- 2cocos2dx别踩白块游戏案例
- Struts2中的链接标签 s:url和s:a
- 线性代数行列式计算之升阶法
- 检索数据_14_返回不重复的记录
- android dumpsys 分析,Android开发调试性能分析工具:dumpsys