我想使用C API
使用z3求解器将二维数组定义如下a [3] [3] = {{0,0,0},{0,0,0},{0,0,0}}
如何使用Z3求解器C API定义它,其中我需要添加约束,例如每行的总和等于1,每个coloums的总和应该<= 100。
答案 0 :(得分:3)
Z3支持数组理论,但通常用于编码无界数组或非常大的数组。此问题已在其他帖子中讨论过(请参阅:Create an array with fixed size and initialize it)。如果我们搜索[z3] array
,我们会发现许多其他帖子。
对于预定义大小的数组,创建“Z3表达式数组”更容易(也更有效)。 Z3 tutorial中的数独示例显示了如何执行此操作。
以下是您帖子中描述的问题的Python代码(也可在线提供here)。
# 3x3 matrix of integer variables
A = [ [ Int("a_%s_%s" % (i+1, j+1)) for j in range(3) ]
for i in range(3) ]
print A
# Rows constraints
rows_c = [ Sum(r) == 1 for r in A ]
print rows_c
# Columns constraints
A_transpose = [ [ A[i][j] for i in range(3) ] for j in range(3) ]
cols_c = [ Sum(c) <= 10 for c in A_transpose ]
print cols_c
s = Solver()
s.add(rows_c)
s.add(cols_c)
# solve constraints
print s.check()
# print solution
m = s.model()
print m
# printing the solution in a nicer way
r = [ [ m.evaluate(A[i][j]) for j in range(3) ] for i in range(3) ]
print_matrix(r)