分支限界法|算法设计分析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
    评论
背包问题是一个经典的组合优化问题,它的目标是在给定的一组物品中选择一些物品放入一个容量为W的背包中,使得背包中物品的总价值最大。分支限界法是解决背包问题的一种常用算法,它通过不断地分解问题,将问题空间划分为多个子问题,并对每个子问题进行求解,最终得到原问题的最优解。 下面是背包问题分支限界法的代码算法设计分析: 1. 算法设计 (1)定义节点类Node,包含以下成员变量: - weight:当前节点已经装入背包的物品重量; - value:当前节点已经装入背包的物品价值; - bound:当前节点的价值上界; - level:当前节点所在的层数; - path:当前节点所在的路径。 (2)定义优先队列Q,用于存储待扩展的节点。 (3)初始化根节点,并将其加入队列Q中。 (4)循环执行以下步骤: - 从队列Q中取出一个节点; - 如果该节点的价值上界小于当前最优解,则舍弃该节点; - 如果该节点是叶子节点,则更新当前最优解; - 否则,生成该节点的左右子节点,并将它们加入队列Q中。 (5)输出当前最优解。 2. 算法分析 背包问题分支限界法的时间复杂度为O(2^n),其中n为物品的数量。由于该算法需要对每个节点进行价值上界的计算,因此空间复杂度为O(n)。在实际应用中,该算法的效率受到物品数量和背包容量的限制,当物品数量较大或背包容量较小时,该算法的效率会受到较大影响。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值