树的搜索策略
2016-03-16 14:46
134 查看
问题解空间的树表示
许多实际应用中的计算问题均是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步;
分支限界法
前面的集中搜索策略虽然可用于求解许多问题,但难以用于高效地求解优化问题。而分支限界搜索法,是求解优化问题的最有效的搜索策略。用于求解最小化问题(最大化需要转为最小化问题),各种组合优化问题(如人员分配问题,旅行商问题)
爬山法得到问题的一个可行解
继续利用爬山法搜索,搜索时剪除不能取得优化解的分支
相关文章推荐
- permission denied for this window type
- 字符集与编码方式解惑
- jquery 调用 click 事件的三种方式
- 强大的分布式消息中间件——kafka
- timestamp
- SAP 开发中常用到的BAPI
- Xcode中的Version和Build的区别
- 转载--Python之路,进程、线程、协程篇(原文地址:http://www.cnblogs.com/alex3714/articles/5230609.html)
- 循序渐进开发WinForm项目(2)--项目代码的分析
- 微信浏览器取消缓存的方法
- python数据持久存储:pickle模块的基本使用
- RabbitMQ与AMQP协议详解
- react-native 学习之TextInput组件篇
- 挑战P66 有关计数问题的dp
- AngularJS基本功能
- 3月14日课程作业
- 神经网络浅讲:从神经元到深度学习
- Swift - 设置应用程序图标的提醒个数(右上角小红圈)
- weblogic 更新文件(.class,.jsp)等不生效解决
- 关于activiti流程通过、驳回、会签、转办、中止、挂起等核心操作功能的封装