- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是使用 C++ API 的 Z3-Solver 的新手,想求解一组不等式并找到结果。
我读过 the answer which written in Python并尝试用 C++ 编写它,但它会重复打印一个模型。
5 <= x + y + z <= 16
AND -4 <= x - y <= 6
AND 1 <= y - z <= 3
AND -1 <= x - z <= 7
AND x >= 0 AND y >= 0 AND z >= 0
不等式被添加到求解器中,并有很多评估。
c 是上下文,s 是求解器。
vector<const char*> variables {"x", "y", "z"};
// ...
// till here, s was added into several constraints
while(s.check() == sat){
model m = s.get_model();
cout << m << "\n######\n";
expr tmp = c.bool_val(false);
for(int i = 0; i < variables.size(); ++ i){
tmp = tmp || (m[c.int_const(variables[i])] != c.int_const(variables[i]));
}
s.add(tmp);
}
结果:
(define-fun z () Int
0)
(define-fun y () Int
2)
(define-fun x () Int
3)
######
(define-fun z () Int
0)
(define-fun y () Int
2)
(define-fun x () Int
3)
######
(define-fun z () Int
0)
...
它只打印一个模型。我不确定哪里错了。
如何获取所有模型或获取一个或多个凸集(如{l1 <= x <= u1 and l2 <= x - y <= u2 and ...}),而不是遍历所有求值.
顺便说一句,有很多关于 python 的教程(例如 this ),在那里我可以在 c++ 中学习 z3 作为 example和 api doc.上手并不容易。
最佳答案
您的“模型反驳”循环不太正确。由于您没有发布整个代码,因此很难判断是否还有其他问题,但这就是我的处理方式:
#include<vector>
#include"z3++.h"
using namespace std;
using namespace z3;
int main(void) {
context c;
expr_vector variables(c);
variables.push_back(c.int_const("x"));
variables.push_back(c.int_const("y"));
variables.push_back(c.int_const("z"));
expr x = variables[0];
expr y = variables[1];
expr z = variables[2];
solver s(c);
s.add(5 <= x+y+z);
s.add(x+y+z <= 16);
s.add(-4 <= x-y);
s.add(x-y <= 6);
s.add(-1 <= x-z);
s.add(x-z <= 7);
s.add(x >= 0);
s.add(y >= 0);
s.add(z >= 0);
while (s.check() == sat) {
model m = s.get_model();
cout << m << endl;
cout << "#######" << endl;
expr tmp = c.bool_val(false);
for(int i = 0; i < variables.size(); ++i) {
tmp = tmp || (variables[i] != m.eval(variables[i]));
}
s.add(tmp);
}
return 0;
}
此代码运行并枚举所有“具体”模型。从你的问题来看,我猜你也想知道你是否可以获得“符号”模型:SMT 求解器不可能做到这一点。 SMT 求解器仅生成具体(即所有基本项)模型,因此如果您需要从它们进行概括,则必须在 z3 边界之外进行。
关于c++ - 如何获得所有模型或所有凸评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090703/
我正在尝试对具有 950 个样本和大约 5000 个特征的数据使用套索优化。套索函数是 $(1/(2 * numberofsamples)) * ||y - Xw||^2_2 + alpha * ||
我需要列出位于给定坐标精度(比如 1)的特定多边形内部的所有坐标。这意味着,多边形边界的所有坐标都将是整数。多边形可以是凸面或凹面。 我有边界的所有坐标,coords[n][2] 这是我解决问题的方法
我的 Ubuntu 服务器上运行着一个 squid 3.3。在我的 squid ssl-bump 配置中,由于 squid3 -k 重新配置,我收到以下错误。 错误: 致命:错误的 squid.con
抱歉我的英语不好。 我想找出大量线性方程的下包络线。这映射到在其双平面中找到上(凸)壳的问题。 据我调查,有几种方法可以找到上层船体,但它们仅适用于 2-3 维。 但是,我的数据是高维的,有可用的库来
这个有点难解释。我有一个整数列表。因此,例如,[1, 2, 4, 5, 8, 7, 6, 4, 1] - 当根据元素编号绘制时,它类似于凸图。我如何以某种方式从列表中提取此“形状”特征?它不必特别准确
我想创建类似图片的东西,#body 位于#leg1 和#leg2 之间,其中三个应该水平对齐到底部。知道如何实现这一目标吗?我调整了一些属性,例如 display:inline 或 float:lef
我是一名优秀的程序员,十分优秀!