回溯算法|经典例子分析

本文总结了算法设计分析课程中关于回溯算法的内容,包括装载问题、01背包问题、旅行售货员问题、n皇后问题和最大团问题的解决策略。通过回溯算法的递归和迭代实现,以及剪枝和限界函数的应用,探讨了如何在解空间中高效搜索。
摘要由CSDN通过智能技术生成

注:本学期算法设计分析课刘老师讲课内容总结

回溯

搜索算法:

穷举搜索(brute-force Search)
图遍历(Graph traversal)

  • 深度优先搜索(DFS)
  • 广度优先搜索(BFS)
    树遍历(Tree traversal)
  • 回溯(Backtracking)
  • 分枝限界法(Branch and Bound);
  • 博弈树搜索( α- β Search)等
    启发式搜索(Heuristic Search) (上一篇提到的随机化算法其实随机化只是思想啦,就是这个启发式搜索,例如模拟退火)

装载问题与01背包

装载问题

n件货物(重w[1:n])装两艘船(载重量c1,c2), ∑_(𝒊=𝟏to𝒏)〖𝒘[𝒊]〗 <= c1+c2, 是否有装载方案.
讨论过类似问题: 0-1背包, 分数背包, 最优装载
装载方案: 尽可能装满第1艘, 剩余的装第2艘
尽可能装满第1艘等价于下面变形的0-1背包

在这里插入图片描述

w[1:n],用长为n的01字符串(x[1:n]∈{0,1}^n)表示物品取或不取
蛮力:
没看懂。。先往下
懂了,就是遍历每一种可能方案,要尽可能装满达到载重量(嗳,看不懂不要急也不要死扣,往下就明白了( •̀ ω •́ )✧)

x[1:n]{
   0,1}^n, 
1. x=first(n), bestw=0, 
2. 当x≠last(n), 
3. |    cw=sumi=1n x[i]*w[i] 
4. |    若cw ≤ c 且 cw > bestw, 则bestw=cw 
5. |    x=next(n,x) 
字典序: 000,001,010,011,100,101,110,111. 执行?
逆字典序:1100 
格雷码序: 000,001,011,010,110,111,101,100, 减少cw计算量
缺点: 不容易剪枝 

简单回溯:
在这里插入图片描述
在树上进行深度优先搜索, 通常同层结构相同.

backtrack(t)  
// t:层号, cw:当前重量,  bestw:最优重量, t=n对应树叶
若t>n, (若cw≤c且cw>bestw, bestw=cw.)返回---//记录更新 
2. cw+=w[t], backtrack(t+1), cw-=w[t],-----------//左分支 
3. backtrack(t+1), 返回------------------------------//右分支 
 初始: bestw=cw=0,  执行 backtrack(1), 简单, 优美

需要剪枝

  1. 若 cw + w[t] ≤c, 则 -------------------是约束条件,(剪枝,剪去不满足约束条件的子树)

初始: bestw=cw=0. r=sumt=1n w[t] //当前剩余重量

backtrack(t)                        //t层号, cw, bestw 
1. 若t>n, (若cw>bestw, bestw=cw, bestx=x.) 返回 
2.  r-=w[t]
3. 若 cw + w[t] ≤ c,----------------//约束条件(剪枝) 
4.  |    cw+=w[t], x[t]=1, backtrack(t+1), cw-=w[t], //左分支
5. 若 cw + r > bestw,--------------//限界条件(剪枝)
6.  |    x[t]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值