在朴素回溯算法(BT)中,搜索树中的节点p = {x1 = a1,...,xj = aj}是一组赋值,并且通过选择变量x并将分支添加到a来扩展p。 新节点p∪{x = a},对于每个a∈dom(x)。赋值x = a据说是沿分支发布的。 随着搜索在树中更深入地进行,附加的分配被发布,并且在回溯时,分配被撤回。 然而,这只是一种可能的分支策略,并且在文献中已经提出并检查了几种替代方案。

更一般地,回溯算法的搜索树中的节点p = {b1,...,bj}是一组分支约束,其中bi,1≤i≤j,是在搜索树的第i层发布的分支约束。 对于一些分支约束bij +1,1≤i≤k,通过添加分支p∪{b1 j + 1},...,p∪{bk j + 1}来扩展节点p。 分支通常使用启发式排序,最左边的分支是最有希望的。为了确保完整性,从节点发布在所有分支上的约束必须是相互排斥和详尽的。通常,分支策略包括发布一元约束。在这种情况下,使用变量排序启发式来选择要分支的下一个变量,并且分支的排序由值排序启发式决定(参见4.6节)。作为一个运行的例子,令x为要分支的变量,令dom(x) ={1,…6},假设该启发式的值排序为字典顺序。以下是三种流行的涉及一元约束的分支策略:

1) Enumeration枚举。变量x依次实例化为其域中的每个值。为变量域中的每个值生成一个分支,约束x = 1沿着第一个分支发布,x = 2沿着第二个分支发布,依此类推。枚举分支策略在很多教科书中都有介绍,在求解csp的回溯算法中也有很多研究。文献中这种分支策略的另一种名称是d路分支,其中d是域的大小。

2)Binary choice points二叉选择点。变量x被实例化为其域中的某个值。假设在我们的示例中选择了值1,那么将生成两个分支,并分别发布约束x = 1和x 1。这种分支策略通常用于约束编程语言中求解csp(参见[72,123]),Sabin和Freuder[116]在回溯算法中使用了这种策略,在搜索过程中保持了arc的一致性。文献中这种分支策略的另一个名称是双向分支。

3)Domain splitting域分解。这里不一定实例化变量,而是在每个子问题中减少变量的选择。等有序域在我们的例子中,这可能包括发布一个约束形式x≤3的一个分支和发布x > 3分支。

当然,如果域是二进制的(例如,在SAT中),这三种方案是相同的。

表4.1:一些被命名的回溯算法。组合技术的混合算法用连字符名称表示。例如,MAC-CBJ是一种保持圆弧一致性并执行冲突定向回跳的算法。

还提出了由发布非一元约束组成的分支策略,以及特定于一类问题的分支策略。作为两者的示例,考虑作业车间调度,其中我们必须在一组资源上安排一组任务t1,...,tk。设xi为表示ti起始时间的有限域变量,di为ti的固定持续时间。一种流行的分支策略是对共享资源的任务进行排序或序列化。考虑共享相同资源的两个任务t1和t2。分支策略是把约束x1 + d1≤x2沿着一个分支发布,把约束x2 + d2≤x1沿着另一个分支发布(见,例如,[23]和引用其中)。这种情况一直持续到检测到死端或所有任务都已排序为止。一旦所有的任务被排序,一个人可以很容易地构造一个问题的解决方案;即赋值给每个xi。有趣的是,从概念上讲,上述分支策略等价于将辅助变量添加到CSP模型中,然后对CSP模型进行分支。

一般来说,如果底层回溯算法具有固定的分支策略,可以通过添加辅助变量来模拟不同的分支策略。因此,分支策略的选择和CSP模型的设计是相互依赖的决策。

对分支策略的进一步研究检验了这些策略的相对威力,并提出了新的策略。Van Hentenryck [128, pp.90-92]研究了枚举和域分割策略之间的权衡。Milano和vanHoeve[97]表明,分支策略可以看作是值排序启发式策略和域分割策略的组合。值排序用于对域值进行排序,域分割策略用于将域划分为两个或多个集合。当然,具有最高排序值的集合将被分支到第一个。该方法在优化问题上效果良好。

Smith和strong[121]研究表明,在使用具有双向分支的时间回溯法查找所有解时,值的排序会影响回溯搜索的效率。这令人吃惊,因为我们知道,在使用d-way分支时,值排序在这些情况下没有效果。Hwang和Mitchell[71]的研究表明,双向分支的回溯要比d路分支的回溯强大得多。很明显,d路分支可以用2路分支来模拟,而且不会损失效率。黄和米切尔的研究表明,反过来并不成立。他们给出了一类问题,其中具有最优变量和值排序的d路分支算法比具有简单变量和值排序的2路分支算法要多出指数级的步骤。但是,请注意,只有假设CSP模型是固定的,结果才成立。如果允许我们向CSP模型中添加辅助变量,它就不成立。

4.2 Branching Strategies相关推荐

  1. 持续集成持续部署持续交付_如何开始进行持续集成

    持续集成持续部署持续交付 Everything you need to know to get started with continuous integration: branching strat ...

  2. 初级开发人员的缺点_如何避免我作为初级开发人员犯的这7个错误

    初级开发人员的缺点 Beginning your career as a junior developer can be scary. There will be many unknown chall ...

  3. 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 ...

  4. 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 用于植物基因组长读测序和从头组装 ...

  5. SAP RETAIL WA01创建分配表报错- No allocation rule allowed for allocation strategies or variants-

    SAP RETAIL WA01创建分配表报错- No allocation rule allowed for allocation strategies or variants- 1,执行事务代码WA ...

  6. SharePoint 2007 Backup Strategies

    SharePoint 2007 Backup Strategies from http://www.sharepointkicks.com/ 转载于:https://www.cnblogs.com/i ...

  7. boost::geometry模块测试地理策略Testing geographic strategies的测试程序

    boost::geometry模块测试地理策略Testing geographic strategies的测试程序 实现功能 C++实现代码 实现功能 boost::geometry模块测试地理策略T ...

  8. git-flow的分支管理 (Git branching model)

    master分支(下版开发, 开始测试后锁分支) 热修复分支(基于tag拉分支) 发布分支(暂不用,除非有多余的测试资源,并行测试) 开发分支(暂不用) 功能分支(长期的功能开发) master分支+ ...

  9. 分享一个学习git的图形化学习网站-Learn Git Branching参考答案整理

    分享一个学习git的图形化学习网站:Learn Git Branching 初次学习点这里 这个链接可以跳过前面的帮助信息直接进入:Learn Git Branching 老手点这里 LearnGit ...

  10. signature=f2388c4f1bce538cc797410d9560f03b,KSHV strategies for host dsDNA sensing machinery

    摘要: The innate immune system utilizes pattern recognition receptors cyclic GMP-AMP synthase(cGAS)to ...

最新文章

  1. Linux wait() 和 waitpid()函数介绍
  2. lazada选品,东南亚韩潮周边产品爆卖,单日销售额5万美金!
  3. PHP-fpm的master进程杀死work还能处理任务吗
  4. Majority Element(169) Majority Element II(229)
  5. 【今晚七点半】:主编对话李宇翔——我所经历的“前端”开发
  6. java中super可以重新父类么_Java Super 覆盖方法
  7. YYModel Summary
  8. c语言单链表原地转置,不带头结点的单链表的插入,删除,原地转置,判断空,清空,统计节点数目等操作...
  9. Flutter - Stateful(有状态) 和 stateless(无状态) widgets
  10. Spring Cloud Sleuth链路跟踪之使用RabbitMQ异步收集链路跟踪信息(学习总结)
  11. LV的几种适配器特点
  12. Too many files with unapproved license
  13. 简单易懂的计算机网络相关名词的解释--集线器篇(持续更新)
  14. rpmbuild php,linux RPM打包时出错,求助!!!
  15. 国内疫情统计及预测分析系统
  16. auto CAD 二次开发 c#.net 之JIG画多段线(polyline)
  17. 【Stream流学习】Java 8 新特性|Collectors.joining() 案例详解
  18. 十二、在PPT中添加页码
  19. c语言lnk1120,C致命错误LNK1120:1未解决的外部
  20. 802.11n关键技术

热门文章

  1. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true
  2. 《SLA by Short brain》—学好英语口语的终极法宝!
  3. access汇总含义_access的用法总结大全
  4. 文件和数据格式化~总结
  5. Jmeter性能测试实践--登录场景设计
  6. Julia处理高斯光束的光斑图像
  7. 【Python cursor指针】——Python Tkinter Cursor鼠标指针属性值
  8. PHP - 在网页里格式化输出(打印)JSON字符串
  9. 笔记:《高效能人士的七个习惯》第五章 习惯三 要事第一——自我管理的原则
  10. Ubuntu 编译XCB源码