- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
多年来我一直跟踪解决技术 - and I maintain a blog post关于将它们应用到特定的谜题 - “穿越梯子”。
言归正传,我无意中发现了z3,并尝试将其用于特定问题。我使用了 Python 绑定(bind),并编写了以下内容:
$ cat laddersZ3.py
#!/usr/bin/env python
from z3 import *
a = Int('a')
b = Int('b')
c = Int('c')
d = Int('d')
e = Int('e')
f = Int('f')
solve(
a>0, a<200,
b>0, b<200,
c>0, c<200,
d>0, d<200,
e>0, e<200,
f>0, f<200,
(e+f)**2 + d**2 == 119**2,
(e+f)**2 + c**2 == 70**2,
e**2 + 30**2 == a**2,
f**2 + 30**2 == b**2,
a*d == 119*30,
b*c == 70*30,
a*f - 119*e + a*e == 0,
b*e - 70*f + b*f == 0,
d*e == c*f)
不幸的是,z3 报告...
$ python laddersZ3.py
failed to solve
该问题至少有以下整数解:a=34、b=50、c=42、d=105、e=16、f=40。
我做错了什么,还是这种方程组/范围约束超出了 z3 可以解决的范围?
预先感谢您的帮助。
更新,5 年后:Z3 现在开箱即用地解决了这个问题。
最佳答案
如果将整数编码为实数,则可以使用 Z3 求解此问题,这将强制 Z3 使用非线性实数算术求解器。有关非线性整数与实数算术求解器的更多详细信息,请参阅此:How does Z3 handle non-linear integer arithmetic?
这是使用解决方案编码为实数的示例(z3py 链接: http://rise4fun.com/Z3Py/1lxH ):
a,b,c,d,e,f = Reals('a b c d e f')
solve(
a>0, a<200,
b>0, b<200,
c>0, c<200,
d>0, d<200,
e>0, e<200,
f>0, f<200,
(e+f)**2 + d**2 == 119**2,
(e+f)**2 + c**2 == 70**2,
e**2 + 30**2 == a**2,
f**2 + 30**2 == b**2,
a*d == 119*30,
b*c == 70*30,
a*f - 119*e + a*e == 0,
b*e - 70*f + b*f == 0,
d*e == c*f) # yields [a = 34, b = 50, c = 42, d = 105, e = 16, f = 40]
虽然结果是整数,正如您所指出的,并且正如 Z3 所发现的那样,Z3 显然需要使用真正的算术求解器来处理它。
或者,您可以保留声明为整数的变量,并根据引用帖子中的建议执行以下操作:
t = Then('purify-arith','nlsat')
s = t.solver()
solve_using(s, P)
其中 P
是约束的合取(z3py 链接: http://rise4fun.com/Z3Py/7nqN )。
关于z3 在这个方程组中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17726916/
我目前正在努力使用 python 解决线性方程组。我曾尝试使用 numpy.linalg.solve,但似乎这只适用于方形数组,而我的则不然。是否有另一个我可以用来解决我不知道的系统的函数,或者我应该
我的代码第一次迭代运行良好,但之后输出以下错误: ValueError: matrix must be 2-dimensional 据我所知(这在Python中并不多),我的代码是正确的。但我不知道为
是否可以使用 sympy 求解方程组(线性或非线性),其中输出为符号? 示例: 1. f_m = a0 + a1*(-dx) + a2*(-dx)^2 2. f_c = a0 3. f_p =
我想使用两个或更多输入来创建更精确的变量估计。我已经仅使用一个输入和一个 FOPDT 方程对其进行了估算,但是当我尝试添加一个输入和相应的 k、tau 和 theta 以及另一个方程时,我收到“未找到
我有一个像这样的字符串(变量和常量的数量并不重要): > my_string A b A x y z [1,] 1 0 1 [2,] 1 3 2 [3,] 3 1 1 > b [1]
我是一名优秀的程序员,十分优秀!