代价树的代价
用g(n)表示从初始结点S0到结点n的代价,用c(n, n1)表示从父结点n到其子结点n1的代价。这样,对结点n1的代价有:
- g(n1)=g(n)+c(n, n1)。
代价树搜索的目的是为了找到最佳解,即找到一条代价最小的解路径。
代价树的广度优先搜索算法
(1)搜索算法的过程
- 把初始结点S0放入Open表中,置S0的代价g(S0)=0;
- 如果Open表为空,则问题无解 ,失败退出;
- 把Open表的第一个结点取出放入Closed表,并记该结点为n;
- 考察结点n是否为目标。若是,则找到了问题的解,成功退出;
- 若结点n不可扩展,则转第(2)步;
- 扩展结点n,生成其子结点ni(i=1, 2, …),将这些子结点放入Open表中,并为每一个子结点设置指向父结点的指针。
- 按如下公式:g(ni)=g (n) +c (n , ni) i=1,2,…,计算各子结点的代价,并根据各子结点的代价对Open表中的全部结点按由小到大的顺序排序。然后转第(2)步。
(2)广度优先搜索实例
代价树的深度优先搜索算法
代价树的深度优先搜索算法和代价树的广度优先搜索算法的步骤也基本相同,它们之间的主要差别在于Open表中的结点排序不同。在代价树的深度优先搜索算法中,每当扩展一个结点后,仅是把刚生成的子结点按照其边代价由小到大放入Open表的首部,而不需要对Open表中的全部结点再重新进行排序。
代价树的深度优先搜索是一种非完备策略。对某些问题,它有可能找不到最优解,或者根本找不到解。为此,也可增加一个深度限制,当搜索达到规定深度但仍没找到解时向宽度搜索,称为代价树的有界深度优先搜索。它们的具体算法描述和例子省略。