算法课笔记系列(九)——近似算法(Part1)

这一周的内容是近似算法(Approximation Algorithm)。

对于许多的问题的算法,我们通常目标在于设计一个可以在多项式时间内运行的算法。然而,上一节的NP问题告诉我们这样的算法不一定存在。近似算法其实是针对NP难问题的一种退让,对于许多P不等于NP的最优化问题,无法在多项式时间内找到最优解。因此,如果可以只求一个我们可以接受的解,而不是非要最优解,那么可能存在一个多项式时间的算法。

因此,这里的“近似”其实就是针对最优化问题而言的。其主要应用也是用来解决最优化的问题,并且要求其时间花销为多项式级别的时间。

首先,提出一个NP的优化问题,即NPO问题。

不同的NOP问题的相似程度可能有非常大的差别。

一个NP优化问题P可以用一个四元组(I, Sol, m, goal)来表示,也就是:

I : I是P的实体的集合,可以在多项式时间内被识别;

Sol: 给定一个x∈  I, Sol(x)表示x的可能的解的集合;对于任意的y∈  Sol(x), |y|是|x|的多项式;给定任何|x|的多项式x和y,如果有y∈  Sol(x),那么这个问题可以在多项式时间内决定。

m: 给定一个实例x∈  I,y∈  Sol(x), y是x的一个可行解,m(x,y)表示y的值,并且,可以在多项式时间内被解决的函数

Goal ∈ {max, min}。表示这是一个最大化问题还是最小化问题。

下面定义一个NPO类:

类NPO是所有NP优化问题的集合。NPO问题的目标是,对于一个实体x,找到一个最优解,也就是一个可行解y使得m(x,y)=goal{m(x,y’): y’∈ Sol(x)}.

近似算法则是给定一个NP优化问题P=(I,Sol, m, goal),一个算法A是一个近似算法则对于P,如果给定任意的实例x∈  I, 它返回一个近似解,也就是一个有着保障质量的可行解A(x) ∈Sol(x) 。这里的保障的质量是只在近似与启发法之间的差异。

对于一个近似算法,我们关心以下两点:

1.      算法的时间复杂度(必须为多项式级的)

2.      解的近似程度(可能与算法设计、问题规模、输入实例等有关)

为了衡量解的近似程度,提出了近似比。

令P为一个NPO问题,给出一个实例x和x的一个可行解y,我们定义y对于x的一个性能比值为

r-近似的定义为:

给定一个优化问题P和一个P的近似算法A,A被称为一个r近似算法则对于P,如果给定P的任意实例x,近似算法A(x)的性能比界为r,即

下面定义F-APX,给定一类函数F,一个NPO问题P属于类F-APX如果一个r近似多项式时间算法A对于P存在,对于某个函数r∈ F。

一个NPO问题P属于类PTAS如果一个算法A存在使得对于任意有理数ε> 0, 当将A应用到输入(x, ε), 它返回x的一个(1+ε)近似解在|x|的多项式时间内。通俗解释说,任意给定一个ε,这种“模式”都可以在多项式时间内完成,并且可以任意的逼近最优解。但是,随着ε变小,所花的时间可能急剧增多,比如O(n^2/ε)O(n^2/ε)。

这样的“模式”称为多项式时间近似模式(Polynomial-time approximation scheme,简称PTAS)。

FPTAS(Full PTAS)则是,如果一个算法A存在使得对于任意有理数ε> 0, 当将A应用到输入(x, ε), 它返回x的一个(1+ε)近似解在|x|和1/ε的多项式时间内.

如果P不等于NP,那么.

下面开始一些实际的例子。首先是从贪心算法的角度,下周将接触到从序列算法的角度。

使用贪心算法的角度的流程是,给定一个问题的实例指定一组条目。目标是决定满足问题限制的条目的一个子集,最大化或者最小化评价函数。具体步骤为,首先根据一些标准对这些条目进行排序,接着从空集开始增量的建立问题的解,一次只考虑一个条目,然后保持被选择了的条目的集合;当达到问题的限制条件时,终止。

1.   集合覆盖问题

给定一个有n个元素的集合 ,U的一个子集的集合为 ,目标是找到一个子集能够覆盖U的所有元素。测量函数为计算选择子集的总成本,

算法实现为:

一个集合S的成本有效性是指它覆盖新元素时的平均成本,一个元素e的成本是当e被覆盖时的平均成本。贪心集合覆盖的时间复杂度为O(mn)。

贪心集合覆盖时一个对于最小集合覆盖问题的Hn因子近似算法,其中,即调和数。(Log-APX)

最优覆盖的成本为1+ε,当贪心算法将输出覆盖的成本为

2.   最大背包问题

给定一个包含条目的有限集合X和一个正整数b,对于每一个xi∈ X,有一个价值pi∈ Z+,和一个大小ai∈ Z+。

我们目标是找到条目的一个集合使得,测量函数为计算选择条目的总价值测量函数为计算选择自己的总成本
.

贪心背包问题的复杂度为O(nlogn),对于该算法的近似比,事实上,贪心背包问题的解从最优值而言可以是任意远的。贪心背包的糟糕性能是因为算法并不能包含有着最高性能的利益的元素当最优解仅仅包含这个元素时。

3.   最大独立集问题

给定一个图G=(V,E),目标是为了在G上找到一个独立集, 使得对于任意的边 (u, v) ∈ E,有u ? V‘或者 v ? V‘。一个立方体有6个最大独立集(下图中红色结点标注)

给出一个有n个顶点和m条边的图G,令,贪心独立集的近似比为

Reference:

http://zhangxiaoyang.me/categories/intro-to-algorithms-tutorial/intro-to-algorithms-tutorial-9.html

时间: 2024-08-02 06:48:08

算法课笔记系列(九)——近似算法(Part1)的相关文章

算法课笔记系列(六)—— 图(Part2)

上一周去了一趟说走就走的治疗之旅,所以算法课都没能上.:( 不过,人生有过这样一次,很足够.只要永远做自己认为对的事情就不会有跨不过去的坎. 跟上周一样,这一周的内容包含几个小部分,分别为最短路径动态规划.所有点对之间的最短路径和网络流. 第一部分:最短路径动态规划 对于一个有向图G=(V, E), 每一条边权重为cvw(权重可为负), 问题是找到从节点s到t的最短的路径.如果边的权重中有负值,则Dijkstra方法不适用.因此我们想到一个办法,给每一个权值加上一个正常数使得每一条边的权重都为非

算法课笔记系列(七)—— 平摊分析

本周的内容是Amortized Analysis,是对算法复杂度的另一种分析.它的基本概念是,给定一连串操作,大部分的操作是非常廉价的,有极少的操作可能非常昂贵,因此一个标准的最坏分析可能过于消极了.因此,其基本理念在于,当昂贵的操作也别少的时候,他们的成本可能会均摊到所有的操作上.如果人工均摊的花销仍然便宜的话,对于整个序列的操作我们将有一个更加严格的约束.本质上,均摊分析就是在最坏的场景下,对于一连串操作给出一个更加严格约束的一种策略. 均摊分析与平均情况分析的区别在于,平均情况分析是平均所

算法课笔记系列(八)——NP问题及其计算复杂性

本周的内容是NP问题,NP的全称是Non-deterministic Polynomial,即多项式复杂程度的非确定性问题.百度上对NP的解释是,P/NP问题是在理论信息学中计算复杂度理论里至今没有解决的问题.通俗的说,是将不可知的问题转化为已知的问题,进而计算器复杂度. 首先介绍多项式时间的约减,即Polynomial-Time Reductions,通过解决另一个不同问题的假设的子程序,使用不包含子程序在内的多项式时间来解决一个问题的方法.主观上,一个多项式时间约减证明了第一个问题不比第二个

Java基础复习笔记系列 九 网络编程

Java基础复习笔记系列之 网络编程 1. 2.

算法学习笔记系列——分治法

一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换). 二.基本思想及策略 分治法设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 分治策略是:对于一个规模为n的问题,若该

算法学习笔记系列——动态规划法

一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解.依次解决各子问题,最后一个子问题就是初始问题的解. 由于动态规划解决

算法学习笔记(九)有限状态机 FSM 的应用

一个问题:Beautiful String 这是2014微软校招的编程题,题意大致如下: 如果一个字符串包括三组或者更多组的连续升序字母,每组长度相等,那么我们就称这个字符串是Beautiful String 符合Beautiful String举例:abc, cde, aabbcc, aaabbbccc 不符Beautiful String举例:abd,cba,aabbc,zab 输入一个只含有小写字母的字符串,如果它含有一个Beautiful的子串,就输出YES,否则输出NO 输入: 第一行

七月算法--12月机器学习在线班-第十九次课笔记-深度学习--CNN

七月算法--12月机器学习在线班-第十九次课笔记-深度学习--CNN 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 1,卷积神经网络-CNN 基础知识 三个要点 1: 首先将输入数据看成三维的张量(Tensor) 2: 引入Convolution(卷积)操作,单元变成卷积核,部分连接共享权重 3:引入Pooling(采样)操作,降低输入张量的平面尺寸 ,1.1 张量(Tensor) 高,宽度,深度,eg:彩色图像:rgb,3个深度,图

七月算法-12月机器学习在线班--第十七次课笔记-隐马尔科夫模型HMM

七月算法-12月机器学习--第十七次课笔记-隐马尔科夫模型HMM 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 隐马尔科夫模型 三个部分:概率计算,参数估计,模型预测 1,HMM定义 HMM由初始概率分布π.状态转移概率分布A以及观测概率分布B确定. Eg:以中文分词为例子 隐状态为="2",是不是终止字,是/否?(Y/N)即是不是最后一个字. A矩阵:第一个:当前是终止字,下一个也是终止字的概率 B是当前的隐状态是终止词,