组合优化学习笔记<之>从贪心算法到子集系统再到拟阵
贪心算法是用的比较多的一种优化算法,因为它过程简洁优美,而且结果有效。有些优化问题如最大权森林(MWF)是可以用贪心问题求解的,由于最小支撑树(MST)问题与MWF是等价的,所以MST也是可以用贪心算法求解。当然,贪心算法不是万能的(对于某些问题贪心算法并不能求得最优解,如旅行商问题(TSP)、最大匹配问题),但并不妨碍人们对它的喜爱。
贪心算法(greedy algorithm)伪代码:
input:一组带权的元素集合E; 一组条件集合C
output:找出集合A⊆E,使得A是满足C的所有E的子集中权值最大的子集
//“集合的权值”定义为:集合中所有元素的权值之和
//“满足C”定义为:满足C中的所有条件。这里设定空集是满足C的。
begin
A = {};
while E!={}
找出E中权值最大的元素,假设该元素是e;
E=E-{e};
if A+e 满足C
A=A∪{e};
end
//注:这里部分采用C语言的运算符定义。
// 即"="表示赋值; "!="表示不等号
从以上描述中可以看出来,过程很简单,可以说是简单暴力的。所以,我们很容易会产生疑问:这样的算法最后得出的解一定是全局最优解吗?
在回答之前,我们要搞清楚的是:当前要解决的问题实例对可行解的定义是什么?换句话说,我们要找的“最优解”是从哪个可行解集中找出来的。即,去掉“最优的”限制条件后,还有哪些条件。那么满足这些条件的所有集合就是可行解集,下一步就是从这个可行解集中找出一个最优的。到这里工作重点已然转化为找一个合适的优化算法。
其次,这个优化问题可以用贪心算法求出最优解吗?答案显然是不一定的。比如,我们要考虑:
(1)若可行解集无限且其权值不收敛,那必然是不能解的。因为这个问题实例本身是没有最优解的。
(2)可行解有限,或者无限但权值收敛的情况下,在以什么样的条件下定义出的可行解集中用贪心算法可以最后得到最优解呢?
先引入一个概念:子集系统
已知集合E={e1,e2,...,en}; I⊆P(E)且I以包含关系封闭。那么称二元组S=(E,I)为子集系统。I中每个成员称为独立集。
//注:P(E)表示E的幂集。
如A={1,2,3,4,5,6},B={{2},{2,4},{4,6},{2,4,6}},则(A,B)是子集系统。
再引入一个概念:拟阵
对于某个子集系统M=(E,I),若能用贪心算法找出I中权值最大的独立集,那么这个子集系统就是拟阵。
看起来似乎问题又绕回去了,没关系,下面3个命题的等价性可以解惑:
命题1:M是拟阵。
命题2:若Ep∈I,Ep+1∈I,且|Ep|=p,|Ep+1|=p+1,则∃e∈Ep+1-Ep,使得 Ep∪{e} ∈ I。
命题3:若A⊆E,且Ep,Ep+1是A的两个极大独立集,则|Ep|=|Ep+1|。
总结:贪心算法有这么多的条件限制,为什么还有这么被爱呢?开头说过了,因为它简洁优美。最关键的是,对于很多甚至说很大一部分问题,我们往往未必需要找出的它的最优解,近似最优已然足够。
参考资料:《组合最优化 算法和复杂性》
组合优化学习笔记<之>从贪心算法到子集系统再到拟阵的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集
机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集 关键字:FPgrowth.频繁项集.条件FP树.非监督学习作者:米 ...
- 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析
机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...
- 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)
机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...
- [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)
[ML学习笔记] 朴素贝叶斯算法(Naive Bayesian) 贝叶斯公式 \[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\] 我们把P(A)称为"先 ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- HMM模型学习笔记(前向算法实例)
HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...
- KVM性能优化学习笔记
本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...
- 深挖计算机基础:Linux性能优化学习笔记
参考极客时间专栏<Linux性能优化实战>学习笔记 一.CPU性能:13讲 Linux性能优化实战学习笔记:第二讲 Linux性能优化实战学习笔记:第三讲 Linux性能优化实战学习笔记: ...
- Pandas 性能优化 学习笔记
摘要 本文介绍了使用 Pandas 进行数据挖掘时常用的加速技巧. 实验环境 import numpy as np import pandas as pd print(np.__version__) ...
随机推荐
- Mysql的四种key
我们看到Key那一栏,可能会有4种值,即 '','PRI','UNI','MUL'1. 如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列2. 如果K ...
- 树莓派 Zero W——随身钥匙扣
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正确的格式显示,请访问我的博客原文: http://www.cnblogs.c ...
- SWTBOK測试实践系列(5) -- 项目中使用手动和自己主动化的策略
手动測试和自己主动化測试永远是一个非常热门的话题.自己主动化也一直被人们捧上神坛.自己主动化測试和手动測试从技术上来说本质事实上都是測试用例设计.仅仅只是终于形式一个是人工运行,一个是代码运行罢了.这 ...
- vue2.0 自定义过滤器
2.0中已经废弃了过滤器,需要我们自定义 <div id="app"> {{message|uppercase}} </div> //过滤器 Vue.fil ...
- web前端面试系列 - 数据结构(两个栈模拟一个队列)
一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将 ...
- Django-extra的用法
## select提供简单数据 # SELECT age, (age > 18) as is_adult FROM myapp_person; Person.objects.all().extr ...
- php中屏蔽date的错误
php中添加 date_default_timezone_set('asia/shanghai'); 可以屏蔽 <?php echo date('Y-m-d',$row3['time']); ...
- eclipse中run as无run as server选项的解决方案
在项目->右击->Properties->Project Facets->Modify Project,选择Java和DynamicWeb Module
- Linux系统目录数和文件数限制
对于系统管理员来说,了解系统的一些限制是非常有必要的,这样可以根据需要进行必要的参数配置和调整,进而实现更优的性能,对于系统设计人员甚至程序员来说,了解系统的一些限制,也会有助于设计更为合理的存储结构 ...
- 在与SQL Server 建立 连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器