在“八皇后问题”的问题求解中,采用“试探-失败返回-再试探”的求解方法,该方法属于(A)。

将n个皇后放置在n*n的国际象棋棋盘上,其中没有任何两个皇后处于同一行,同一列或者同一对角线上,以使得的它们不能相互攻击。

  • 最简答的思路是把问题转化为“从64个格子中选一个子集”,使得“子集中恰好有8个格子,且任意选出两个格子都不在同一行,同一列或者同意对角线上”。这恰好是子集枚举问题。然而,64个格子的子集有2^64个,太大了,则并不是一个很好的模型。
  • 我们把思路转化为“从64个格子中选出8个格子”,这是一个明显的组合问题,根据排列组合,有C8 64=4.426*10^9种结果,虽然比第一种要好,但是性能依然不够好。
  • 最后我们通过思考,能不能将它装换为一维问题:因为每行每列各放置一个皇后,如果用C[X]表示第X行皇后的列编号,则问题会变成全排列生成问题,而0-7的排列一共只有8!=40320个,枚举的次数不会超过这个值。

如果这样表示的话,那么判断条件应该如何表示呢?

  • 我们可以先用二维数组表示一个八宫格,假设每个格子的坐标(x,y)是二维数组的下标,那么格子(x,y)的y-x的值就能够标识出租对角线,所有的主对角线的y-x的值是相等的,同理格子(x,y)的x+y值就能表示出副对角线,那么所有的问题就都解决了。

当把问题分成了若干步骤并递归求解时,如果当前步骤没有合理的选择时,则函数将返回上一级递归调用,这种现象叫回溯。正是因为这个原因,递归枚举算法常常被称为回溯法

上述算法的枚举的结点数适合很难减少了,但是程序的效率可以继续提高,利用二维数组直接判断当前尝试的皇后所在的列和两个对角线是否已有其他的皇后,注意的问题是,主对角线的表示y-x可能为负值,存取时要加上n。

上述程序有个极其关键的地方:vis数组的使用。它表示的含义是已经放置的换后占据了哪些列,主对角线和副对角线。一般的,如果在回溯法中修改了辅助全局变量,则一般要把它们及时恢复原状,有多个地方修改,每个地方都要恢复原有的值。
有兴趣的话,可以研究一下n皇后问题,看一看有没有什么规律或者快速解法呢?

}
  • 2.收费公路重建问题(通过考虑最大值策略,对可能性空间Xi进行了大幅度裁剪)
    2.3 收费公路重建算法
  • 3.3 极小极大策略用于更复杂的游戏——西洋跳棋、国际象棋
    5.2 考虑4皇后问题的解法
  • 像大多数NP难问题一样,通过穷尽搜索数量巨大但有限多个可能性,可以获得一个解。而且,事实上对于所有这些问题都不存在用穷尽搜索之外的方法来解决问题。所以产生了开发系统化的搜索技术的需要,并且希望能够将搜索空间减少到尽可能小。
  • 回溯法就是一种组织搜索的一般技术。回溯法可以被描述为有组织的穷举搜索,它常常可以避免搜索所有的可能性。
    一般适用于求解那些有潜在的大量解,但有限个数的解已经检查过的问题。

一般回溯方法应用到一类搜索问题中,这类问题的解由满足事先定义好的某个约束的向量(x1, x2, ..., xi)组成。这里i是0到n之间的某个整数,其中n是一个取决于问题阐述的常量。
1-1) 对于一些问题,i是固定不变的
例如三着色和八皇后问题

1-2) 另一些问题中,i对于不同的解可能有所不同(可转换为统一的长度)

    {20,40}和{60}。设计一个回溯算法求解并不困难。

2)一般回溯方法的描述

  • 解向量中每个xi都属于一个有限的线序集Xi
  • (开始)算法最初从空向量开始,然后选择X1中最小的元素作为x1,如果(x1)是一个部分解,算法通过从X2中选择最小的元素作为x2继续,如果(x1, x2)是一个部分解,那么就包括X3中最小的元素,否则x2被置为X2重的下一个元素。
    1.如果v表示问题的最后解,算法记录下它作为一个解,在仅希望获得一个解时终止,或者继续去找出其他解。
    2.(向前步骤)。如果v表示一个部分解,算法通过选择集合Xj+2中的最小元素向前。
    3.如果v既不是最终解,也不是部分解,则有两种子情况
    3-1.如果从集合Xj+1中还有其他的元素可选择,算法将xj + 1置为Xj+1中的下一个元素。
    3-2.(回溯步骤)。如果从集合Xj+1中没有更多的元素可选择,算法通过将xj置为Xj中的下一个元素回溯;如果从集合Xj中仍然没有其他的元素可以选择,算法通过将xj-1置为Xj-1中的下一个元素回溯,依次类推。

3)(获得一个解)回溯算法的伪代码描述

  • 通常如果需要使用回溯法来搜索一个问题的解,可以使用这两个原型算法之一作为框架,围绕它设计出专门为具体问题而裁剪出的算法来。


根据N(N-1)/2个形如|xi - xj|(i≠j)的距离,重新构造这N个点集。
在物理学和分子生物学中都有应用。
重建问题没有人能够给出一个算法保证在多项式时间内完成计算。在最坏情形下可能要花费指数时间。


step4-3.考虑x3 = 4。不可能,该选择有两个4,而D中只有一个。

收费公路重建问题的决策树

2.3 收费公路重建算法

  • 驱动代码,首先确定无争议的x1,xN和xN-1
  • 回溯步骤:以递归方式实现。传递同样的参数以及界Left和Right,xLeft,...,xRight是视图放置的点的x坐标。

可以将D作为平衡二叉查找树保存(代码需要修改)。如果从未回溯,那么最多有O(N2)涉及到对D(平衡二叉查找树)的查找和删除操作。因此,在没有回溯的情况下,运行时间为O(N2logN)。

  • 考虑计算机用来进行战略游戏的策略,如西洋跳棋和国际象棋。以简单得多的三连游戏棋(tic-tac-toe)来进行表述。
  • 两人轮流在一有九格方盘上划加字或圆圈,谁先把三个同一记号排成横线、直线、斜线,即是胜者。


  • (赋值)更一般的策略是使用一个赋值函数来给一个位置的“好坏”定值。能使计算机获胜的位置+1;平局得0;使计算机输棋的位置-1.
  • (终端位置)通过考察盘面能够确定这局输赢的位置叫做终端位置。
  • 极小极大策略)如果一个位置不是终端位置,那么该位置的值通过递归地假设双方最优棋步而确定。下棋的一方(人)试图使这个位置的值极小化,而另一方(计算机)却要使它的值极大。
    FindCompMove计算机选择具有最大值的一步行棋。
    FindHumanMove行棋人在此基础上找出具有最小值的一步行棋。
  • (后继位置)位置P的后继位置是通过从P走一步棋可以达到的任何位置Ps
    如果当在某个位置P计算机要走棋,那么它递归地求出所有的后继位置的值。计算机选择具有最大值的一步行棋,这就是P的值。
    为了得到任意后继位置Ps的值,要递归地算出Ps的所有后继位置的值,然后选取其中最小的值。这个最小值代表行棋人一方最赞成的应招。

(draw在英语表示和棋)

  • 第1行和第4行直接给和棋、赢棋赋值;其他情况,则该位置是非终端位置。
  • FindHumanMove递归调用FindCompMove。如果下棋人对一步棋的应招给计算机留下比计算机前面最佳棋步所得到的位置更好的位置,那么Value和BestMove将被更新。

3.3 极小极大策略用于更复杂的游戏——西洋跳棋、国际象棋

  • (递归深度、求值函数)搜索到终端节点的全部棋步不可行,达到某个深度(层)之后只能停止搜索。递归停止出的结点则成为终端结点。这些终端结点的值由一个估计位置的值的函数计算出来了。
    求值函数对于成功是至关重要的,因为计算机的行棋选步是基于将这个函数极大化。最好的计算机下棋程序的求值函数惊人的复杂。
  • (置换表)如果已经计算过,那么一个位置在第二次出现时就不必再重新计算,将这些值存储在散列表中。
  • 博弈树:假象的棋局中用来给某些某个假设的位置求值的一些递归调用的迹。


  • 上图中几乎有一半的终端节点没有被检验。以下两个裁剪将证明计算它们的值将不改变树根的值。
  • 如图所示,D不需要求值。

  • 如果所示,C不用求值。


  • 给出一个无向图G = (V, E),需要用三种颜色之一为V中的每个顶点着色,三种颜色分别为1, 2, 3,使得没有两个邻接的顶点有同样的颜色。
  • 一个n个顶点图共有3n种可能的着色(合法的和非法的),所有可能的着色的集合可以用一棵完全的三叉树表示,称为搜索树。在这棵树中,从根到叶节点的每一条路径代表一种着色指派。(跟n个元素的全排列类似,只不过只有两种可能,大于和小于的决策树,

  • 结点是用深度优先搜索的方法生成
  • 不需要存储整棵搜索树,只需要存储根到当前活动结点的路径


  • 内层while循环实现前进(生成新结点)
  • 外层while循环实现回溯的过程



最坏情况下生成了O(3n)个结点,对于每个结点,都需要O(n)的时间来检查。因此,最坏情况为O(n3n)。

  • 8皇后问题:如何在8 × 8的国际象棋棋盘上安排8个皇后,使得没有两个皇后能相互攻击?如果两个皇后处在同一行、同一列或同一条对角线上,则她们能互相攻击。
  • n皇后问题:如何在n × n的国际象棋棋盘上安排n个皇后,使得没有两个皇后能相互攻击? n ≥ 1。

5.2 考虑4皇后问题的解法

5.2.1 解空间——搜索空间

  • (没有两个皇后在同一行)每行上有4个位置,就有44种可能的布局,每种可能的布局可以用一个4分量的向量x = {x1, x2, x3, x4}描述。
  • (没有两个皇后在同一行和同一列)搜索空间由44减少到4!。
  • 算法尝试生成并以深度优先方式搜索一棵完全四叉有根树
    树根对应于没有放置皇后的情况;
    第一层的结点对应于皇后的第一行的可能放置情况;
    第二层的结点对应于皇后在第二行的可能放置情况;
  • 合法——表示一个不互相攻击的4个皇后的放置
    部分——表示一个不互相攻击的少于4个皇后的放置

回溯法求解4皇后问题的搜素树

  • 寻找无向图G=(V, E)中的哈密顿回路。
  • 设无向图G=(V, E),v1v2...vn是G的一条通路,若G中每个顶点在该通路中出现且仅出现一次,则称该通路为哈密顿通路。若v1=vn,则称该通路为哈密尔顿回路。
  • 用布尔数组c[n][n]来表示图的邻接矩阵,如果顶点i和j相邻接,则c[i][j]为真。则哈密顿回路满足如下约束:


  • step1.把顶点0作为回路中第一个顶点,搜索与顶点0相邻接的编号最小的顶点,作为它的后续顶点
  • 寻找与xi-1相邻接的并且不属于l的编号最小的顶点。如果搜索成功,就把这个顶点作为通路中的顶点xi,然后继续搜索下一个顶点。
  • step3.如果不成功,就把l中的xi-1删除,从xi-1的顶点编号加1的位置开始,继续搜索与xi-2相邻接的并且不属于l的编号最小的顶点
  • step4.当搜索到l中的顶点xn-1时,如果xn-1与x0相邻接,则所生成的回路就是一条哈密顿回路;
    否则,把l中的xn-1删除,继续回溯。最后,如果在回溯过程中,l中只剩下一个顶点x0,则表明图中不存在哈密顿回路。(如果图中存在一个哈密顿回路,那么从任何一个顶点出发都能找到一个,如果回溯到只有一个顶点,则表明x0与其相邻接的顶点的所有可能性都常识过了,都不能形成哈密顿回路,因此必然不存在。
  • 1.基本概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件...

  • 回溯算法 主要思想 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。八皇后问题就是回...

  • 回溯法 回溯法的算法框架 1. 综述 从问题的 解空间树 中,按照 深度优先 的策略,从根节点出发搜索解空间树。 ...

  • 回溯(backtracking): 有“通用解题法”之称。用它可以系统地搜索问题的所有解。它在问题的解空间树中,按...

  • 贪心算法 先来比较一下贪心算法和动态规划 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,不考虑整体,...

  • 99颗糖 | 第10颗 我这人有一个癖好 特别喜欢闻男生身上的味道 如果男生的身上带有一股清香 对这个男生的好感度...

  • 星期六我们去了永济,我们分别要参观三个景点。分别是铁牛馆还有普救寺,还有鹳雀楼, 我们现在学校里集合。等到人全都到...

  • 最近迷上了窦文涛《圆桌派》,三不五时几个老男人加一到两个姑娘围一起,就这各种话题聊上半小时,有关于吃的住的最新话题...

}

我要回帖

更多关于 错误归因理论 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信