贪心与随机贪心
贪心逐步选择张量对;随机贪心生成多条路径,再比较完整路径的目标值。
本页目录
贪心:逐步选择张量对
贪心搜索每次选择一对张量,记录收缩步骤,并用它们的收缩结果替换这两个张量。这里更新的是 index 结构,不执行数组计算。
局部得分的基础形式为:
是收缩结果, 是元素数, 对应 costmod。得分越低,候选越优先。这个得分用来选择下一步,不是完整路径的优化目标。
下面的伪代码省略候选集合的维护细节:
path = []
while 存在共享 index 的候选张量对:
(A, B) = 局部得分最低的候选
C = 计算收缩结果的 index 结构
将 (A, B) 追加到 path
用 C 替换 A、B,并更新候选
按张量大小从小到大,用外积合并剩余分量
return path
共享 index 只有在不属于输出、且不再被其他张量使用时,才会在该步消去。
随机贪心:比较多次搜索
random_greedy 反复生成完整路径。不同尝试使用不同参数;温度为正时,还会在得分靠前的候选窗口内加权采样,而不总是选择第一名。
并行执行 ntrials 次尝试:
parameters = 本次尝试的参数
path = 按 parameters 生成一条贪心路径
score = 完整路径的目标值 J(path)
return score 最低的路径
前三次尝试(若存在)使用 costmod=1、4、8 的零温度起点;后续尝试随机采样参数。不同尝试可以并行,但一条路径内的收缩选择仍逐步进行。
这里的温度控制张量对的选择,与模拟退火中接受树结构变化的温度不同。
接口
| 入口 | 作用 |
|---|---|
greedy |
生成一条确定性贪心路径 |
random_greedy |
运行指定次数的尝试,返回目标值最低的路径 |
随机贪心按本次调用的优化目标选择候选路径。在自动调度的 Light 和 Heavy 中,优化目标由顶层接口统一指定;独立调用时,未指定目标则使用库的默认权重。调用方式见 Rust API。ntrials 至少为 1。贪心与随机贪心都不保证全局最优。
并行
线程数决定同时运行多少次尝试,不会自动增加 ntrials。完整参数与返回类型见 Rust API。