搜索解决问题的基本步骤:
针对所给问题,定义问题的解空间;确定易于搜索的解空间结构;以深度优先方式搜索解空间,并在搜索过程中利用Pruning函数剪去无效的搜索。
摘自百度百科。
剪枝比如有可行性剪枝(如联通性剪枝),最优性剪枝
如切木板问题,我要切得和剩下所有的木板加起来还不够所有要切得,显然是不需要继续搜的。
如当前状态已走步数与预判最好情况下要走步数是否劣于最优值。预判还可考虑另写估价函数。
改变搜索顺序使得更容易地剪枝,如最大团解法,以从后往前的顺序搜索,反而易于剪枝。亦可考虑贪心。
还要优化搜索层数,如IDA*。
不如先考虑显然不合法的状态,为何不合法,如何剪去不合法状态。
以及平衡剪枝与不合法搜索空间的时间关系,剪枝/判断不合法所花时间应远小于不合法状态搜索时间。
考虑某一状态时,要将其所有信息一并考虑,抓住状态的性质,如切木板问题,考虑已经切了的以及预判还能切的时候,还要考虑另一面,即浪费掉的木板量。正面考虑比较困难,不如反过来考虑。
另外还需考虑重复状态,避免重复搜索,可通过哈希等手段判断。如切木板问题,我要切出来的两块木板长度相同,一块可能搜索到从i开始时有效,那么另一块就也要从i开始,而不必再搜索i前面的状态了。
还要考虑状态的部分与整体的关系。
最优性问题亦可考虑二分答案转化为判定性问题。
总之不如先出一个比较通用或感觉会有不同情况的数据并绘出其搜索树。
剪枝不能把可能通向最优答案的部分剪掉(很显然)
双向广搜并不知道是否有很大的优化程度。。
另外还有路径交,从源汇点各走一次搜索(最短路)。
听说有一个hash方法判断有向图是否相同。
以下为搬运。
迭代k次以后的 fk(i) 是 i <script type="math/tex" id="MathJax-Element-66">i</script>点的hash值。
不清楚贴过来是否有版权问题。。
如何判断一个点是否在多边形内。
射线法。
如果从该点发出的射线经过了多边形边奇数次就在多边形内,否则不在。