Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python z3找到满足多个冲突约束的最小组合_Python_Z3 - Fatal编程技术网

Python z3找到满足多个冲突约束的最小组合

Python z3找到满足多个冲突约束的最小组合,python,z3,Python,Z3,假设我有约束:x3和x>5,我如何让z3产生最小解,例如x=[1,6] 我想我可以使用Or来实现它,并为每个解阻塞已解的条件,但这并不保证它会生成最小集 我的另一个解决方案是单独解决每个条件,并收集尽可能多的结果,并有一个算法为每个条件选择重叠的结果 有什么想法吗?我认为x3和x5没有解决方案。您可以找到第一个解决方案,然后将其添加到条件中。 比如说 from z3 import * solver = Solver() x = Int('x') constraints = [ x &l

假设我有约束:x<2,x>3和x>5,我如何让z3产生最小解,例如x=[1,6]

我想我可以使用Or来实现它,并为每个解阻塞已解的条件,但这并不保证它会生成最小集

我的另一个解决方案是单独解决每个条件,并收集尽可能多的结果,并有一个算法为每个条件选择重叠的结果

有什么想法吗?

我认为x3和x5没有解决方案。您可以找到第一个解决方案,然后将其添加到条件中。 比如说

from z3 import *
solver = Solver()
x = Int('x')

constraints = [
    x < 5
]

for i in constraints:
    solver.add(i)
print(solver.check())
while solver.check() == sat:
    print(solver.model()[x])
    solver.add(x < solver.model()[x])

Output:
sat
4
0
-1
-2
-3
-4
-5
-6
-7
....
-to minus infinity
第二种解决方案


如果没有一次针对所有组合的解决方案,则转到下面的级别。如果有两种情况的解决方案,则查看是否有第三种情况的解决方案。您可以为此制定一个算法。

这种跟踪约束经常出现。虽然可能有多种解决方案,但我认为最好的解决方案是显式添加跟踪变量,并进行迭代,直到满足所有约束。为此,应使用优化解算器,使每次调用中释放的约束数量最大化。这样可以确保解决方案的数量保持最少

基于这个策略,我将为每个约束创建一个跟踪变量pN,并将它们与蕴涵配对。然后,我会最大化应该满足的pN数量。以下是一种可能的编码:

从z3进口* x=Int'x' p1,p2,p3=布尔值'p1 p2 p3' 约束=[p1,x<2,p2,x>3,p3,x>5] 解决方案=[] 虽然限制: o=优化 s=0 对于跟踪器,约束中的条件: o、 加法器,条件 s=s+Iftracker,1,0 o、 最大化 剩余=[] r=o.检查 如果r==sat: m=o型 解决方案附录M[x] 打印候选项:%s%m[x] 对于跟踪器,约束中的条件: ifm[跟踪器]: 打印约束:%s已满足,正在跳过。%条件.sexpr 其他: 打印约束:%s尚未满足,正在添加。%条件.sexpr 剩余的,剩余的 其他: 返回的打印调用:%s%r 出口-1 约束=剩余 打印解决方案:%s%s解决方案 运行时,此选项将打印:

Candidate: 6
  Constraint: (< x 2) is not yet satisfied, adding.
  Constraint: (> x 3) satisfied, skipping.
  Constraint: (> x 5) satisfied, skipping.
Candidate: 0
  Constraint: (< x 2) satisfied, skipping.
Solution: [6, 0]
因此,这计算出解[6,0]。您最初想要[1,6],但我相信这也是一个有效的解决方案


如果还希望得到更严格的边界,还可以通过最小化/最大化调用向优化解算器添加条件。但是,这可能会遇到问题:例如,对于原始约束集,没有唯一满足它们的最小/最大值x,因此您可能会遇到优化器失败的情况。如果你知道你所有的变量都是有界的,那么你可以通过这个途径。否则,您可以尝试调用优化器,如果它没有返回一个固定的结果,则使用sat调用的结果,正如我前面所做的那样。当然,所有这些都取决于您的特定约束条件,但在其他方面与z3无关。

对不起,我认为我没有理解您的意思。我需要的是能够满足冲突的unsat约束的最小解集。所以在这个例子中,我需要x=[1,6]能够满足3个约束,而不是x=[1,5,6]。
Candidate: 6
  Constraint: (< x 2) is not yet satisfied, adding.
  Constraint: (> x 3) satisfied, skipping.
  Constraint: (> x 5) satisfied, skipping.
Candidate: 0
  Constraint: (< x 2) satisfied, skipping.
Solution: [6, 0]