我有以下矩阵乘法问题的解决方案。
matMul([X], os(0, X)).
matMul(L, os(A, m(a, d(D1, D2)))) :-
append([L1|L1s], [L2|L2s], L),
matMul([L1|L1s], os(A1, m(_, d(D1, C1)))),
matMul([L2|L2s], os(A2, m(_, d(_, D2)))),
A is A1 + A2 + (D1 * C1 * D2).
这个程序为我提供了所有可能的解决方案。
?- matMul([m(a,d(5,4)), m(a,d(4,6)), m(a,d(6,2)), m(a,d(2,7))], A).
A = os(392, m(a, d(5, 7))) ;
A = os(244, m(a, d(5, 7))) ;
A = os(414, m(a, d(5, 7))) ;
**A = os(158, m(a, d(5, 7))) ;**
A = os(250, m(a, d(5, 7))) ;
false.
我们可以看到,其中一个是最佳的。 我想要做的就是修改这个,让一个解决方案成为最佳解决方案。
如果有人可以提供任何指针/建议来实现它,那将非常有用。
感谢。
答案 0 :(得分:1)
快速执行此操作的方法是使用setof/3
,因为它按升序排序:
optimum_solution(Matrix, A) :-
setof(os(X,M), matMul(Matrix, os(X,M)), S),
S = [A|_]. % Select the first element, which has lowest X
setof/3
在进行排序时会使用standard ordering of terms。
然后将其查询为:
| ?- optimum_solution([m(a,d(5,4)), m(a,d(4,6)), m(a,d(6,2)), m(a,d(2,7))], A).
A = os(158,m(a,d(5,7)))
yes