退火与副本交换
从已有收缩树出发,用模拟退火探索不同结构,或在多个温度之间交换搜索状态。
本页目录
局部改变收缩树
模拟退火(simulated annealing)和副本交换(parallel tempering / replica exchange)都从已有完整路径出发。局部更新改变树中几个节点的组合方式,不执行数组计算。
旋转前
旋转后
这些方法允许暂时接受代价更高的状态,同时单独保留历史最佳路径。
模拟退火
温度较高时,更容易接受较差的候选;随着温度降低,搜索更倾向于保留改善。对能量增量 ,Metropolis 接受概率为:
为逆温度。这个式子用于 treesa_path 时,能量为 ,其中 是完整路径的优化目标。anneal_path 则按相对目标变化与相对温度计算接受概率,不能直接套用同一组温度参数。
current = 初始树
best = 初始树
按温度序列搜索:
重复尝试局部更新:
candidate = 对 current 做一次局部旋转
按该方法的 Metropolis 准则决定是否接受 candidate
若接受,则 current = candidate
若 current 足够改善 best,则 best = current
return best
anneal_path 运行一条链;anneal_paths 从同一起点并行运行多条独立链;treesa_path 使用逐渐增加的逆温度,在每个温度下遍历树。它们都返回一条最佳路径。
副本交换
多个副本分别在不同温度下搜索。每轮局部搜索完成后,尝试交换相邻温度的状态。与独立运行多条退火链相比,多了这一步状态交换。
P、Q、R、S 表示完整收缩树。接受交换后,分别从 P 和 Q 对应的树状态出发,在 T₁ 和 T₀ 下继续搜索。
用起始路径初始化不同温度的副本
重复各轮搜索,直到达到轮数或停止条件:
各副本并行执行本轮局部搜索
尝试交换相邻温度的副本状态
更新历史最佳路径
return 历史最佳路径与最佳起始路径中较好的一条
各副本内的旋转按相对目标变化决定是否接受;相邻副本之间的交换则使用 、,交换概率为:
temper_path 从同一路径初始化各副本;temper_paths 可用多条路径初始化。副本数不等于返回路径数,两个函数都只返回一条路径。
接口与局部重构
| 方法 | 接口 |
|---|---|
| 模拟退火 | anneal_path、anneal_paths |
| 按逆温度遍历树 | treesa_path |
| 副本交换 | temper_path、temper_paths |
完整参数、温度定义和停止设置见 Rust API。这些方法保留最佳输入作为备选,但不保证全局最优。
周期性子树重构
副本交换的局部搜索还可以周期性调用子树重构。它直接求解一个局部小网络,与一次树旋转不同。