回溯算法在某些情况下是脆弱的,这一点已被广泛观察到。对一个变量或值排序启发式的看似很小的更改,例如打破连接方案的排序的更改,可能会导致运行时间上的巨大差异。对于这种现象的一种解释是,排序启发式会出错。根据错误的数量以及错误在搜索过程中出现的时间(因此需要付出多大的代价才能纠正错误),不同的启发式之间的性能差异很大。为了利用这种可变性,提出了一种称为随机化和重新启动的技术。

回溯搜索算法中的随机化和重启技术至少可以追溯到Harvey博士的博士研究[64]。Harvey发现周期性地用不同的变量排序重新启动回溯搜索可以消除“早期错误”的问题。这个观察结果促使Harvey提出了随机回溯算法,在每次回溯算法运行时,变量或值的顺序都是随机的。当找到解决方案或算法从死端回溯的距离超过某个固定的截止时间时,回溯算法终止。在后一种情况下,将重新启动回溯算法,并以不同的顺序重新开始搜索。Harvey证明这种随机和重新启动技术在作业车间调度问题上比确定性回溯算法提供了更好的性能。Gomeset al.[60,61,62]通过演示该技术的广泛适用性,将其与拉斯维加斯算法的密切相关工作联系起来,并帮助我们理解何时重启以及重启的原因,为推广和推进该技术做了大量工作。

在本节的其余部分中,我首先研究技术本身,然后研究何时重新启动帮助的问题。有关随机化和重启策略的更多信息,请参见戈麦斯[58]的调查。

4.7.1 Algorithmic Techniques

随机化和重启技术要求在确定性回溯算法中加入随机化的方法,以及重启策略、时间表或决定何时重启的方法。

Randomization

文献中提出了在回溯算法中加入随机化的几种可能方法。Harvey[64]提出对变量排序进行随机化。Gomes等[61,62]提出通过随机断链或使用现有的启发式对变量进行排序,然后从最佳变量的某个小因子范围内的变量集合中随机选择可变量,从而对变量排序进行随机化。这些研究表明,重新启动策略具有可被广泛接受的可变顺序,从而导致对各种各样的问题(包括调度问题的SAT和CSP版本、计划问题和准群完成问题)的顺序进行幅度较小的改进。Cicirello和Smith[27]讨论了在启发式中添加随机化的替代方法以及对搜索效率的影响。其他选择是选择一个概率与该变量的启发式权重成比例的变量,或者从一组启发式中随机选择。需要注意的一个缺陷是,在启发式中添加随机化的方法必须在搜索树的顶部附近提供足够多的不同决策。Harvey[64]提出对值排序进行随机化,使每个可能的排序具有相等的可能性。同样,上面列出的用于随机变量排序的所有选项也是值排序的选项。Zhang[138]认为,随机化启发式会削弱启发式,这是一种不可取的效果。Prestwich[106]和Zhang[138]提出了回溯时搜索空间的随机向后跳转。虽然很有效,但是这样做的结果是回溯算法不再完整。

Restart strategies

重启策略S = (t1,t2,t3,…)是一个无限序列,其中每个ti要么是正整数,要么是无穷大。其思想是对t1步骤运行随机回溯算法。如果在这个截止时间内没有找到任何解决方案,算法将运行t2步骤,依此类推。固定截止策略是指所有ti都相等的策略。提出了多种重启策略。

Luby、Sinclair和Zuckerman[88](以下简称Luby)在拉斯维加斯算法的更一般设置中研究了重启策略。拉斯维加斯算法是一种随机算法,它在结束时总是给出正确的答案,但是算法的运行时间会因运行时间的不同而不同,可以建模为一个随机变量。令f(t)为应用于实例x的回溯算法a在恰好执行t步后停止的概率。设F(t)为F的累积分布函数;即A在经过t步或更少步后停止的概率。F(t)有时被称为算法A在实例x上的运行时分布。尾部概率是A在超过t步之后停止的概率; 即1-F(t),有时也称为生存函数。 Luby表明,在充分了解运行时分布的情况下,对于某些固定的截止t *,最优策略由St * =(t *,t *,t *,...)给出。当然,在实践中并不知道运行时分布。对于不了解运行时分布的情况,Luby表明Su =(1,1,2,1,1,2,4,1,1,2,1,1,2,4,8,1,...) 给出的通用策略是在最优策略St *的对数因子内的,并且这是通过任何通用策略可以达到恒定因素的最佳性能。 此外,Luby证明,无论原始算法A的运行时分布如何,如果我们使用重启策略St *或Su应用A,则重启策略的尾概率很小,因为它以指数方式衰减。

要在实践中使用重启策略,必须在计算中确定什么算基本操作或步骤。文献中使用了几种方法。Harvey[64]使用了一种固定的截止策略,当算法从死端回溯的距离超过某个固定的截止时,该策略将重新启动回溯算法。Richards[112]在每个死端重新启动,但是通过首先记录一个nogood来保持完整性,这样就不会重新访问死端。Gomes等[61]使用固定的截止策略,当回溯次数超过某个固定的截止次数时,该策略将重新启动回溯算法。Kautz等[78,115]使用回溯算法访问的节点数。对于固定的截止策略,还必须决定使用什么截止。到目前为止,好的边界似乎是特定于一个实例的。因此,必须进行某种试错搜索,以获得一个好的截止值。然而,van Moorsel和Wolter[130]观察到,对于一些运行时发行版,范围广泛的截止时间表现良好。他们进一步观察到,通常将截止时间设置得过大比过小更安全。对于通用策略,不需要决定截止日期。然而,据报道,普遍策略在实践中是缓慢的,因为序列增长太慢(例如,[61,78,115])。请注意,这与通用策略在最优对数因子内的事实并不矛盾,因为这是一个渐近结果,并且忽略了常数因子。但是,也可以注意到,对于一些规模因子s,可以对通用策略进行伸缩,在保持最优性保证的同时,还可能提高性能。

Walsh[134]提出了一种通用策略,其中重启值呈几何级数递增,表明1 < r < 2范围内的r值对所研究的问题有很好的效果。该策略的优点是,它比通用策略增长得更快,但避免了寻找固定截止策略所需的截止时间。虽然它在实践中似乎工作得很好,但不幸的是,几何策略并没有正式保证其最坏情况下的性能。可以看出,几何策略的期望运行时可以任意地比最优策略的期望运行时差。

Kautz等[78,115](以下简称Kautz)观察到Luby在证明St *的最优性时做出了两个假设,但它们在实践中可能并不成立。假设(i)随机算法的连续运行在统计上独立且分布相同,(ii)唯一可行的观察或特征是运行的长度。作为第一个假设可能是错误的示例,请考虑当前实例来自两个分布之一但我们不知道是哪个分布的情况。在以前的运行中未能找到解决方案可能会改变我们对当前实例的运行时分布的看法。为了证明第二个假设可能是错误的,Kautz证明了基于丰富特征集的贝叶斯模型能够足够准确地预测算法在当前实例上的运行时间。Kautz删除了这些假设并提出了上下文敏感或动态重启策略。 在一组实验中,Kautz表明动态策略可以比静态最优策略St *做得更好。 该策略使用贝叶斯模型来预测算法的当前运行是“长”还是“短”,并且如果预测是“长”则重新开始。

Van Moorsel和Wolter[130]考虑了一个在实践中经常出现的情况,即只有在一定期限内找到解决方案才有用;也就是说,我们有一个期限c,我们可以运行重启策略,直到算法的c个步骤全部执行完毕。Van Moorsel和Wolter考虑重新启动策略,以最大限度地提高截止日期的可能性。

4.7.2 When Do Restarts Help?

从两个角度解决了随机化和重启技术何时以及为何有用的问题:重新启动在哪种运行时使用有用,以及这些运行时有用的根本原因是什么。

Runtime distributions for which restarts are useful

在可满足的情况下,重启是有帮助的,Gomes等[61,62]表明,带有重尾的概率分布可以很好地适应带有随机启发式的回溯算法的运行时分布。重尾分布heavy-tailed distribution 是指尾部概率或生存函数(见上文)多项式衰减的分布;即回溯算法运行时间较长的概率较大。对于无法满足的情况,Gomes等[61]报告说,在他们关于随机拟群补全问题的实验中,没有发现重尾行为,因此重启对这些问题没有帮助。有趣的是,Baptista和marquess - silva[8]通过实验证明,由于技术之间的协同作用,一种包含nogood记录的回溯算法可以从随机化中获益,并在解决无法满足的实例时重新启动。

Hoos[68]指出,重启不仅对重尾有效,而且其有效性仅取决于存在某个点,即累积运行时分布的增长速度慢于指数分布。正是在这个搜索停滞不前的时刻,重启搜索将会有所帮助。

Van Moorsel和Wolter[129]为重新启动提供了必要和充分的条件。他们的工作可以看作是Hoos洞察力的形式化,以及从一次重启到多次重启的扩展。设T为一个随机变量,对一个实例的随机回溯算法的运行时建模,设E[T]为T的期望值。假设随机算法的连续运行在统计上是独立的,并且具有相同的分布,Van Moorsel和Wolter证明,使用固定的t步截止进行任意次数的重启,都比仅在且仅当,

即当且仅当算法运行t步时,算法的期望运行时间小于完成时的期望剩余时间。VanMoorsel和Wolter还表明,如果一次重启改善了预期的运行时,那么多次重启的性能甚至会更好,而无限制重启的性能最好。上述条件适用于哪种分布?对于尾呈多项式衰减的重尾分布,重新启动最有效(不等式最大),但Van Moorsel和Wolter观察到,对于尾呈指数衰减的一些分布,这种条件也适用。对于其他指数衰减的分布,重新启动严格来说比运行算法来完成要差。Zhan[137]表明,这不是一个孤立的案例,对于许多问题来说,重启可能是有害的。对于纯指数分布,条件是相等的,重新启动既没有帮助也没有害处。

Underlying causes for these runtime distributions

人们提出了各种各样的理论来解释为什么重启是有帮助的;例如,为什么在重新启动很有帮助的地方会出现运行时发行版。对于这种现象的一种解释是,排序启发式会出现错误,需要回溯算法去探索没有解的大子树。然而,这些理论在顺序启发式的错误含义上存在差异。Harvey[64]对错误的定义如下。

当出现错误时,搜索已经扩展到没有解决方案的子问题。结果是节点必须被驳倒,而这样做可能需要探索一个子树,尤其是在树的早期犯错误的时候。在这个定义中,值排序启发式会出错,变量排序启发式不会出错。但是,更改变量排序可能意味着没有犯错误,因为值排序对于新选择的变量是正确的,或者任何错误更正的成本都更低。Harvey构建了一个概率模型来预测重启算法何时会比确定性算法表现得更好。通过简化错误概率的假设,我们发现当错误概率很小时,重启是有益的。显然,这个定义,以及它所依赖的概率模型,只有在CSP有解决方案时才适用。因此,该理论并没有解释什么时候重启对无法解决的问题是有益的。

作为支持这一理论的证据,Hulubei和O’sullivan[70]考虑了反驳规模的分布来纠正错误(扎根于错误的子树的大小)。结果表明,在拟群补全问题的实验中,当使用较差的值排序时,四个不同的高质量变量排序启发式中的每一个都存在重尾行为。然而,当进行相同的实验时,重尾行为消失了,但这次用高质量的值排序启发式代替了随机值排序。

Williams、Gomes和Selman[135](以下简称Williams)对错误的定义如下。

后门是一组存在赋值的变量,这些赋值使得简化的问题(例如约束传播之后的问题)可以在多项式时间内得到解决。后门捕获了一种直觉,即良好的变量和值排序启发式可以尽可能快地简化问题。当出现错误时,搜索已经扩展到一个子问题,这个子问题并没有像选择后门变量那样有效地简化。结果是子问题的搜索成本更高,尤其是在树的早期出现错误时。在这个定义中,变量排序启发式会出错,值排序启发式不会出错。Williams构建了一个概率模型来预测何时会发生重尾行为,但也存在一些启动策略,它们的期望运行时间是多项式的。通过对出错概率的简化假设,我们发现,当出错概率足够小且最小后门的大小足够小时,这两种情况都会发生。该理论还可以通过强大后门的概念,解释何时重启对无法解决的问题有益。然而,该理论并没有完全解释这样一个事实,即随机值排序和重启策略可以消除重尾行为。在这种情况下,变量顺序保持不变,因此出错的概率也保持不变。

最后,一些工作有助于我们理解为什么在重新启动很有帮助的情况下会出现运行时发行版,同时对错误的确切定义保持不可知。考虑反驳大小的概率分布来修正错误。它在随机问题和理论概率模型上都得到了实证证明,在这种情况下,随着反驳的规模增长,重尾呈指数衰减[24,59]。换句话说,犯代价高昂的(指数大小的)错误的概率呈指数递减。

4.7 Randomization and Restart Strategies相关推荐

  1. Handbook of Constraints Programming——Chapter4 Backtracking Search Algorithms-Preliminaries

    来源:F.Rossi, P.Van Beek, T. Walsh. Handbook of Constraints Programming. Elsevier, 2006. There are thr ...

  2. 1.15.Flink state(状态)管理与恢复、什么是state、Keyed State、Operator State、状态容错(生成快照,恢复快照),checkPoint简介,重启策略等

    1.15.Flink state(状态)管理与恢复 1.15.1.什么是state 1.15.2.状态(State) 1.15.3.Keyed State 1.15.4.Operator State ...

  3. flink source 同步_大数据面试题-Flink

    1.Flink 的 抽象层次有几种 Stateful stream processing Core API Table SQL 2.Window 类型 (1)TimeWindow Tumbling W ...

  4. Flink 1.7 文档翻译活动期待大家的参与 | ApacheCN

    参与方式:https://github.com/apachecn/f... 整体进度:https://github.com/apachecn/f... 项目仓库:https://github.com/ ...

  5. 聊聊flink的RestartStrategies

    序 本文主要研究一下flink的RestartStrategies RestartStrategies flink-core-1.7.1-sources.jar!/org/apache/flink/a ...

  6. Concepts:Stateful Stream Processing

    Stateful Stream Processing 有状态流处理 What is State? 状态是什么? While many operations in a dataflow simply l ...

  7. You must restart adb and Eclipse问题的解决

    最近运行eclipse,控制台时不时老出现这样的错误: The connection to adb is down, and a severe error has occured.   You mus ...

  8. 重启随机游走算法(RWR:Random Walk with Restart)

    重启随机游走算法(RWR:Random Walk with Restart) 1 pagerank算法的基本原理 Pagerank算法是Google的网页排名算法,由拉里佩奇发明.其基本思想是民主表决 ...

  9. Tools and Strategies for Long-Read Sequencing and De Novo Assembly of Plant Genomes

    Tools and Strategies for Long-Read Sequencing and De Novo Assembly of Plant Genomes 用于植物基因组长读测序和从头组装 ...

最新文章

  1. 深度学习如何挑选GPU?
  2. ECS TAG功能详解
  3. PHP中session的工作原理
  4. 293/294 Flip Game I and II -- back tracking ing
  5. LeetCode 293. 翻转游戏
  6. Java集合:Collection接口
  7. C++中如何使用大整数__int 128
  8. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)...
  9. JSON中JObject和JArray,JValue序列化(Linq)
  10. 机密领域管理扩展技术(RME)对TF-A的修改分析笔记。
  11. error: warning: Stopped in a context claiming to capture an Objective-C object pointer,
  12. linux yum安装xz,CentOS 7 上安装 xz utils 解压缩工具
  13. netstat查看网络状态(windows)
  14. CentOS 7.6 部署frps
  15. 负数二进制转换十进制
  16. 【论文】模型剪枝(Network Pruning)论文详细翻译
  17. 搜狗都上市了,王小川还是单身,难道要找AI当女朋友?
  18. 自定义控件三部曲之绘图篇(十七)——为Bitmap添加阴影并封装控件
  19. 安卓之软键盘监听与切换软键盘状态和重新获取EditText焦点
  20. 线缆种类小结:BNC、RJ45和RJ48

热门文章

  1. ConceptDraw WebWave 5.8 網站結構分析工具 - wowbox blog (網頁設計知識庫)
  2. 译⽂:Top Three Use Cases for Dapr and Kubernetes
  3. 网络提速助推智能家居 智慧应用惠及千家
  4. dedecm5.7 把数据保存到数据库主表#@_archives
  5. python中的匿名函数_python匿名函数
  6. 服务账户service account在kubernetes1.24中的变化
  7. MEMS惯性传感器误差及校准小白入门(三)
  8. 佩京科技 | 餐厅全息投影打破传统,成为“网红餐厅”
  9. python代码阅读器_还在用别的小说阅读器?今天教你用Python制作简易小说阅读器!...
  10. 2012年第二季度惠普PC销量下滑严重,联想大幅增长25.2%逼近惠普