- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七讲 分枝_限界法.doc
第七讲 分枝_限界法
1 一般方法
在图的检索方法中,BFS和D-检索这两种方法都是对当前E-结点(正在扩展的结点)检测完毕之后,再检测以队或栈结构形式存放在活结点(自身已经生成但子结点尚未全部生成的结点)表中的其它结点。将这两种方法一般化就成为分枝_限界策略。分枝_限界法是在生成当前E-结点的全部子结点后再生成其它活结点的子结点,且用限界函数帮助避免生成不包含答案结点子树的状态空间(根结点到其它结点的所有路径一起构成了状态空间)的检索方法。在这总的原则下,根据对状态空间树中结点检索次序的不同又可将分枝_限界设计策略分为几种不同的检索方法,其中与BFS类似的状态空间检索称为 FIFO检索(First In First Out),它的活结点表采用一张先进先出的表(即队列)加以存储;类似于 D-检索的状态空间检索称为 LIFO检索(Last In Fist Out),它的活结点表是一张后进先出的表(即栈) 加以存储。
例1(4-皇后问题) 本例考察用一个FIFO分枝_限界算法检索4-皇后问题的状态空间树(见图7.1)的基本过程。
起初,只有一个活结点,即结点l(初始状态)。它表示没有皇后被放在棋盘上。扩展结点l,生成子结点2,18,34和50。这些结点分别表示皇后1放置在第1行的1,2,3,4列情况下的状态,且为当前的活结点。如果按序扩展这些结点,则下一个E-结点就是结点2。扩展结点2后生成结点3,8和13。利用限界函数(同行、列、对角线上只能放置1个皇后),结点3(放在第二列)立即被杀死。于是,仅将结点8和13加到活结点队列。结点18变成下一个E-结点,生成结点19(放在第一列),24(放在第三列)和29(放在第四列),限界函数杀死结点19和24,结点29被加到活结点队列。下一个E-结点是34,…。图7.2显示了由FIFO分枝_限界检索生成图7.1所示的树的一部分。由限界函数杀死的那些结点的下方有一个 B字。结点内的数与图7.1所示的树的结点内的数对应。结点外的数字给出了用 FIFO分枝_限界法生成结点的次序。在到达答案结点31时,仅剩下活结点38(它可导致另一答案结点39)和54。比较图7.1和图7.2可以看出,对于这个问题而言回溯法占优势。
1.1 LC-检索
在LIFO和FIFO分枝_限界法中,对下一个E-结点的选择规则相当死板,而且在某种意义上是“盲目的”。这种选择规则对于有可能快速检索到一个答案结点的结点没有给出任何优先权。因此,在例1中,尽管在生成结点30后,这个结点显然只要走一步就可到达答案结点31,但死板的FIFO规则却要求先扩展已生成的所有其它活结点(即结点8、13、35、51、56、14)。
对活结点使用一个“有智力的”排序函数c(·)来选取下一个E-结点往往可以加快到达某答案结点的检索速度。在4-皇后的例子中,如果用一个能使结点30比所有其它活结点取得更高优先级的排序函数,那么结点30就会在结点29之后成为E-结点。接着扩展E-结点就生成答案结点31。因此,那些剩下的活结点则无需再变成E-结点。
要给可能导致答案结点的活结点赋以优先级,必然要附加若干计算工作,即要付出代价。对于任一结点X,要付出的代价可以使用两种标准来度量:
① 在生成一个答案结点之前,子树X需要生成的结点数。
② 在子树X中离X最近的那个答案结点到X的路径长度。
使用后一种度量,图7.2中树的根结点付出的代价是4(结点31在树的第5级)。结点(18和34),(29和35)以及(30和38)的代价分别是3,2和1。所有在2,3和4级上剩余结点的代价应分别大于3,2和l。以这些代价作为选择下一个E-结点的依据,则 E-结点依次为l,18,29和30,得以生成的其它结点仅是 2,34,50,19,24,32和 31。容易看出:如果使用度量①,则对于每一种分枝_限界算法,总是生成最小数目的结点;如果使用度量②,则要成为E-结点的结点只是由根到最近的那个答案结点路径上的那些结点。以后用c(·)表示“有智力的”排序函数,又称为结点成本函数。它的定义如下:如果X是答案结点,则c(X)是由状态空间树的根结点到结点X的成本(即所用的代价,它可以是级数、计算复杂度等);如果X不是答案结点且子树X不包含任何答案结点,则c(X)=∞;否则c(X)等于子树X中具有最小成本的答案结点的成本。但要指出的是,要得到结点成本函数c(·)所用的计算工作量与解原问题具有相同的复杂度,这是因为计算一个结点的代价通常要检索包含一个答案结点的子树X才能确定,而这正是解决此问题所要作的检索工作,因此要得到精确的成本函数一般是不现实的。在算法中检测活结点的次序通常根据能大致估计结点成本的函数g(·)来排出。
设g(X)是由 X到达一个答案结点所需做的附加工作的估计函
文档评论(0)