import math
|
|
|
|
"""
|
|
Jeffery Russell
|
|
11-12-18
|
|
"""
|
|
|
|
|
|
def generateMinOrdering(C, i, j):
|
|
if i == j:
|
|
return str(i)
|
|
return "(" + generateMinOrdering(C, i, C[i -1][j -1]) + generateMinOrdering(C, C[i -1][ j -1] +1, j) + ")"
|
|
|
|
|
|
|
|
def minMul(S):
|
|
"""
|
|
Simple function to print the matrixes used in
|
|
the minimum matrix chain multiplication problem
|
|
using dynamic programming.
|
|
"""
|
|
n = len(S)
|
|
m = [[math.inf for i in range(n)] for j in range(n)]
|
|
c = [[0 for i in range(n)] for j in range(n)]
|
|
|
|
for i in range(0, n):
|
|
m[i][i] = 0
|
|
|
|
for l in range(1, n + 1):
|
|
for i in range(0, n-l + 1):
|
|
j = l + i -1
|
|
for k in range(i, j):
|
|
temp = m[i][k] + m[k + 1][j] + S[i][0] * S[k][1] * S[j][1]
|
|
print(temp)
|
|
if temp < m[i][j]:
|
|
m[i][j] = temp
|
|
c[i][j] = k + 1
|
|
|
|
|
|
for i in range(0, n):
|
|
for y in range(0, n):
|
|
print(str(m[i][y]) + " ", end =" ")
|
|
print()
|
|
|
|
|
|
print()
|
|
print()
|
|
for i in range(0, n):
|
|
for y in range(0, n):
|
|
print(str(c[i][y]) + " ", end =" ")
|
|
print()
|
|
|
|
print(generateMinOrdering(c, 1, len(S)))
|
|
|
|
|
|
|
|
"""
|
|
Makes sure that other programs don't execute the main
|
|
"""
|
|
if __name__ == '__main__':
|
|
try:
|
|
#minMul([(10,100),(100, 5),(5, 50)])
|
|
minMul([(5,10),(10,3),(3,12), (12,5), (5,50), (50,6)])
|
|
#minMul([(30,35),(35,15),(15,5), (5,10), (10,20), (20,25)])
|
|
except KeyboardInterrupt:
|
|
exit()
|