贪心算法是用的比较多的一种优化算法,因为它过程简洁优美,而且结果有效。有些优化问题如最大权森林(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|。

  总结:贪心算法有这么多的条件限制,为什么还有这么被爱呢?开头说过了,因为它简洁优美。最关键的是,对于很多甚至说很大一部分问题,我们往往未必需要找出的它的最优解,近似最优已然足够。

参考资料:《组合最优化 算法和复杂性》

组合优化学习笔记<之>从贪心算法到子集系统再到拟阵的更多相关文章

  1. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集

    机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集 关键字:FPgrowth.频繁项集.条件FP树.非监督学习作者:米 ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析

    机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  4. [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)

    [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian) 贝叶斯公式 \[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\] 我们把P(A)称为"先 ...

  5. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. HMM模型学习笔记(前向算法实例)

    HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...

  7. KVM性能优化学习笔记

    本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...

  8. 深挖计算机基础:Linux性能优化学习笔记

    参考极客时间专栏<Linux性能优化实战>学习笔记 一.CPU性能:13讲 Linux性能优化实战学习笔记:第二讲 Linux性能优化实战学习笔记:第三讲 Linux性能优化实战学习笔记: ...

  9. Pandas 性能优化 学习笔记

    摘要 本文介绍了使用 Pandas 进行数据挖掘时常用的加速技巧. 实验环境 import numpy as np import pandas as pd print(np.__version__) ...

随机推荐

  1. CSS规则的优先级匹配

    CSS规则之间能够互相覆盖.这一点我们应该已经习以为常了.然而正是因为规则之间能够互相覆盖.子元素继承父元素的默认行为,导致了CSS冲突的问题. 碰到CSS冲突时.通常我们会增加一些更加具体的规则来明 ...

  2. [C++设计模式] proxy 代理模式

    代理模式:为其它对象提供一种代理以控制对这个对象的訪问. Proxy: 保存一个引用使得代理能够訪问实体.若RealSubject和Subject的接口同样,Proxy会引用Subject,就相当于在 ...

  3. python(27)- 面向对象练习Ⅰ

    一:定义如下类,并最大程度地重用代码(继承,派生:子类重用父类方法,组合) 老师类 学生类 分数类 课程类 生日类 class People: def __init__(self,name,age,b ...

  4. MySQL 压缩解决方案

    From:https://www.qcloud.com/community/article/876100 导语 描述 MySQL 压缩的使用场景和解决方案,包括压缩传输协议.压缩列解决方案和压缩表解决 ...

  5. JrtpLib vs2012环境下编译及使用 GotoFirstSourceWithData 方法 进不去

    项目中有一项功能是接收rtp数据,接收rtp的可以用PJMedia,可以用JrtpLib.PJMedia库无法解决内外网的问题,只有用Jrtp库了. 首先说下Jrtp 的编译问题,我是在windows ...

  6. nightwatch.js - scroll until element is visible

    .getLocationInView() Determine an element's location on the screen once it has been scrolled into vi ...

  7. TI C66x DSP 四种内存保护问题 -之- 针对CPU訪问外存(DDR3 or MSM)时的内存保护问题 - 举例

    在代码维护中遇到过这种问题,CPU訪问了corePac的外部内存空间0x75510C55地址,即CPU向corePac的L2内存控制器发起了对该内存的訪问,然后L2内存控制器将该请求发给corePac ...

  8. 为Redmine的项目加上起止时间

    没有时间约束的项目不是好项目. 要给项目配置起止时间,须要用到自己定义属性. 我们须要管理员身份登录.才干够定义自己定义属性. 自己定义属性 看图吧,先是点击页面导航条(最上面那排菜单,有主页.我的工 ...

  9. 系统安全-SElinux

    Selinux是[security-Enhanced Linux]的简称,是美国国家安全局[NSA]和[SCC]开发的Linux的一个扩张强制访问控制安全模块. 因为企业的业务平台的服务器上存储着大量 ...

  10. Kubernetes之网络策略(Network Policy)

    系列目录 概述 Kubernetes要求集群中所有pod,无论是节点内还是跨节点,都可以直接通信,或者说所有pod工作在同一跨节点网络,此网络一般是二层虚拟网络,称为pod网络.在安装引导kubern ...