一、算法思想
首先分析一下 2N 皇后问题中的 N:
当 N 为偶数时:其实只要求得一组可行解即可,另外一组可行解可以由当前解沿N*N 矩阵的中轴线作对称变换得到。因为 N 为偶数,所以不会存在黑白皇后位置冲突的情况。
例如:N=4 时,求得一组可行解为:3 1 4 2,按着这个思路,变换得到另一组可行解为:2 4 1 3。可以判断,这样的两组解合并起来是符合题目要求的。
当 N 为奇数时:沿中轴线对称的方式不再可行,因为肯定有一个皇后会落在中轴 线上。此时,可以考虑通过中心点作点对称的情况。
这里要注意,如果求得的可行解存在关于中心点对称的皇后摆放(或有皇后位于中心点),那么此解不合要求,需要重新再求;直到没有两个皇后的位置是关于中心点对称,另 一组解可以通过对当前解关于中心点作点对称变换得到。
例如,N=5 时,求得一组可行解为:2 4 1 3 5,按着这个思路,变换得到另一组可行解 为:1 3 5 2 4。可以判断,这样的两组解合并起来是符合题目要求的。
从上可以看出,其实 2N 皇后问题在大多数情况下并不需要二次求解 N 皇后,只需求 得一组可行解即可。
那么,接下来的事情就好办多了。只需要利用目标算法求得 N 皇后问题一个符合要求的解即可。
爬山算法属于局部搜索算法的一份子,因此是一种解决最优化问题的启发式算法。在实际运用中,爬山算法不会前瞻与当前状态不直接相邻的状态,只会选择比当前状态价值更好的相邻状态,所以简单来说,爬山算法就是向价值增长方向持续移动的循环过程。初始状态下,每行每列都是一个皇后,之后的求解就是对存在冲突的列,寻找其他的冲突列来进行交换。因为寻找是随机的,所以每次程序的运行结果可能也存在一定的偶然误差。求解过程中,当得到了局部极大值时,如果不是全局最优解(即冲突数为 0),则随机生成初始状态,重新求解,直到得到全局最优解。
CSP 算法的实现与爬山算法有不少的相同部分。比如初始值的生成,同样,也都是 采用交换列的方式来实现消解冲突的。求解时,遍历每一个皇后,选择当前行的皇后与其他皇后冲突最少的列(相同则随机选),交换当前行与目标行皇后。若遍历完后没求得解,则再遍历,直到求得解。

本文详细介绍了如何使用C++解决2N皇后问题,包括算法思想、空间和时间复杂度分析,以及实验结果。对于偶数N,通过求得一组解并进行对称变换得到另一组解;奇数N时,需避免皇后对称放置。采用爬山算法和CSP策略,通过一维数组降低空间开销,随机重启寻找全局最优解。
最低0.47元/天 解锁文章
1199

被折叠的 条评论
为什么被折叠?



