免责声明:未严格证明以下方法是最佳方法。提供了非正式证明。
当考虑产品的平方时,问题减少到寻找最有效的订购。
例如,当查看例如,我们只需要最优解因为它扩展为。再次串联不会添加任何有用的订购信息。这里的直觉是,由于可以自下而上地解决最佳排序的问题,因此使用相同矩阵由更多元素组成的更高排序是不相关的。(ABC)50(ABC)2ABCABCABC
找到的最佳顺序为矩阵链乘法问题。找到最佳排序后,将求幂应用于排序中的三元组(通常为n元组)。ABCABC
例如,如果平方的最佳排序是,则初始问题的解是。A(B(CA))BCA(B(CA))49BC
概括而言:
1)求解第一步是求解。
2)最好将作为矩阵链乘法问题的一个实例。
3)使用(2)中的解决方案的n元组排序将为我们提供(1)的解决方案,即某种风味(请注意,其他任何(2)中的分组也应适用。(A1A2⋯An)m(A1A2⋯An)2
(A1A2⋯An)2
GA1⋅A2⋅Gm−1⋅An
非正式的证据
使用两个矩阵考虑最简单的情况下,,我们是注意到和的维度和分别。任何使用和都具有以下尺寸之一:(AB)nABX×YY×XAB
X×Y
Y×X
Y×Y
X×X
我们有或。X<YY≤X
假设1a): 具有维数,并且从下而上的方法可以保证这种排序是最佳的。和其他任何配置都相同或更好。因此,该问题被最佳地解决为。X<Y
ABX×XAB(AB)n
假设1b): 尺寸为。这是涉及和所有产品的最佳订购。因此,该溶液被最佳发现为。Y≤X
BAY×YABA(BA)n−1B
这样就证明了这一结论,我们只研究了平方问题中的两个排序。ABAB
使用更多矩阵,论点是相似的。也许可以归纳证明?一般的想法是,求解平方的MCM将为考虑所有涉及矩阵的操作找到最佳大小。
案例分析:
julia> a=rand(1000,2);
julia> b=rand(2,1000);
julia> c=rand(1000,100);
julia> d=rand(100,1000);
julia> e=rand(1000,1000);
julia> @time (a*b*c*d*e)^30;
0.395549 seconds (26 allocations: 77.058 MB, 1.58% gc time)
# Here I use an MCM solver to find out the optimal ordering for the square problem
julia> Using MatrixChainMultiply
julia> matrixchainmultiply("SOLVE_SQUARED", a,b,c,d,e,a,b,c,d,e)
Operation: SOLVE_SQUARED(A...) = begin # none, line 1:
A[1] * (((((A[2] * A[3]) * (A[4] * (A[5] * A[6]))) * (A[7] * A[8])) * A[9]) * A[10])
end
Cost: 6800800
# Use the ordering found, note that exponentiation is applied to the group of 5 elements
julia> @time a*(((((b*c)*(d*(e*a)))^29*(b*c))*d)*e);
0.009990 seconds (21 allocations: 7.684 MB)
# I also tried using the MCM for solving the problem directly
julia> @time matrixchainmultiply([30 instances of a,b,c,d,e]);
0.094490 seconds (4.02 k allocations: 9.073 MB)