7.2 总结
当前阶段 & 局限
1 | 目标: |
准确一点应该说:
当前策略不是“直接选择一条新增节点数最少的路径并必然使用”,而是“按新增节点数从小到大依次尝试候选路径,第一条 probe 成功的路径被采用”。
这个区别很重要。因为最短路径可能包含 inactive 节点,probe 失败后算法会继续尝试下一条候选路径。
当前多轮增强策略
augment_until_2_connected() 外层做的是:
1 | while G[C] 还不是 2-connected: |
如果某轮失败,或者达到最大轮数,就停止。
所以这不是一次性把所有 leaf blocks 都修完,而是:
每轮只成功加入一条路径,然后重新计算当前骨干结构。
这个是合理的,因为加入一条路径后,G[C] 的 block 结构会变化,原来的 leaf block 可能消失,也可能产生新的结构,所以每轮重新计算是对的。
8. 当前策略的优点
当前策略的优点很明显:
优点一:简单、可解释
它非常容易讲:
找 leaf block,找最短增强路径,probe 成功后加入路径中间节点。
这个适合当前预研究阶段。
优点二:新增节点数可控
因为排序依据是:
1 | len(p.inner_nodes) |
所以算法天然倾向于选择代价小的路径。
这也能解释你前面的实验图:新增节点数大多在 3 到 5 左右。
优点三:不直接使用 target_nodes
当前增强部分输入没有 target_nodes,路径生成也只依赖 G、nodes.color 和 C。这一点很好,后面汇报可以强调。
9. 当前策略的局限
也有几个局限,你后面可以作为改进方向。
局限一:只看路径长度,不看成功概率
当前排序只看:
1 | 新增节点数少 |
但没有考虑路径中 WHITE 节点的 active 概率。
比如:
1 | 路径 A:1 个 WHITE 节点,p=0.2 |
当前算法会优先尝试路径 A,因为新增节点少。但从成功概率看,路径 B 可能更稳。
所以后面可以改成:
1 | 路径代价 = 新增节点数 / 路径成功概率 |
或者:
1 | 优先选择 GRAY 多、WHITE 少、active probability 高的路径 |
局限二:每个 leaf block 最多取前几个候选路径
你有参数:
1 | max_paths_per_leaf = 5 |
而且在生成路径时:
1 | if len(candidate_paths) > max_paths_per_leaf: |
这个地方还有个小细节:如果你想最多返回 5 条,应该写成:
1 | if len(candidate_paths) >= max_paths_per_leaf: |
现在 > 会导致可能返回 6 条。
这个不是大问题,但可以顺手修一下。
局限三:对所有 u, v 只取一条 shortest path
对于每对 u, v,你现在只取:
1 | nx.shortest_path(...) |
但图中可能有多条长度相同或稍长一点的备选路径。当前只拿一条,可能错过更可靠的路径。
后续可以考虑:
1 | k-shortest paths |
但当前阶段先不用复杂化。
局限四:路径成功后只加入 inner_nodes,没有进一步优化
这符合当前设计,但可能加入了一些非必要节点。后续可以做剪枝,比如增强完成后尝试删除冗余节点,保持 2-connected 和 domination 不变。
1 | 第二阶段以阶段一得到的 CDS C 为基础,重复检查 G[C] 的割点和 leaf block。 |
1 | 找 leaf block → 生成可行增强路径 → 按新增节点数排序 → probe → 成功则加入 C → 重复直到 2-connected |