matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题
介绍
贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法
贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。
应用场景-集合覆盖问题
假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号
image
思路分析:
如何找出覆盖所有地区的广播台的集合呢,使用穷举法实现,列出每个可能的广播台的集合,这被称为幂集。假设总的有n个广播台,则广播台的组合总共有�2ⁿ -1 个,假设每秒可以计算10个子集, 如图:
image
效率低下,运算量大。
使用贪婪算法
使用贪婪算法,效率高:
目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合:
遍历所有的广播电台, 找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但没有关系)
将这个电台加入到一个集合中(比如ArrayList), 想办法把该电台覆盖的地区在下次比较时去掉。
重复第1步直到覆盖了全部的地区
image
步骤:
定义一个maxkey,用于保存选择的广播电台占最多未选择的地区的值。
每次轮询广播台时,都需要一个临时hashSet去retain判断是否有更好的广播台。
贪心算法注意事项和细节
贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果
比如上题的算法选出的是K1, K2, K3, K5,符合覆盖了全部的地区
但是我们发现 K2, K3,K4,K5 也可以覆盖全部地区,如果K2 的使用成本低于K1,那么我们上题的 K1, K2, K3, K5 虽然是满足条件,但是并不是最优的.
代码
public static void main(String[] args) {
//创建广播电台,放入到Map
HashMap> broadcasts = new HashMap>();
//将各个电台放入到broadcasts
HashSet hashSet1 = new HashSet();
hashSet1.add("北京");
hashSet1.add("上海");
hashSet1.add("天津");
HashSet hashSet2 = new HashSet();
hashSet2.add("广州");
hashSet2.add("北京");
hashSet2.add("深圳");
HashSet hashSet3 = new HashSet();
hashSet3.add("成都");
hashSet3.add("上海");
hashSet3.add("杭州");
HashSet hashSet4 = new HashSet();
hashSet4.add("上海");
hashSet4.add("天津");
HashSet hashSet5 = new HashSet();
hashSet5.add("杭州");
hashSet5.add("大连");
//加入到map
broadcasts.put("K1", hashSet1);
broadcasts.put("K2", hashSet2);
broadcasts.put("K3", hashSet3);
broadcasts.put("K4", hashSet4);
broadcasts.put("K5", hashSet5);
//allAreas 存放所有的地区
HashSet allAreas = new HashSet();
allAreas.add("北京");
allAreas.add("上海");
allAreas.add("天津");
allAreas.add("广州");
allAreas.add("深圳");
allAreas.add("成都");
allAreas.add("杭州");
allAreas.add("大连");
//创建ArrayList, 存放选择的电台集合
ArrayList selects = new ArrayList();
//定义一个临时的集合, 在遍历的过程中,存放遍历过程中的电台覆盖的地区和当前还没有覆盖的地区的交集
HashSet tempSet = new HashSet();
//定义给maxKey , 保存在一次遍历过程中,能够覆盖最大未覆盖的地区对应的电台的key
//如果maxKey 不为null , 则会加入到 selects
String maxKey = null;
while(allAreas.size() != 0) { // 如果allAreas 不为0, 则表示还没有覆盖到所有的地区
//每进行一次while,需要
maxKey = null;
//遍历 broadcasts, 取出对应key
for(String key : broadcasts.keySet()) {
//每进行一次for,把tempSet。clear
tempSet.clear();
//当前这个key能够覆盖的地区
HashSet areas = broadcasts.get(key);
tempSet.addAll(areas);
//求出tempSet 和 allAreas 集合的交集, 交集会赋给 tempSet
tempSet.retainAll(allAreas);
//如果当前这个集合包含的未覆盖地区的数量,比maxKey指向的集合地区还多
//就需要重置maxKey
// tempSet.size() >broadcasts.get(maxKey).size()) 体现出贪心算法的特点,每次都选择最优的
if(tempSet.size() > 0 &&
(maxKey == null || tempSet.size() >broadcasts.get(maxKey).size())){
maxKey = key;
}
}
//maxKey != null, 就应该将maxKey 加入selects
if(maxKey != null) {
selects.add(maxKey);
//将maxKey指向的广播电台覆盖的地区,从 allAreas 去掉
allAreas.removeAll(broadcasts.get(maxKey));
}
}
System.out.println("得到的选择结果是" + selects);//[K1,K2,K3,K5]
}
结果:
image
matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题相关推荐
- 贪心算法讲解(集合覆盖问题,旅行商问题求解)
教室调度问题 假设有如下课程表,你希望将尽可能多的课程安排在某间教室上. 你没法让这些课都在这间教室上,因为有些课的上课时间有冲突. 你希望在这间教室上尽可能多的课.如何选出尽可能多且时间不冲突的课程 ...
- matlab 求解目标规划的序贯算法
求解目标规划的序贯算法 clc,clear; x=optimvar('x',2,'LowerBound',0); dp=optimvar('dp',4,'LowerBound',0); dm=opti ...
- matlab 求解 Ax=B 时所用算法
x = A\B; x = mldivide(A, B); matlab 在这里的求解与严格的数学意义是不同的, 如果 A 接近奇异,matlab 仍会给出合理的结果,但也会提示警告信息: 如果 A 为 ...
- matlab ax=b x=,matlab 求解 Ax=B 时所用算法
Weblogic是瓦特?和JVM是瓦特关系? 所谓固定内存60M是瓦特? 以下内容是个瓦特? "总内存大小=堆内存+非堆内存1200m:为堆内存大小,如果不指定后者参数则有最大数限制,网上很 ...
- 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码
1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...
- 算法导论之贪心算法(Huffman编码和拟阵)
贪心算法,在解决最优化问题上,通过得到子问题的局部最优解来合成问题的一个解,以局部最优选择来输出一个全局最优解. 问题要用贪心算法来求解,需满足和动态规划一样的最优子结构特征,同时还需要再每个子问题最 ...
- 活动安排问题的 动态规划和贪心算法
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- 从 活动选择问题 看动态规划和贪心算法的区别与联系
这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...
- 算法设计与分析:贪心算法 - 排课问题(DP与贪心的区别与应用)
文章目录 前言 贪心算法概念 排课问题 问题描述与分析 动态规划求解 简化问题应用贪心算法 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 前面两大章节的内容分治思想与动态规划暂时告一段 ...
最新文章
- python集合中的元素是否可以重复_python中集合中的元素是否可以重复
- 一步一步深入spring(6)--使用基于XML配置的spring实现的AOP
- linux服务器插上硬盘不能开机,Linux服务器添加新硬盘无法识别解决方法(无需重启)...
- Anaconda配置的环境里面增加第三方库的方法
- C++ rand,srand用法
- php 网路io是什么意思,io接口位于什么和什么之间
- 进程,线程,协程的区别与联系
- gc buffer busy release
- JAVA毕业设计Web企业差旅在线管理系统计算机源码+lw文档+系统+调试部署+数据库
- 达梦数据库学习之备份还原
- html m3u8 flash,m3u8插件-支持在pc端(flashplayer)播放m3u8格式文件-ckplayer使用方法...
- HDU1556--涂气球
- 基于jsp的KTV管理系统mysql
- Arcgis二次开发——建立自己的小工程
- 13 PHP次末跳弹出pemultimate hop popping
- Qt编写地图综合应用19-地图服务
- Mac系统Jython安装与使用
- SysFader IEXPLOER.EXE-应用程序错误的解决办法
- 整型数组处理算法(十三)请实现一个函数:凑14。[风林火山]
- 从富士康流水线工人到某支付公司技术总监的心路历程