回溯策略:
通过对回溯策略的学习后,可以看出求解过程种呈现出递归过程的性质,因此用递归算法描述回溯控制下的产生式系统能抓住特点,简单有效.
1..实现回溯策略的有效方式是应用的递归过程去支持搜索和回溯。
令PATH、SNL、n、n' 为局部变量:
· PATH--节点列表,指示解答路径;
· SNL--当前节点扩展出的子节点列表;
MOVE-FIRST(SNL)--把SNL表首的节点移出,作为下一次要加以扩展的节点;
· n、n'--分别指示当前考察和下一次考察的节点。
该递归过程的算法就取名为BACKTRACK(n),参数n为当前被扩展的节点,算法的初次调用式是BACKTRACK(s),s即为初始状态节点。算法的步骤如下:
(1) 若n是目标状态节点,则算法的本次调用成功结束,返回空表;
(2) 若n是失败状态,则算法的本次调用失败结束,返回'FAIL';
(3) 扩展节点n,将生成的子节点置于列表SNL,并按评价函数f(k) = h(k)的值从小到大排序(k指示子节点);
(4) 若SNL为空,则算法的本次调用失败结束,返回'FAIL';
(5) n'= MOVE-FIRST(SNL);
(6) PATH = BACKTRACK(n');
(7) 若PATH ='FAIL', 返回到语句(4);
(8) 将n'加到PATH表首,算法的本次调用成功结束,返回PATH。
该递归回溯算法中,失败状态通常意指三种情况:(1)不合法状态(如传教士和野人问题中所述的那样),(2)旧状态重现(如八数码游戏中某一棋盘布局的重现,会导致搜索算法死循环),(3)状态节点深度超过预定限度(例如八数码游戏中,指示解答路径不超过6步)。失败状态实际上定义了搜索过程回溯的条件;另一种回溯条件是搜索进入"死胡同",由该算法的第(4)句定义。由于回溯是递归算法,解答路径的生成是从算法到达目标状态后逆向进行的,首先产生空表,然后每回到算法的上一次调用就在表首加入节点n',直到顶层调用返回不包含初始状态节点s的解答路径。
影响回溯算法效率的关键因素是回溯次数。鉴于回溯是搜索到失败状态时的一种弥补行为,只要能准确地选择下一步搜索考察的节点,就能大幅度减少甚至避免回溯。所以,设计好的启发式函数h(n)是至关重要的。