当前阶段 & 局限

1
2
3
4
5
6
7
目标:
把当前普通 CDS 骨干 C 增强成 2-connected CDS。

核心策略:
每一轮找一条候选增强路径;
路径成功后,把路径中间节点加入 C;
反复执行,直到 G[C] 变成 2-connected。

准确一点应该说:

当前策略不是“直接选择一条新增节点数最少的路径并必然使用”,而是“按新增节点数从小到大依次尝试候选路径,第一条 probe 成功的路径被采用”。

这个区别很重要。因为最短路径可能包含 inactive 节点,probe 失败后算法会继续尝试下一条候选路径。

当前多轮增强策略

augment_until_2_connected() 外层做的是:

1
2
3
4
5
while G[C] 还不是 2-connected:
计算当前割点和 leaf blocks
执行一轮路径增强
成功后更新 C
重新检查 G[C]

如果某轮失败,或者达到最大轮数,就停止。

所以这不是一次性把所有 leaf blocks 都修完,而是:

每轮只成功加入一条路径,然后重新计算当前骨干结构。

这个是合理的,因为加入一条路径后,G[C] 的 block 结构会变化,原来的 leaf block 可能消失,也可能产生新的结构,所以每轮重新计算是对的。


8. 当前策略的优点

当前策略的优点很明显:

优点一:简单、可解释

它非常容易讲:

找 leaf block,找最短增强路径,probe 成功后加入路径中间节点。

这个适合当前预研究阶段。

优点二:新增节点数可控

因为排序依据是:

1
len(p.inner_nodes)

所以算法天然倾向于选择代价小的路径。

这也能解释你前面的实验图:新增节点数大多在 3 到 5 左右。

优点三:不直接使用 target_nodes

当前增强部分输入没有 target_nodes,路径生成也只依赖 Gnodes.colorC。这一点很好,后面汇报可以强调。


9. 当前策略的局限

也有几个局限,你后面可以作为改进方向。

局限一:只看路径长度,不看成功概率

当前排序只看:

1
新增节点数少

但没有考虑路径中 WHITE 节点的 active 概率。

比如:

1
2
路径 A:1 个 WHITE 节点,p=0.2
路径 B:2 个 GRAY 节点,已知 active

当前算法会优先尝试路径 A,因为新增节点少。但从成功概率看,路径 B 可能更稳。

所以后面可以改成:

1
路径代价 = 新增节点数 / 路径成功概率

或者:

1
优先选择 GRAY 多、WHITE 少、active probability 高的路径

局限二:每个 leaf block 最多取前几个候选路径

你有参数:

1
max_paths_per_leaf = 5

而且在生成路径时:

1
2
if len(candidate_paths) > max_paths_per_leaf:
return candidate_paths

这个地方还有个小细节:如果你想最多返回 5 条,应该写成:

1
2
if len(candidate_paths) >= max_paths_per_leaf:
return candidate_paths

现在 > 会导致可能返回 6 条。

这个不是大问题,但可以顺手修一下。


局限三:对所有 u, v 只取一条 shortest path

对于每对 u, v,你现在只取:

1
nx.shortest_path(...)

但图中可能有多条长度相同或稍长一点的备选路径。当前只拿一条,可能错过更可靠的路径。

后续可以考虑:

1
k-shortest paths

但当前阶段先不用复杂化。


局限四:路径成功后只加入 inner_nodes,没有进一步优化

这符合当前设计,但可能加入了一些非必要节点。后续可以做剪枝,比如增强完成后尝试删除冗余节点,保持 2-connected 和 domination 不变。

1
2
3
4
5
6
第二阶段以阶段一得到的 CDS C 为基础,重复检查 G[C] 的割点和 leaf block。
当 G[C] 不是 2-connected 时,算法选择一个 leaf block,并尝试在原图 G 中寻找一条连接该 leaf block 与其他骨干部分的增强路径。

路径搜索时会删除已确认 inactive 的 RED 节点,并删除除路径端点外的已有骨干节点,从而保证路径中间部分由非骨干节点组成。候选路径允许包含 WHITE 节点,但在真正加入骨干前需要通过 adaptive probing 确认其 active 状态。

当前路径选择采用贪心策略:优先尝试中间节点数量最少的候选路径。如果路径上的中间节点全部探测为 active,则将其加入 C;否则该路径失败,并尝试下一条候选路径。该过程重复进行,直到 G[C] 达到 2-connected 或无法继续增强。
1
找 leaf block → 生成可行增强路径 → 按新增节点数排序 → probe → 成功则加入 C → 重复直到 2-connected