最大流算法 - 标号法

标号法求最大流

图论中网络的相关概念见上篇博客

算法基本思想:
从某个初始流开始,重复地增加流的值到不能再改进为止,则最后所得的流将是一个最大流。为此,不妨将每条边上的流量设置为0作为初始流量。为了增加给定流量的值,我们必须找出从发点到收点的一条路并沿这条路增加流量。

当前流为最大流的充要条件:网络中不存在增广路
最大流最小截定理:在任何网络中,最大流的流量等于最小截集的容量。
整数流定理:在任何网络中,如果网络所有的弧容量都是整数,则存在整数最大流。

明确一点:最大流是指网络中流的值达到最大,即源的出流量或汇的入流量达到最大,每段弧都有对应的流量,而不是求网络中某个路径的流量。

把最大流算法想象成两个运输站之间运货,两个运输站之间有很多个中转站,每个中转站都有一个最大容量,站与站之间运货都有不同的运货量,而且中转站不会留货物,所以货物的总量一定等于源站的出货数或者汇站的进货数。最大流算法就是在不超过所有中转站的容量的情况下,求最大出货量/进货量以及所有中转站之间的运货量。
如下图所示,左边是容量,右边是流量,在如图所示的流中,流的值达到了最大,为13,也不存在增广路,所谓增广路就是一条从源到汇的路径,路径上的所有弧非饱和(正向)或非空(反向),即一条仍能增加流量的路。
在这里插入图片描述
为什么说增广路是一条仍能增加流量的路?其实不难理解,增广路的定义如上文,路径上的所有弧非饱和(正向)或非空(反向),反向弧的流量假设为n,实际上等价于为正向弧的流量为-n,因为n不能小于0,所以n=0的时候,反向弧的流量虽然达到了最小,但是把他当做正向弧的时候,流量却达到了最大。
对于一条路径而言,非饱和弧和非空弧都意味着该条路径的流量没有达到饱和。既然网络中存在一条没有达到饱和的路径,那么网络的流也没有达到最大。这就是当前流为最大流的充要条件,可用数学语言证明。

算法文字描述:
步骤0:将网络中所有弧流量全部置0
步骤1:将源的点流量设为无穷大,令u=s。
步骤2:标记 点 v i = u v_i=u vi=u的所有未被标记的邻点 v j v_j vj的点流量(BFS)。
标记方法:若u到邻点是正向弧,且流量小于容量,则点流量 Δ ( v j ) Δ(v_j) Δ(vj)取前点流量 Δ ( v i ) Δ(v_i) Δ(vi)和弧的容流量差值 C i j − F i j C_{ij}-F_{ij} CijFij的较小者
若是反向弧连接,且流量大于0,则点流量 Δ ( v j ) Δ(v_j) Δ(vj)取前点流量 Δ ( v i ) Δ(v_i) Δ(vi)和弧流量 F i j F_{ij} Fij的较小者
步骤3:若标记到了汇则转步骤4,否则任选一个刚刚被标记的点设为 u u u,转步骤2,若刚刚没有标记任何点则算法结束。(步骤2由于会执行多次,刚刚表示步骤2最近一次执行时标记的点, v i v_i vi的可被标记的邻点
步骤4:从汇开始,依次回溯被标记的点,并将两点之间的弧加/减一个汇流量 Δ ( t ) Δ(t) Δ(t),正向则加,反向则减,回溯到源后,转步骤1。

算法符号描述:
步骤0: 设F是从源s到汇t的任意可行流,对任意 < μ , v > = < v i , v j > ∈ E <μ,v>=<v_i,v_j>∈E <μ,v>=<vi,vj>E,令 F i j = 0 F_{ij}=0 Fij=0。//从零流开始。
步骤1: 对源 s = v 0 s=v_0 s=v0标记为 ( s , + , Δ ( s ) = ∞ ) , S = { s } , U = { v j } , j = 0 , 1 , 2 , ⋯ , n ; μ = v i = s 。 (s,+,Δ(s)=∞),S={s},U={v_j},j=0,1,2,⋯,n;μ=v_i=s。 (s,+,Δ(s)=)S=sU=vj,j=0,1,2,,nμ=vi=s(S表示已标记的顶点集,U未检查的顶点集,初始值为全体顶点。)
步骤2: S ¯ S¯ S¯(S的补)中与 μ = v i μ=v_i μ=vi的所有邻点 v j v_j vj,有:
(1) 若 < v i , v j > ∈ E , 且 F i j < C i j <v_i,v_j>∈E,且F_{ij}<C_{ij} <vi,vj>EFij<Cij,则将 v j v_j vj标记为 ( v i , + , Δ ( v j ) ) (v_i,+,Δ(v_j)) (vi,+,Δ(vj)),其中 Δ ( v j ) = m i n ⁡ { Δ ( v i ) , C i j − F i j } , S = S ∪ v j Δ(v_j)=min⁡{Δ(v_i),C_{ij}-F_{ij}},S=S∪{v_j} Δ(vj)=minΔ(vi),CijFijS=Svj
(2) 若 < v j , v i > ∈ E <v_j,v_i>∈E <vj,vi>E,且 F i j > 0 F_{ij}>0 Fij>0,则将 v j v_j vj标记为 ( v i , − , Δ ( v j ) ) (v_i,-,Δ(v_j)) (vi,,Δ(vj)),其中 Δ ( v j ) = m i n ⁡ { Δ ( v i ) , F i j } , S = S ∪ v j Δ(v_j)=min⁡{Δ(v_i),F_{ij}},S=S∪{v_j} Δ(vj)=minΔ(vi),FijS=Svj
步骤3: v j = t ∈ S v_j=t∈S vj=tS,转步骤4,否则 v j ≠ t v_j≠t vj=t,令 U = U − v i U=U-{v_i} U=Uvi,若 S ∩ U = φ S∩U=φ SU=φ,则算法结束,当前流为最大流;否则若 S ∩ U ≠ φ S∩U≠φ SU=φ,任选 v i ∈ S ∩ U v_i∈S∩U viSU,转步骤2。(实际上,S∩U就是步骤2中刚刚被标记的点)
步骤4: z = t z=t z=t
步骤5: z z z的标记为 ( g , + , Δ ( z ) ) (g,+,Δ(z)) (g,+,Δ(z)),则 F ( < g , z > ) = F ( < g , z > ) + Δ ( z ) F(<g,z>)=F(<g,z>)+Δ(z) F(<g,z>)=F(<g,z>)+Δ(z)
若z的标记为 ( g , − , Δ ( z ) ) (g,-,Δ(z)) (g,,Δ(z)),则 F ( < z , g > ) = F ( < z , g > ) − Δ ( z ) F(<z,g>)=F(<z,g>)-Δ(z) F(<z,g>)=F(<z,g>)Δ(z)
步骤6: g = s g=s g=s,则取消所有点的标号,转步骤1,否则,令 z = g z=g z=g,转步骤5。
标记的意义: ( v i , + , Δ ( v j ) ) (v_i,+,Δ(v_j )) (vi,+,Δ(vj))表示点 v i v_i vi经流量为 Δ ( v j ) Δ(v_j) Δ(vj)的正向弧到达点 v j v_j vj
( v i , − , Δ ( v j ) ) (v_i,-,Δ(v_j )) (vi,,Δ(vj))表示点 v i v_i vi经流量为 Δ ( v j ) Δ(v_j) Δ(vj)的反向弧到达点 v j v_j vj

符号描述可能不好理解,对照文字描述理解。

例子:(编辑太麻烦了,从word截的图)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
欢迎讨论

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP饶了我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值