【问题标题】:Asserting constraint on matrix multiplication断言对矩阵乘法的约束
【发布时间】:2015-03-15 10:20:05
【问题描述】:

我正在尝试通过使用 z3py API 断言对矩阵乘法的约束来评估结果矩阵。以下方法适用于矩阵加法。以下是代码,它有 3 个矩阵:x、y 和 sol。 sol 是 x 和 y 的加法(sol==x+y),我有兴趣将结果矩阵(sol)的值限制为零,并检查“x”和“y”中的哪些未知值产生结果矩阵为零。以下是加法的列表理解方法。

from z3 import*

x = [ [Real("x_%s_%s" %(i+1, j+1))  for j in range(2) ] for i in range(2)]
y = [ [Real("y_%s_%s" %(i+1, j+1))  for j in range(2) ] for i in range(2)]
sol = [ [Real("sol_%s_%s" %(i+1, j+1))  for j in range(2) ] for i in range(2)]
addition = [sol[i][j]==x[i][j]+y[i][j]   for i in range(2) for j in range(2) ]


s = Solver()

s.add(addition)
s.add(x[0][0]>=0)
s.add(x[0][1]>=0)
s.add(x[1][0]>=0)
s.add(x[1][1]>=1)

s.add(And(y[0][0]>=0, y[0][0]<=2))
s.add(And(y[0][1]>=0, y[0][0]<=2))
s.add(And(y[1][0]>=0, y[0][0]<=2))
s.add(And(y[1][1]>=0, y[0][0]<=2))

s.add(sol[0][0]==0)
s.add(sol[0][1]==0)
s.add(sol[1][0]==0)
s.add(sol[1][1]==0)


if s.check()==sat:
    m =s.model()
    print  SAT,'\n', m
    result=[[ m.evaluate(sol[i][j]) for i in range (2)] for j in range (2)]
    print result
if (s.check()==unsat):
    print "UNSAT, no model exists"

现在,列表理解中是否有任何方法可以断言矩阵乘法? (sol==x*y)...?

【问题讨论】:

    标签: z3 smt z3py


    【解决方案1】:

    不,Z3 没有内置的矩阵乘法函数。它仍然可以以直接的方式完成,但限制可能会变得非常大。

    【讨论】:

    • 谢谢,我能够使用列表推导找出乘法的解决方案,但即使我采用 6*6 矩阵,“Solver()”也需要很长时间来添加简单的约束(比如a>=0)。可能是什么原因?
    • 实际上是添加需要很多时间,还是在断言所有内容后您最终会遇到难题?如果是加法,问题很可能出在 Python 端;另外:对你来说“相当长的时间”是什么?
    • 平均 30 分钟,我想问题出在 python 方面。因为列表理解需要 95% 的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2021-02-15
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多