面对许多实际问题时,需要求解满足特定条件的全部解或最优解,如著名的N皇后问题和旅行售货员问题。
此类问题,一般没有特定的计算规则用于解题,通常我们采用试探性的方法,在包含问题所有可能解的解空间树中,将所有可能的结果搜索一遍,从而获得我们期望的那一个解,或者是那一些解,一般就是满足一定条件的最优解,或是全部解。那么这里用到的解空间树是什么呢?
解空间树与回溯法
解空间树:
依据待解问题的特性,用树结构表示问题的解结构,用叶子表示所有问题所有可能解的一棵树。
回溯法:
回溯法是采用深度遍历的策略搜索解空间树,并随时判定当前结点是否满足解题要求,满足要求的继续向下搜索,不满足要求则回溯到树的上一层继续搜索另一棵子树,这种解决问题的方法就称为回溯法。
解空间树的建立:
就是将问题求解的一系列判断决策过程及各种可能的结果用树型结构呈现。
事实上,我们解题的过程是一个不断判断决策的过程,我们把每一步判断决策的过程对应于解空间树的一个分支结点,而各种可能的不同结果,则对应得到结点的每一个孩子及各棵子树,而一系列判断决策的解题过程,就对应着解空间树的生长过程;而问题最终所有可能的解,都会呈现在这棵解空间树的叶子上。
求解N皇后问题的回溯算法
- 首先,我们先考虑4皇后问题。
在一个4x4的棋盘上,放置4个皇后,要求给出使各皇后彼此不受攻击的所有可能的棋盘布局。彼此不受攻击的条件是皇后不能在同一行、同一列、同一对角线上。
该问题的解题判断过程是这样的:
- 下面来看旅行售货员问题:
- N皇后问题的回溯算法: