Back Tracking(回溯法)

本文探讨了8皇后问题的解决方案,通过深度优先搜索(DFS)实现,并比较了与子集和问题的相似之处。涉及显式与隐式约束,以及如何用伪代码展示回溯法和优化策略。同时介绍了子集和问题的求解方法和状态空间树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义: 问题的解决方案定义为一个 n 元组:(x1, x2, …, xn),其中 xi 取自有限集 Si。 一般来说,我们需要:
a. 找到最大化(或最小化)特定目标函数 P(x1, x2, …, xn) 的向量。
b. 找到满足特定标准函数 P(x1, x2, …, xn) 的(或所有)向量。
约束(Constraints):
显式约束: 约束每个分量 xi 的值;所有满足显式约束的元组构成一个可能的解空间。
隐式约束: 组件间约束;隐式约束识别那些在解空间中满足标准函数的约束。

8-Queen problem

问题描述: 将 8 个皇后放在 8×8 棋盘上,使它们中的任何两个都不冲突,即它们中的任何两个都不位于同一行、列或对角线上。
用 1 到 8 标记行和列,还有皇后。
示例:
在这里插入图片描述

假设女王 i 位于第 i 行。
解可以定义为一个 8 元组 (x1, x2, …, x8),其中 xi 是皇后 i 的列号。
上面的解是(4,6,8,2,7,1,3,5)。
显式约束: xi ∈ Si,Si={1,2,3,4,5,6,7,8}, 1≤ i≤ 8。解空间由 8^8 个 8 元组组成。
隐式约束: 它们中的任何两个都不位于同一行、同一列(任意两个 xi 不同)或对角线。
解空间由从根到每个叶子的所有路径组成,例如(4,2,3,1)。
问题状态: 树中的每个节点在解决问题时标识一个问题状态。
状态空间: 从根到每个节点的所有路径
解决方案状态: 那些问题状态,从根的路径标识解决方案空间中的向量(满足显式约束)
答案状态: 那些从根的路径标识答案的解决方案状态(满足隐式约束)
状态空间树:
在这里插入图片描述
回溯法解决问题的方式: DFS
流程图:
在这里插入图片描述
在状态空间树中搜索:

  1. 基本概念
    活节点:一个已生成的节点,其子节点尚未全部生成。
    E-node:当前正在生成其子节点的节点。
    死节点:所有儿子都已生成或不需要生成儿子的节点。
  2. 以 DFS 方式生成问题状态
    E节点R的子C一旦生成,生成的子C就成为新的E节点,节点C在所有以节点C为根的树都被检查后,节点R将再次成为E节点。
    在这里插入图片描述
    一个 E 节点一直是 E 节点,直到它变成一个死节点。
    回溯法的伪代码:
    在这里插入图片描述
    T(X(1),…,X(k-1)) : 返回所有可能的 X(k) ,给定 X(1),…,X(k-1)。
    B(X(1),…,X(k)): 返回 X(1),…,X(k) 是否满足隐式约束。
    第一个if: 是否有没有为当前节点生成的子。这里使用了bound function(限界函数)。
    第二个if: 判断是否为答案状态,是则输出
    第三个if: DFS方式,让新生成的节点成为 E 节点。
    else: 所有的儿子都被检查过,回溯。
    N Queen 伪代码:
    在这里插入图片描述
    Bound function:
    在这里插入图片描述

Subset-sum problem

问题描述: 给定n+1个正整数:wi,1≤i≤n,M,求出W={wi}的所有子集,其中汇总等于M。
例如。 n=4,(wl,w2,w3,w4)=(11,13,24,7),M=31
预期的子集是(11,13,7)和(24,7)。
解决方案形式:
子集和问题的解定义为一个 n 元组 (x1,x2,… ,xn),其中 xi∈ {0,1}, 1≤i≤n。 如果wi包含在子集中,则xi=1,否则xi=0。
以上答案可以定义为(1,1,0,1)和(0,0,1,1)。
状态空间树:
在这里插入图片描述
很容易确定 X(i)/生成问题状态。
Bound function:
在这里插入图片描述
判断一个branch是否是应该被放弃,需测试条件,假设在level k 积累到的和为S,由于所有的权重都是事先排好序的,也即从小到大,所以如果S+wk+1>M,那么显然再沿着这条branch下去不可能得到一个可行解,只要还有能够找到的可能性,即如果S+∑wi(i=k+1~n)<=M,就沿着这个branch下去。两种情况综合起来就是限界函数。
伪代码:
在这里插入图片描述
其中,S=∑wi(I=1 ~ k-1)xi , r = ∑wi(I=k ~ n)
Initial call: SUMOFSUB(0,1,∑wi(i=1~n))
示例:
(w1, w2, w3, w4 ) = ( 5, 10 , 15, 20 ) ; M = 25
在这里插入图片描述

0-1 knapsack problem

问题描述: 小偷抢劫了一家商店,发现了 n 件物品,其中物品 i 的价值为 $pi,重量为 wi 磅,小偷最多可以在他的背包中携带 M ∈ N但他想尽可能多地装载有价值的物品。 他应该怎么选择?
定义解的形式为: 一个解定义为一个 n 元组 (x1,x2,… ,xn),其中 xi∈{0,1}, 1≤i≤n。 如果第 i 项被取走,则 xi=1,否则 xi=0。
需要注意的是:这是一个优化问题,我们会找到一个最佳答案,而不是可行的答案。
状态空间树:
在这里插入图片描述
Bound function:
在这里插入图片描述
如果右边描述的方法返回的利润大于现在获得的利润则继续搜索。
伪代码:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值