Matrix concatenation algorithm implemented by Ruby and ruby matrix concatenation
Dynamic Planning solves the problem of matrix concatenation, generates matrix sequences randomly, and outputs results in the form of (A1 (A2A3) (A4A5.
Code:
#encoding: utf-8=beginauthor: xu jin, 4100213date: Oct 28, 2012MatrixChainto find an optimum order by using MatrixChain algorithmexample output:The given array is:[30, 35, 15, 5, 10, 20, 25]The optimum order is:((A1(A2A3))((A4A5)A6))The total number of multiplications is: 15125The random array is:[5, 8, 8, 2, 5, 9]The optimum order is:((A1(A2A3))(A4A5))The total number of multiplications is: 388 =endINFINTIY = 1 / 0.0p = [30, 35, 15, 5, 10, 20, 25]m, s = Array.new(p.size){Array.new(p.size)}, Array.new(p.size){Array.new(p.size)}def matrix_chain_order(p, m, s) n = p.size - 1 (1..n).each{|i| m[i][i] = 0} for r in (2..n) do for i in (1..n - r + 1) do j = r + i - 1 m[i][j] = INFINTIY for k in (i...j) do q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j] m[i][j], s[i][j] = q, k if(q < m[i][j]) end end endend def print_optimal_parens(s, i, j) if(i == j) then print "A" + i.to_s else print "(" print_optimal_parens(s, i, s[i][j]) print_optimal_parens(s, s[i][j] + 1, j) print ")" endenddef process(p, m, s) matrix_chain_order(p, m, s) print "The optimum order is:" print_optimal_parens(s, 1, p.size - 1) printf("\nThe total number of multiplications is: %d\n\n", m[1][p.size - 1])endputs "The given array is:" + p.to_sprocess(p, m, s)#produce a random arrayp = Array.newx = rand(10)(0..x).each{|index| p[index] = rand(10) + 1}puts "The random array is:" + p.to_sm, s = Array.new(p.size){Array.new(p.size)}, Array.new(p.size){Array.new(p.size)}process(p, m, s)