分支限界法|算法设计分析2

注:本学期刘老师算法设计分析课内容笔记

要一直坚持到最后都认认真真的人感觉很牛
另外悄咪咪吐槽一下老师后面的PPT都没有前面的好懂,当然也可能是因为后面我老走神没怎么听的缘故🤔

分支限界

装载问题分析🚩

广度优先搜索

  • 使用队列
    在这里插入图片描述
  • 使用优先队列:

cw: 当前重量, r: 剩余重量, 改进: 优先队列
设计关键值key=cw+r, 按关键值选择扩展节点
约束条件 cw ≤ c,节点记录: (key;cw) //省略层号
蓝色节点不需要扩展: key是子树上cw的上界 //对比回溯
还可使用限界条件和提前更新最优值剪枝
在这里插入图片描述

  • 分支限界

分支限界:上界key, 下界bestw, 关键值key
cw, r, bestw, key = cw + r, t //层号
==节点记录: (key; t, cw, r, bestw) ==
约束:cw≤c + 限界:key>bestw + 提前更新
结束: t>n或 队列空 或 上界=下界
在这里插入图片描述

总结:分支限界一般步骤
广度优先搜索
一般过程:

  1. 初始根节点是活节点(灰色,进队列), 其它节点白色
  2. while(true)
  3. 从队列取一个活节点, 设为扩展节点(红色)
  4. 将扩展节点的所有孩子设为活节点(灰色,进队列),
  5. 扩展节点设为死节点(黑色)
    取活节点方式: 先进先出队列 或 优先队列
    结束方式: 队列空 或 到达叶节点(需要设计)
    节点: 四种颜色, 三种状态
    在任意时刻只有一个扩展节点

Dijkstra: 优先队列或先进先出
输入: G=(V,E,w,s), w权, s起点;
输出: δ(s,·)

1. 初始d[s]=0, 其它d[u]=INF,  
2.  S,Q空, Q.add(s,0), 
3. 当Q非空          //Q是优先队列
4.    Q.delete(u), 若uS, continue(),
5.    将u添加到S中, 
6.    任意v∈adj[u], 松弛(u,v), 
7.            若d[v]改变, Q.add(v,d[v]) 
松弛(u,v):  若d[v]>d[u]+w[u,v], 则d[v]=d[u]+w[u,v]

啊啊啊啊啊孩子疯啦回溯和分支限界都没怎么懂😵🥴🧠

小结
回溯: 以深度优先方式搜索解空间
分支限界: 以广度优先或最小耗费方式搜索解空间
不考虑剪枝, 时间复杂度

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值