ข้อสงวนสิทธิ์: วิธีการต่อไปนี้ยังไม่ได้รับการพิสูจน์อย่างเข้มงวดว่าเหมาะสมที่สุด มีการพิสูจน์อย่างไม่เป็นทางการ
ปัญหาจะลดลงเพื่อค้นหาการสั่งซื้อที่มีประสิทธิภาพสูงสุดเมื่อพิจารณาถึงกำลังสองของผลิตภัณฑ์
ตัวอย่างเช่นเมื่อมองเช่นเราจะต้องดีที่สุดแก้( B C ) 2นับตั้งแต่นี้เพื่อขยายB C B C ไม่มีการเพิ่มข้อมูลการสั่งซื้อที่เป็นประโยชน์โดยต่อA B Cอีกครั้ง สัญชาตญาณที่นี่คือเนื่องจากปัญหาของการเรียงลำดับที่ดีที่สุดสามารถแก้ไขจากล่างขึ้นบนได้ลำดับที่สูงขึ้นประกอบด้วยองค์ประกอบมากขึ้นโดยใช้เมทริกซ์เดียวกันจึงไม่เกี่ยวข้อง(ABC)50(ABC)2ABCABCABC
การค้นหาลำดับที่ดีที่สุดของช่วยลดปัญหาการคูณเมทริกซ์เชน หลังจากค้นหาคำสั่งที่ดีที่สุดให้ใช้การยกกำลังกับ triplet (โดยทั่วไปแล้วจะเป็น n-tuple) ในการสั่งซื้อABCABC
ในฐานะที่เป็นเช่นถ้าสั่งซื้อที่เหมาะสมที่สุดสำหรับตารางคือ( B ( C ) ) B C , วิธีการแก้ปัญหาที่เกิดขึ้นเป็นครั้งแรก( B ( C ) ) 49 B CA(B(CA))BCA(B(CA))49BC
สรุป:
1) ขั้นตอนแรกในการแก้คือการแก้ปัญหา( 1 2 ⋯ n ) 2
2) การแก้ปัญหา( A 1 A 2 ⋯ A n ) 2เป็นวิธีที่ดีที่สุดที่จะเป็นตัวอย่างของปัญหาการคูณเมทริกซ์เชน
3) การใช้ n-tuple การสั่งซื้อGจากสารละลายใน (2) จะให้ทางออกแก่ (1) เป็นรสชาติของA 1 ⋅ A(A1A2⋯An)m(A1A2⋯An)2
(A1A2⋯An)2
G (โปรดสังเกตว่าการจัดกลุ่มอื่น ๆ จากการแก้ (2) ควรใช้เช่นกัน)A1⋅A2⋅Gm−1⋅An
หลักฐานที่ไม่เป็นทางการ
เมื่อพิจารณากรณีที่ง่ายที่สุดโดยใช้เมทริกซ์สองตัวเราทราบว่าAและBมีมิติX × YและY × Xตามลำดับ ผลิตภัณฑ์ใด ๆ ที่ใช้AและBมีหนึ่งในมิติต่อไปนี้:(AB)nABX×YY×XAB
Y × X Y × Y X × XX×Y
Y×X
Y×Y
X×X
เรามีทั้งหรือY ≤ XX<YY≤X
สมมติฐาน 1a): A BมีมิติX × Xและการสั่งซื้อนี้รับประกันว่าจะดีที่สุดจากวิธีการจากล่างขึ้นบน การกำหนดค่าอื่น ๆ ของAและBนั้นดีไม่แพ้กัน ดังนั้นปัญหาจะแก้ไขได้อย่างดีที่สุดเท่าที่( B ) nX<Y
ABX×XAB(AB)n
อัสสัมชั 1b): BมีขนาดY × Y นี่คือการสั่งซื้อที่เหมาะสมสำหรับผลิตภัณฑ์ทั้งหมดที่เกี่ยวข้องกับและB ดังนั้นวิธีการแก้ปัญหาที่พบได้อย่างดีที่สุดเท่าที่( B ) n - 1 BY≤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)