算法设计 第十一章 近似算法



1 近似算法

存在一些难解的问题,不能有效的找到最优解,如何做?降低标准,寻找足够优的解。
优化中的常见现象,将问题松弛或者将非凸问题转为凸问题,等等。降低求解复杂度,找到一个最够优的解。

1.1 近似率:

X是一个极大化问题,A是求解X的算法。 x A x_{A} xA是算法A求出的解, x ∗ x_{*} x是最优解。
如果A的解至少是 1 a \frac{1}{a} a1的最优解, x A ≥ 1 α x ∗ x_{A}\ge\frac{1}{\alpha}x_{*} xAα1x,则A是 α \alpha α-近似算法。
对于极小化问题, x A ≤ α x ∗ x_{A}\leq{\alpha}x_{*} xAαx

2例子

2.1集合覆盖 set cover

给定集合的集合 F = { S 1 , . . . , S n } F=\{S_1,...,S_n\} F={S1,...,Sn} ∪ S i = X \cup S_i=X Si=X,每个集合 S i S_i Si有对应的成本,我们希望找到 F F F的子集,覆盖所有元素。每个 S i S_i Si的成本相同,本质希望找到最少的子集来覆盖所有元素。
在这里插入图片描述

2.1.1 贪婪近似算法

当我们选择一个集合之后,删除已经被覆盖的元素。然后我们选择每个单位成本最小的集合直到覆盖所有元素。本质上每次选择覆盖未覆盖元素最多的集合。

  • U = X U=X U=X
  • C = C={} C=
  • whille U ≠ \not = = {}
    S ∈ F − C S\in F-C SFC with min c o s t ( S ) / ∣ S ∩ U ∣ cost(S)/|S\cap U| cost(S)/SU
    C = C ∪ S C=C\cup {S} C=CS
    U = U − S U=U-S U=US
  • output C C C

2.1.2 计算近似率

选择的集合按照先后顺序为 S 1 , S 2 , … , S m S_1,S_2,\dots,S_m S1,S2,,Sm
n i n_i ni是选择 S i S_i Si时,其覆盖的新元素个数。
元素被覆盖的顺序 e 1 , e 2 , … , e n e_1,e_2,\dots,e_n e1,e2,,en
S j S_j Sj第一次覆盖新元素 e k e_k ek
C 1 , . . . C_1,... C1,...是最优覆盖中的部分集合,覆盖了 e k , … , e n e_k,\dots,e_n ek,,en n i ′ n_i' ni是其覆盖的对应元素个数。不仅仅是 e k , … , e n e_k,\dots,e_n ek,,en中的元素。

  • 1 ∑ i n i ′ ≥ n − k + 1 \sum_i n_i'\ge n-k+1 inink+1, ∑ i c o s t ( C i ) ≤ O P T \sum_i cost(C_i)\leq OPT icost(Ci)OPT因为 C i , . . . C_i,... Ci,...也可能覆盖了其他元素,是从最优覆盖中选择的部分集合。
  • 2 C 1 , . . . . C_1,.... C1,....没有与 S 1 , . . . S j − 1 S_1,...S_{j-1} S1,...Sj1重复的。假设某个 C i C_i Ci S 1 , . . . S j − 1 S_1,...S_{j-1} S1,...Sj1中,则 e k e_k ek之后的元素会被某个 S i ( i ∈ [ 1 , j − 1 ] ) S_i(i\in[1,j-1]) Sii[1,j1]覆盖,矛盾。
  • 3 ∑ i c o s t ( C i ) / ∑ i n i ′ ≤ O P T / ( n − k + 1 ) \sum_i cost(C_i)/\sum_i n_i'\leq OPT/(n-k+1) icost(Ci)/iniOPT/(nk+1)==>存在某个 c o s t ( C i ) / n i ′ ≤ O P T / ( n − k + 1 ) cost(C_i)/n_i'\leq OPT/(n-k+1) cost(Ci)/niOPT/(nk+1)
  • 4 c o s t ( S j ) / n j cost(S_j)/n_j cost(Sj)/nj贪婪算法选出的,所以 c o s t ( S j ) / n j ≤ c o s t ( C i ) / n i ′ cost(S_j)/n_j\leq cost(C_i)/ n_i' cost(Sj)/njcost(Ci)/ni(有个问题这里的 n ′ n' n不是覆盖的新元素个数, ≤ \leq 未必成立啊??)
  • 对于每个k都存在满足3和4的 C i C_i Ci
  • ∑ k c o s t ( e k ) ≤ ∑ k c o s t ( C i ) / n i ′ ≤ ∑ k O P T / ( n − k + 1 ) ∼ l n ( n ) ∗ o p t \sum_k cost(e_k)\leq\sum_k cost(C_i)/ n_i'\leq \sum_kOPT/(n-k+1)\sim ln(n) *opt kcost(ek)kcost(Ci)/nikOPT/(nk+1)ln(n)opt

2.2 时序问题 scheduling

n个独立的工作,m个处理器,给每个处理器分配任务,使得完成时间最早。
在这里插入图片描述

2.2.1 近似算法一

将工作任意排序,然后分配任务给每个处理器,优先分配给该时刻没有任务的处理器。

2.2.2 近似率

在这里插入图片描述
假设最优的makespan的 M ∗ M^* M

  • M ∗ ≥ t M^*\ge t Mt 因为要完成工作 X X X
  • M ∗ > T M^*>T M>T 因为T时刻之前的工作是满的。
  • M ∗ > m a x ( T , t ) M^*>max(T,t) M>max(T,t)
  • M = T + t ≤ 2 M ∗ M=T+t\leq2M^* M=T+t2M

2.2.3 近似算法二

按照工作时间长短排序,工作时间长则优先处理。makespan 是 M M M

2.2.4 近似率二

M = t + T ≤ t + M ∗ M=t+T\leq t+M^* M=t+Tt+M

  • if t ≤ M ∗ / 3 t\leq M^*/3 tM/3,==> M ≤ 4 M ∗ / 3 M\leq4M^*/3 M4M/3
  • if t > M ∗ / 3 t> M^*/3 t>M/3则所有任务的尺寸不小于 M ∗ / 3 M^*/3 M/3,最优算法时每个处理器最多处理两个任务,此时该算法返回最优解。

算法一是online 可以实时操作,算法二需要知道所有任务的尺寸。

2.3背包问题 knapsack

2.4 点集覆盖 vertex cover

G(V,E) 找到一个V的子集覆盖所有边E。尽可能选择最少的点。

2.4.1 近似算法

思路:找到一个最优的边集覆盖。

  • 选择E中的任意一边 ( u , v ) (u,v) (u,v)
  • u , v {u,v} u,v是我们选择的边。
  • 移除所有与 u , v {u,v} u,v连接的点。如下图所示:
    在这里插入图片描述

2.4.2近似率

该算法是2-近似,设 C ∗ C^* C是最优解。 A A A是近似算法选出的边。注意这里是边,不是点。
C = 2 ∗ ∣ A ∣ ≤ 2 ∗ ∣ C ∗ ∣ C=2*|A|\leq 2*|C^*| C=2A2C

2.5 旅行商问题 TSP

  • 输入一个完全图
  • 输出最小的距离的环,经过所有的点。
  • 假设符合三角不等式。

2.5.1 近似算法1

  • 最小生出树 T T T
  • 访问树中所有节点,允许重复 T ′ T' T
  • 跳过重复的节点 H H H
  • 在这里插入图片描述

2.5.2 近似率

设最优解为 H ∗ H^* H
因为 T T T是最小生成树, c ( T ) ≤ C ( H ∗ ) c(T)\leq C(H^*) c(T)C(H)
T经过所有点两次 c ( T ∗ ) = 2 c ( T ) c(T^*)=2c(T) c(T)=2c(T)
因为 H H H T ∗ T^* T经过shortcut之后的, c ( H ) ≤ c ( T ∗ ) c(H)\leq c(T^*) c(H)c(T)
总是 c ( H ) ≤ c ( T ′ ) = 2 c ( T ) ≤ 2 c ( H ∗ ) c(H)\leq c(T')= 2c(T)\leq 2c(H^*) c(H)c(T)=2c(T)2c(H)

2.5.3 近似算法2

Euler tour:访问图中的所有边一次,当且仅当所有的点有偶数度。

  • 最小生成树T

  • 找到奇数度的点V’

  • 构造最小的,完美匹配(一个点只与一个点相连)M

  • 在这里插入图片描述

  • 将M添加到T中获得T’,所有的点都是偶数度。

  • 得到T’的 Euler tour T’’

  • shortcut T’’ 去获得H

2.5.4

H’是V’(奇数度点)的最优TSP
最小完美匹配M,因为每个点只有一个match,而且是最小的, H ′ H' H有两个match c ( M ) ≤ c ( H ′ ) / 2 ≤ c ( H ∗ ) / 2 c(M)\leq c(H')/2\leq c(H^*)/2 c(M)c(H)/2c(H)/2
c ( H ) ≤ c ( T ∗ ) = c ( M ) + c ( T ) ≤ c ( H ∗ ) / 2 + c ( H ∗ ) c(H)\leq c(T^*)=c(M)+c(T) \leq c(H^*)/2+c(H^*) c(H)c(T)=c(M)+c(T)c(H)/2+c(H)

2.6k-center 问题

n个sites 我们想建立k个中心来服务他们,每个site选择离它最近的中心。
我们想要极小化最大的服务距离。

2.6.1算法

选择site作为中心
每次选择里中心最远的site作为中心。

2.6.2 近似率

r = m a x S m i n C d ( s , c ) r=max_Smin_Cd(s,c) r=maxSminCd(s,c)
这里有k+1个点距离不小于 r r r,k个中心,以及剩下一个到中心最大距离的site。
假设 r > 2 r ∗ r>2r^* r>2r
在这里插入图片描述
每个圆需要一个中心来服务圆心的site,导致第 k + 1 k+1 k+1个无法被服务。因此 r ≤ 2 r ∗ r\leq 2r^* r2r

2.7加权点集覆盖weighted vertex cover

建模为整数规划问题
在这里插入图片描述
松弛为线性规划
在这里插入图片描述

在这里插入图片描述

3 复杂度总结

在这里插入图片描述

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个大二数据结构与算法的计划表的详细内容: 1. 第一学期 - 第一周:学习基本数据结构,如数组、链表和栈等。 - 第二周:深入学习栈和队列,包括栈和队列的应用。 - 第三周:学习二叉树的基本概念,如二叉树的遍历和搜索等。 - 第四周:学习平衡二叉树,如AVL树和红黑树等。 - 第五周:学习哈希表和散列表,包括哈希函数的设计和冲突解决方法。 - 第六周:学习图论基础概念,如图的表示和遍历等。 - 第七周:学习最短路径算法,如Dijkstra算法和Floyd算法等。 - 第八周:学习最小生成树算法,如Prim算法和Kruskal算法等。 - 第九周:学习字符串匹配算法,如暴力法和KMP算法等。 - 第十周:学习动态规划算法,包括背包问题和最长公共子序列等。 2. 第二学期 - 第一周:学习高级数据结构,如堆、优先队列和B树等。 - 第二周:学习算法设计与分析的基本知识,如递归和分治等。 - 第三周:学习贪心算法,如活动安排问题和霍夫曼编码等。 - 第四周:学习回溯算法,如八皇后问题和0/1背包问题等。 - 第五周:学习分支限界算法,如旅行商问题和硬币找零问题等。 - 第六周:学习网络流算法,如最大流和最小割等。 - 第七周:学习NP完全性理论和近似算法,如NP完全问题和近似算法等。 - 第八周:学习并行算法和分布式算法的基础知识。 - 第九周:学习排序算法,如快速排序和归并排序等。 - 第十周:进行算法综合实践,包括问题分析、算法设计和代码实现等。 以上是一个大二数据结构与算法的计划表的详细内容,具体实施还需要根据教学计划和个人情况进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值