(算法理论)回溯法与与分支限界法(python)

本文详细介绍了回溯法与分支限界法的区别,以及这两种方法在解决实际问题中的应用,例如单源最短路径问题。在分支限界法中,通过队列式和优先队列式进行广度或最小耗费优先的搜索,以找到最优解。而在回溯法中,采用深度优先搜索并利用剪枝函数避免无效搜索,常见于0-1背包问题和旅行售货员问题等。文章还给出了Python实现的相关代码示例。

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

分支限界法与回溯法的区别

  1. 求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
  2. 搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。

在这里插入图片描述

分支限界法

核心思想:分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。
此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

常见的两种分支限界法

  1. 队列式(FIFO)分支限界法:
    按照队列先进先出(FIFO)原则选取下一个结点为扩展结点。
  2. 优先队列式分支限界法:
    按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。

通过实例问题来理解方法:

分支限定法解单源最短路径:

问题描述:

在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。

在这里插入图片描述
个人理解:
什么叫分支限界?用FIFO队列方法来说明:
一、将图G的单源最短路径问题分解为解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。
创建队列。

在这里插入图片描述
二、

  1. 节点s入队列,Q={ s },我们取出队头节点,作为扩散节点,更新他的后代的值。
     如图所示更新节点a,b,c的距离,并将他们加入队列,Q={s,a,b,c}。 完成后节点s出队。
     Q={a,b,c}。
  2. 同样,重复1的步骤,取出队头节点,a作为扩散节点,Q={a,b,c,u,e,d}。完成后节点a出队。
    Q={b,c,u,e,d}。
  3. 同样,继续重复,取出队头节点,b作为扩散节点,Q={b,c,u,e,d,g,f}。完成后节点b出队。
    Q={c,u,e,d,g,f}。
  4. 同样,继续重复,取出队头节点,c作为扩散节点,Q={c,u,e,d,g,f , h }。完成后节点c出队。
    Q={u,e,d,g,f , h }。
  5. 当u作为扩散节点,f和g入队,我们发现f节点已经在队列中,这时比较:s—a—u—f 权重为14,s—b—f 权重为12,所以s—a—u—f这条路径就被剪枝掉了,之后我们不再考虑。 这就是“限界”(称为”剪枝“)的思想。
  6. 重复步骤,直到Q为空。

优先队列法方法和FIFO方法类似,区别在于优先队列每次取队列元素中到源点距离最短的点。

python实现源代码:

# 初始化图参数 用字典初始初始化这个图
G = {1: { 2: 4, 3: 2,4:5},
     2: { 5: 7, 6: 5},
     3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值