算法设计习题(12-13)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文是对于算法设计的相关习题。有错误,请不吝赐教。


一、第十二章

从之前的几章中,我们了解了对于处理难计算问题的技术。其中包括考虑有特殊结构的情况以及设计多项式时间的近似算法。在这一章,我们考虑最后一个主题局部搜索算法。
1.最优化问题的地形图
类似于物理的势能,我们考虑几种不同的地理类型:漏斗结构,双漏斗结构以及锯齿漏斗。
我们类似的考虑有一个费用函数C,它度量每一个解的质量,我们目标是找一个具有费用尽可能小的解。
解上的邻居关系。
局部搜索考虑选择则当前解的一个邻居将其作为新的解,并记住费用最好的解。
例如顶点覆盖,我们考虑邻居关系:考虑删去或者添加一个顶点能够从S到S’。
梯度下降法:设S表示当前的解,如果S有费用更小的邻居S’,则选择费用尽可能小的邻居,否则计算结束。
但是对于某些特殊情况下,会陷入局部最有解。

2.Metropolis算法与模拟退火
第一个改进的局部搜索算法的思想为模拟退火。
在这里插入图片描述其中T>0是温度,K>0是常数。

补充:对于任意温度T,函数关于能量E是单调减少的。当T很小时,那么低能量的状态要明显大于高能量状态的开率。反之则,两者之间的概率差不多。

算法保存当前的状态,并通过某种扰动来产生新的状态,其中假设新的状态的个数是有限的,我们把它记作C。在每一步中,我们产生一个新的状态S‘,考虑ES 和ES‘,如果ES‘<=ES,那么状态更新。否则令x=ES’-ES,同时以概率e^-x/kT 概率更新当前状态。
由此可以知道MeTropolis算法以一定概率接受向上运动,因此处于局部最小点时也能取得进步。
算法的具体描述如下:

开始时有初始解S0 和常数k,T
在一步中:
设S是当前解
从S的所有邻居中等可能的随机选择一个解S1
if cs1<cs then
  s=s1
 else 
 以概率 e^-cs1-cs/kt更新解
endif

可以认为参数T控制算法在多大程度上接受向上移动。
算法有一定的纠错能力,但对于简单图不一定会得到最优解。
模拟退火:
我们依旧运行Metropolis算法,同时在整个过程中逐渐降低T的值。

我们可以思考:当温度高时模拟退火算法考虑到执行早期阶段解的大变化,随着搜索的进行,降低取消已得到进步的退化。但是同样模拟退火算法无法保证找到最优解。

3.局部搜索对Hopfield神经网络的应用
对于某些问题我们所需要的实际上只是任意的局部最优解。
我们现在考虑求Hopfield神经网络的稳定格局。
考虑单反转算法:

While 当前格局不是稳定的
一定有不满足的节点
选择一个不满足的节点u
翻转u的状态
endwhile

每一次翻转时,由于节点u是个不满足节点,所以翻转得到的好边一定更好,且不超过所有好边的和W。
在每一次迭代中能够用n的多项式时间来发现一个不满足的节点,所以时间是关于n和W的多项式的运行时间。

4.局部搜索对最大割近似的应用
此处考虑邻近解:如果有一个节点u使得将u划分到另一边节点的集合使得所有边的权之和大于分在同一边节点,那么我们将u移动。
此时算法的解为伪多项式时间复杂度的。
为了改进,我们让算法只接受较改进的反转。

5.选择邻居关系
考虑比单翻转规则生成更大邻域同时减少局部最优解过多数量的邻居关系。
K-L启发式算法具体如下:
选择一个反转的节点,无论反转的结果如何,都进行反转得到对应的解(A1,B1)
同理,重复n次,将这n个解认为时当前解的邻居。
它只执行n次翻转,每次只用On执行时间,由此可知他比k翻转算法要合理。

6.用局部搜索分类
考虑好的邻居(不在穷举)
考虑k个标签的分类问题。
局部搜索邻域:
我们考虑标记f,取一个标签a属于L,并把注意力放在f中标签不为a的节点上。要允许这些节点的任意子集用一个局部步骤把他们的标签改为a。
利用网络流,我们将源点s表示标记a,汇点t表示维持原来不变,我们来找最小割。
如果i和j都在汇的一边,考虑用一个e节点同时添加3条边来表示两者的分离。(即在t一边,但两者标签不同)
可知算法时最小罚分的2近似。(具体证明?)
改进类似于最大割。

7.最佳响应动态过程与Nash平衡点
不同代理目标下的平衡(博弈论)
由此我们证明了永远存在Nash平衡点并且永远有一个Nash平衡点的总费用不超过社会性最优解的Hk倍。
(类似的Hopfield问题也可以看作最佳响应动态过程)

1.1 带解答的练习

1.1.1 练习1

在这里插入图片描述a)我们考虑一个对应的进展量:覆盖半径,很自然的想到他是因为覆盖半径不可能小与最优半径。如果每次覆盖半径都缩小,那么算法一定会结束。
可知步骤ii结束时的k个集合的划分是有限个,所以算法会最终终止。(如果得到两个相同的集合划分,那么覆盖半径也是相同的)

b)我们考虑反例如下:
对于任意的常数b>1,我们考虑平面上的4个点的集合S,这4个点构成宽w和高h=2bw的矩形。(0,0)(0,h),(w,h)(w,0)
此时假设k=2
我们可以得知算法会停留在一个局部最优点。此时得到的会大于2b。

1.2 课后练习

1.2.1 练习1

在这里插入图片描述答:单翻转算法不一定会找到这个最好状态。
我们考虑一个反例:我们考虑图G包含一个圈。其中节点集包含V1,V2,V3,V4,有边(v1,v2),(v2,v3),(v3,v4),(v4,v1) 如果我们考虑将v1,v2设置状态为1,v3,v4设置状态为-1,那么此时任何一个节点都是满足状态,但并不是最好的算法,所以可知不成立。

1.2.2 练习2

在这里插入图片描述答:
a)
我们考虑一条有着三条边的路径,同时算法将中间的边第一次加入到对应的匹配中,此时无法返回它的最大匹配。

b)
如果没后在M‘中的边能够被加入到M中,那么M中的每条边e都与e‘属于M’,共享一个端点。我们让边e’属于M‘支付边e属于M。因此,每条边e属于M都由e’属于M‘支付,但是e‘只有两个端点,最多支付两条边,因此M‘对多有两边的边与M,矛盾,所以得证。
c)
我们假设M’是最大匹配,考虑M是贪婪算法得到的解。如果没有边能够从M‘加入到M,那么有a可知|M|>=1/2|M‘|,或者从b中可知M‘中的边最多支付2条,所以得证。

1.2.3 练习3

在这里插入图片描述在这里插入图片描述答:
a)我们假设第一个机器Mi有更好的负载,我们由此需要证明T1<=2T2.我们认为j是M1中最小的任务,假设T1>=2tj,算法认为将任务j移动到M2上不会减少对应的时间,所以tj>=T1-T2
有知道tj必定小与1/2T1(没有一个作业在所有处理时间中占据绝对优势)
所以两边加上T2,可得最后结果。得证。
b)因为移动,所以可知tj<=|T1-T2|。我们要证明任务j只能移动一次。
考虑j先被分配到M1,所以它的第一次移动从M1到M2.由于每次我们只移动最大的任务,所以考虑最后一次移动,此时T2>=T1,T2-T1<=tj’ 。
此时tj>=tj’>=|T1-T2|,所以j只移动一次。
c)
我们考虑一个例子如下:M1有两个任务 且时间为3,M2有两个任务,时间为2.此时相差为2但没有任何一个单独的任务能够被移动,此时只得到一个局部最优解。

1.2.4 练习4

在这里插入图片描述在这里插入图片描述
答:

二、第十三章 随机化算法

1.消除争用
随机化算法的第一个应用:在分布式系统中消除争用。
问题:有n个进程p1,p2…pn,争着访问一个共享的数据库,数据库在一个周期内最多被一个进程访问,如果有两个及以上的要同时访问他,那么都无法访问成功。

我们希望能够设计一个协议使得进程能够轮流访问(假设进程间无法通信)
很自然的考虑对于某个数p,每个进程在一个周期内以概率p尝试访问数据库
我们定义一些基本事件:

我们考虑对于给定的进程pi和给定的周期t,我们用x[i,t]表示事件Pi在周期t中访问数据库。
由此可知这个事件的概率为Pr[x[i,t]]=p,我们同样定义一个补事件来表示这个事件不发生也就为1-p

此时我们考虑一个进程在给定的周期中访问数据库是否成功。我们用y[i,t]来表示这个事件。对应的概率如下(事件独立)
在这里插入图片描述考虑p的导数,可知如下:
在这里插入图片描述由此得到
在这里插入图片描述考虑当p=1/n时,我们考虑他能够使得pi在多长时间内至少成功访问数据库一次。
考虑多个周期,令p[i,t]表示pi从1-t中都不成功
考虑渐近值,可知pr[p]<=(1-1/en)^t
我们令t=en*clnn 那么可知最后结果为n^-c次。
可知在Onlnn个周期后这个概率变为一个非常小的量。

那么对于每一个进程都访问成功需要多少呢?(和事件)
对应的选择t=2en*clnn
可知事件在1-t时间内,还有进程未访问成功的概率为n^-1

2.求完全最小割
要找一个完全最小割,网络流技术足够。

近似算法:收缩算法
等可能的选取一条边收缩它。

应用于多重图G=(V,E)的收缩算法
for 每一个节点v,记录已经收缩进v的节点集合Sv
   初始化每个v是的Sv=v
 if G只有两个节点, then 
  returnelse 等可能的选取一条G的边
 设G'时收缩e所得到的图
 令 S(w)=su+sv
 递归使用收缩算法
 endif

考虑算法的性能:
假设有个k的最小割,假如第一条边就犯错,那么会导致返回错误的结果。否则仍有可能返回正确结果。
可知收缩一条边的概率为2/n
所以考虑第j次收缩,然后利用展开条件概率来得到最后结果。得证。
通过将算法运行多次,如下那么可知得不到最小割的概率会下降。

展开:对于n个节点的图,可能有的完全最小割的最大个数?
可知n个节点圈有最多的个数。
假设有r个,那么对于每个由收缩可知返回的概率。
考虑和事件的界限,有以下结论:
在这里插入图片描述每个概率一定小于1,所以得证。

3.随机变量及其期望
期望
在这里插入图片描述期望的线性性原理
在这里插入图片描述例子1,猜牌
无记忆时
在这里插入图片描述Xi为第i次猜中的随机变量,猜中=1,不猜中=0
可知Exi=1/n
由次可知上述为1

有记忆时:
在这里插入图片描述在这里插入图片描述此时可知调和函数为lnn+1~1+lnn
可知明显大于1
例2 收集优待卷
考虑随机变量X等于第一次得到n中优待卷为止所卖的盒数
我们将随机变量Xi认为是第i阶段所花费的部署
那么X=X0+X1+…Xn-1
E【Xi】=n/n-j
由此可知Ex=nhn=nOnlogn

条件期望:
在这里插入图片描述4.MAX 3-SAT的随机近似算法
考虑将3-SAT转化为一个最优化问题,找一个满足尽可能多子句的真值赋值(最大三元可满足性问题)
我们考虑一个非常简单的随机算法对每个xi以1/2概率令其为1或者0
我们讨论这样的期望。
可知Ci被满足的概率为7/8,Ezi=7/8
考虑线性性,得知Ez=7k/8
所以一定存在一个真值赋值至少满足所有子句的7/8

考虑一个具有多项式期望运行时间并给出一个至少满足所有子句7/8的随机算法
那么我们需要多少时间呢?
在这里插入图片描述

在这里插入图片描述得证,不超过8k次期望

5.随机分治策略:求中位数与快速排序
求中位数:

Select(S,k)
选择一个元素ai属于S
for s的每一个元素aj
 如果 aj<ai 则把aj放入s1
 否则放入s2
endfor
if|s1|>=k then
 从小到大第k个元素在s1中
 递归调用Select(s1,k)
else |S2|=l<=k-1
  递归调用Select(S2,K-1-L)
endif

选择好的划分元素:
随机的选择划分元素
算法性能分析:
我们考虑元素是中心的,认为至少有1/4的元素小与它同时又1/4的元素大于它。
那么由此可缩减集合到3/4
由此我们将Xj认为是阶段j的所需步数
在这里插入图片描述在这里插入图片描述快速排序
类似的对于快速排序也采取类似的算法

Quicksort(S)
if|S|<=3 then
排序 S
else
等可能的随机选择一个划分元素ai属于S
    for  S的每一个元素aj
    如果aj<ai 把aj加入S1
    否则加入S2
    endfor
递归调用quicksort(s1),quicksort(s2)
endif

我们对划分元素为找到一个中心划分元素时才进行递归调用
可知算法的子问题不超过(4/3)^j+1
可知算法的运行时间为Onlogn

6.散列法:
设计通用的散列函数。
我们用素数p表示h的大小。考虑一个向量a=(a1,a2,ar),其中ai是范围0-p-1的整数。
对于每个i定义线性函数
在这里插入图片描述

7 求邻近点对随机方法:
基本思想:按照随机的顺序考虑这些点。并维护一个最邻近点对的当前值
考虑阶段,对于每个阶段目标是验证当前点对是最邻近点对或者找到一对新的最邻近点对。
对于检查,我们考虑如下
考虑一个子正方形,边长为最邻近的距离x/2
可知如果两个点之间相隔小与一个正方形那么就可能是最邻近的
在这里插入图片描述利用散列法来完成字典工作,那么可知
在这里插入图片描述那么可知算法最终是线性的。

8随机高速缓存

每一个存储项都是标记的或者未标记的
在本阶段开始,所有的项都是未标记的
对项s的一个请求:
标记s
if s在超高速缓存器中 then 不回收任何项
else s不在超高速缓存器中
 if 超高速缓存器中所有的项都是标记的 then
   本阶段结束
   把s的处理推迟到下一个阶段的开始
   else 从高速缓存中收回一个未标记的项
 endif

引入随机化,考虑对于回收未标记的项考虑等可能的随机回收。
算法的性能分析?

9.Chernoff界
在这里插入图片描述在这里插入图片描述这表示X不太可能在上面偏离它的期望太远,同时X不太可能在下面偏离它的期望太远。(记住定理而非证明)

10.负载均衡
这里考虑随机分配
考虑随机变量Xi等于分配给处理机i的任务数
令随机变量Yij当任务j分配给处理机i时等于1,否则等于0
在这里插入图片描述要使得Xi超过c的概率很小,所需要选择充分大的c,使得概率降低。
在这里插入图片描述11 包路由选择
我们定义路径集合P1P2…PN的张度d为这些路径的最长长度,这个路径集合的阻塞度C为它们共有一条边的最大路径树。那么传输期至少为max(c,d)=Ω(c+d)
给出随机算法如下:

每一个包i如下行动:
i选择一个1到r之间的随机延迟
i在它的源点等待s时间步
然后i全速向前移动,每一时间步通过一条边,直至抵达它的目的地为止

该算法如果没有两个包的碰撞,那么将是O(r+d),但是除非r取得特别大,很有可能有两个包在某个点发生碰撞。
为了解决以上,我们考虑对该策略的推广:

对于参数b,把连续的b个时间步合成一个时间段
对每一个包i如下行动:
i选择一个1到r之间的随机延迟s
i在它的源点等待s段时间
然后i每一时间段向前通过一条边,直至抵达它的目的地为止

考虑用和时间的方式来得到结论。
我们假设e是一条边,t是1到r+d之间的一个时间段。
在这里插入图片描述12某些基本概率定义
1)有限概率空间
2)条件概率与独立性
3)和事件的界限
4)无限样本空间

2.1 带解答的练习

2.1.1 练习1

在这里插入图片描述答:

2.1.2 练习2

在这里插入图片描述在这里插入图片描述
答:

2.2 课后练习

2.2.1 练习1

在这里插入图片描述

2.2.2 练习2

在这里插入图片描述

2.2.2 练习3

在这里插入图片描述

2.2.2 练习4

在这里插入图片描述
在这里插入图片描述

2.2.2 练习5

おすすめ

転載: blog.csdn.net/weixin_43869415/article/details/119206943