问题解空间的树表示
许多实际应用中的计算问题均是NP-完全问题,这些问题不存在多项式时间算法,除非NP=P。当NP-完全问题具有较小的输入规模时,可以穷举问题的解空间。而我们常常将问题的解空间表示成搜索树
广度优先搜索(BFS)
使用队列(Queue)
- 构造仅含树根节点的队列Q;
- 若队列Q的第一个节点x是目标节点,则输出节点x对应的解,算法结束
- 删除队列Q的第一个节点x,如果绑定删除B(x)判定以x为根的子树可能存在解,则将x的所有孩子节点加入队列Q的末尾;
- 如果队列Q为空,则问题无解,算法结束,否则,转到第2步;
深度优先搜索(DFS)
使用栈(Stack)
- 构造仅含树根节点的栈S;
- 如果栈顶元素x是目标节点,则输出节点x对应的解,算法结束;
- 弹出栈顶元素x,如果绑定函数B(x)判定以x为根的子树可能存在解,则将x的所有孩子一次压入栈
- 如果栈S为空,则问题无解,算法结束,否则,转到第2步;
爬山法
深搜+贪心
- 构造仅含树根节点的栈S;
- 如果栈顶元素x是目标节点,则输出节点x对应的解,算法结束
- 弹出栈顶元素x,如果绑定函数B(x)判定以x为根的子树可能存在解;则将x的所有孩子节点按隐式月数值P()从大到小依次压入栈
- 如果栈S为空,则问题无解,算法结束,否则,转到第2步-
最佳优先搜索(best-first-search)
结合了深度优先搜索和广度搜索的优点
使用堆
- 构造仅含树根节点的堆Q;
- 如果堆顶元素x是目标节点,则输出节点x对应的解,算法结束;
- 抽取堆顶元素x,如果绑定函数B(x)判定x以x为根的子树可能存在解,则将x的所有孩子节点插入堆
- 如果堆Q为空,则问题无解,算法结束,否则,转到第2步;
分支限界法
前面的集中搜索策略虽然可用于求解许多问题,但难以用于高效地求解优化问题。而分支限界搜索法,是求解优化问题的最有效的搜索策略。
用于求解最小化问题(最大化需要转为最小化问题),各种组合优化问题(如人员分配问题,旅行商问题)
- 爬山法得到问题的一个可行解
- 继续利用爬山法搜索,搜索时剪除不能取得优化解的分支