《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分支定界

本文介绍了分支定界算法的基本思想,与回溯法的区别,并通过货箱装载问题进行说明。在算法中,每个节点只扩展一次,通过FIFO或最小耗费法选择扩展节点。货箱装载问题的解决展示了分支定界法如何有效避免重复节点,且能适应不同扩展策略,如使用优先级队列优化。

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

《数据结构、算法与应用 —— C++语言描述》学习笔记 — 分支定界

一、算法思想

分支定界是一种系统地搜索解空间的方法。它与回溯发的主要区别在于扩展节点的扩充方式。每个活动节点仅有一次机会变成扩展节点。当一个节点变为扩展节点时,从该节点移动一步即可到达的节点是生成的新节点。在省城的节点中,那些不可能导出最优可行解的节点被舍弃,剩余节点加入活动节点列表,然后从表中选择下一个节点作为下一个扩展节点。将选择的节点从表中删除,然后扩展。这种扩展股哟成一直持续到一个解找到了或活动表称为空表。

有两种常用的方法可以用来选择下一个扩展节点:

  • FIFO
  • 最小耗费或最大收益法

回想我们前面解决迷宫老鼠问题,如果我们修改为:使用队列保存所有活动节点;每扩展一个节点,就将其所有可用的相邻接点加入队列中。我们就不需要重复将相同的节点变为扩展节点,而只需要处理队列中的节点即可。

二、货箱装载

我们还是以货箱装载为例,对比两种实现:

#pragma once
#include <vector>
#include <numeric>
#include <queue>

typedef std::pair<int, int> weightAndRestTotal;
typedef std::pair<int, int> nodeAndCurWeight;

int maxLoading(const std::vector<int>& weight, int capacityOfBoat)
{
   
	using <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值