动态规划解决矩阵连乘问题,随机产生矩阵序列,输出形如((A1(A2A3))(A4A5))的结果。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#encoding: utf-8
= begin
author: xu jin, 4100213
date: Oct 28 , 2012
MatrixChain
to find an optimum order by using MatrixChain algorithm
example 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: 15125
The random array is:[ 5 , 8 , 8 , 2 , 5 , 9 ]
The optimum order is:(( A1 ( A2A3 ))( A4A5 ))
The total number of multiplications is: 388
= end
INFINTIY = 1 / 0 . 0
p = [ 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
end
end
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 ")"
end
end
def 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 ])
end
puts "The given array is:" + p.to_s
process(p, m, s)
#produce a random array
p = Array . new
x = rand( 10 )
( 0 ..x). each {|index| p[index] = rand( 10 ) + 1 }
puts "The random array is:" + p.to_s
m, s = Array . new (p.size){ Array . new (p.size)}, Array . new (p.size){ Array . new (p.size)}
process(p, m, s)
|