回溯法一般方法及n-皇后问题

1、一般方法
1.1什么是回溯法
1.2基本概念及术语
1.3回溯法思想、步骤以及形式化描述
1.4回溯法效率分析
2、8-皇后问题

一、一般方法

1、什么是回溯法

例如:迷宫游戏中,我们每次到一个路口可能会有很多种选择,随机选择一种,如果这条路不可行,原路返回至原路口,重新选择
在这里插入图片描述
回溯法是一种搜索算法,是通用的解题方法

回溯法的本质
  • 深度优先的方式系统地搜索问题的解
  • 用来寻求一组解求满足某些约束条件的最优解
  • 适用于求解组合数较大的问题
基本概念

在这里插入图片描述

  • 为了判定当前的n-元组是否是我们要求的解,设置了一个规范函数
  • 硬性处理就是暴力解法,统统遍历
    在这里插入图片描述
  • 显式条件约束就是从每个集合S中取出的元素x要满足其所属集合的性质。是从整体的最明显的要满足的条件来定义的(与问题实例可能有关可能无关
  • 隐式约束条件是这些取出来的x之间的关系的一种描述,比如规范函数P(x1,x2…,xn)就是一种描述这些x之间的关系的一种隐式约束条件。(与问题实例一定有关

二、8-皇后问题

在这里插入图片描述
分析显式约束条件和隐式约束条件:
显式约束条件有8^8种,就是很明显的要在棋盘上
隐式约束条件有8!种,解空间缩小
在这里插入图片描述
在这里插入图片描述
不仅仅是主对角线,只要是斜角线即可。
通过这种表示方式,可以将两个皇后的位置关系数据化
在这里插入图片描述
看第k个皇后的放置位置是否满足约束条件:
在这里插入图片描述
i相当于自变量x,X(i)相当于对应的函数,两个自变量对应的函数值相减,就能得出纵坐标的差值们然后比较纵坐标的差值和横坐标的差值是否相等来判断是否为斜对角,正常的行和列就直接看x轴和y轴对应的相等就行。
判断皇后是否能放到第k行第X(k)列
在这里插入图片描述
在这里插入图片描述
算法思路分析

  • 首先从k=1,开始因为每次进入循环的第一步是+1,所以刚开始的时候要把X(k)置零,否则后面不能直接进入循环+1,这样会导致第一个位置不会被search到,否则就要改变循环里面+1的位置
  • 然后进入循环之后,比较显式约束条件X(k)<=n和隐式约束条件place(k),如果不符合继续+1检验
  • 直到退出循环:这时候看是由于哪个条件退出的循环,如果是X(k)<=n这个时候判断自变量的值k是否已经为n因为是从1开始顺序进行的所以到n就意味着全部都选择完毕了,就可以直接进行输出,如果没到n应该把自变量+1,继续判断还没有找到自己位置的自变量
  • 否则如果是因为NOT PLACE退出的,应该进行回溯
8-皇后问题算法效率分析

在这里插入图片描述

蒙特卡罗方法

蒙特卡罗方法的使用前提:注意第二点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
蒙特卡罗方法是一种随机选择的方法,在所有解空间树中随机选择一条路径。
在这里插入图片描述
因为是随机试验,所以要再次选择其他的情况进行选择
在这里插入图片描述
用同样的方法进行5次试验求取平均值
在这里插入图片描述
用回溯法求8皇后的问题还是可以的!

子集和数问题

在这里插入图片描述
子集和数问题的解的表示形式(一)k-元组表示法
元组大小不固定的解的表示法
在这里插入图片描述

子集和数问题的解空间树(一)

在这里插入图片描述
⚠️所有的节点都是解状态
然后再在这些元组中找到满足条件的元组!
子集和数问题的解的表示形式(二)n-元组表示法
在这里插入图片描述
实际上表示法二体现了一种规范性,也就是说不是直接采用子集的数本身来进行表示,而是采用了对应的index,这样处理,无论是可以更好的体现出存在于解空间之内,和在解空间之外的解之间的关系和对最终结果的影响。

子集和数问题的解空间树(二)

在这里插入图片描述
⚠️这里的D检索是从后往前的检索,利用的是堆栈的结构,所以才会是后面的在遍历的前面
⚠️所有的分支节点对应的是问题状态,叶子节点代表的是解状态

实际上两种解空间树的区别在于,第一种方法直接将每个元素选择或者是不选择放到下一步的节点中了,在路径中并没有体现;而第二种方法是将每一个元素选择或者不选择这两种情况直接通过树的路径表示出来了。

解空间的树结构在这里插入图片描述

在这里插入图片描述
先判断该节点是否肯定不包含问题的解。
在这里插入图片描述
问题状态生成过程中的术语:
在这里插入图片描述
在这里插入图片描述

n-皇后问题

在这里插入图片描述
在这里插入图片描述
根结点表示整个棋盘的初始状态,一个棋子都没有放。

三、4-皇后问题

在这里插入图片描述
一旦节点2生成以后接着要处理的是节点2,在处理节点2的时候节点1,节点2都是活节点,但是节点2是E-节点,E-节点只能有一个
在这里插入图片描述
很显然,通过判断限界条件,很明显节点3以及以节点3为根的子树中,不可能产生问题的解。节点3被kill回溯到节点2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所有的分支都不可能有解了,所以节点2应该回溯到节点1
在这里插入图片描述
在这里插入图片描述
如果初始问题是找到这个问题的一个解那么这个算法到这里就结束了,如果是找到左所有解,需要遍历整个🌲

回溯算法的思想
  • 针对所给问题定义问题的解空间,解空间应至少包含问题的一个最优解(答案节点)
  • 确定易于搜索的解空间结构
  • 深度优先方式搜索解空间,并在搜索过程中使用限界函数避免无效搜索在这里插入图片描述
回溯算法的形式化描述

在这里插入图片描述
在这里插入图片描述

  • n是问题的规模,X(1:n)是n元组也就是从根节点到叶子节点所对应的路径,也就是解向量。要依次处理X中的每一个元素,用K作为编号,初始值为1.
  • 当k=0时也就证明这个状态空间树都已经搜索完毕了对,如果是左右子树的话根节点的左右子树实际上左子树完成之后不是回溯到根结点,而是到左子树都根节点然后继续右子树,只有当根节点的全部子树都处理完毕之后才能返回根节点,即k=0
    在这里插入图片描述
  • 是利用整个递归的特点,在递归到递归出口的时候会自动进行返回,这种返回就直接意味着当前的k值退回到原来的k值
  • 当满足for循环里面的条件时意味着当前节点是活节点且把当前节点置为E-节点,然后进入for循环内部,如果当前已经是一条抵达答案节点的路径了,就将当前路径打印出,然后进入下一个,如果当前不是一条到达答案节点的路径,仍然进行k+1的节点的判断
  • 如果当前for循环的条件不满足的话,当前节点为死节点,直接return到上一层递归也就是k-1,完成了回溯
回溯法的效率估计

在这里插入图片描述
个人感觉分为节点生成和节点选择两个方面:
首先根据显式约束条件进行解空间节点的生成,所以满足条件的X(k)数目,和每个X(k)生成的时间就是影响其效率的因素;然后就是进行搜索解空间树,每个节点需要通过限界函数进行计算,所以限界函数计算的时间是影响的因素,通过B检验的数目也就是活节点的数目表示了解空间尚需进行判断的元素的数目。

满足Bi的X(k)数目也就是下一步需要展开的节点数
限界函数:减少通过检验的节点数,减少函数本身的计算时间(但在实际上要在计算时间和减少节点数量上进行折中
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值