Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
如何利用Z3 SMT解决ILP问题_Z3_Linear Programming_Smt - Fatal编程技术网

如何利用Z3 SMT解决ILP问题

如何利用Z3 SMT解决ILP问题,z3,linear-programming,smt,Z3,Linear Programming,Smt,问题 我试图用z3来反驳Petri网上的可达性断言 所以我声明N个状态变量v0,…v_N-1,它们是正整数,Petri网的每个位置一个 我给出的关于状态的原子命题p的主要策略如下: (使用外部引擎)计算任何“简单”的正不变量作为变量的线性约束,形式为alpha_0*v_0+…=只有正或零alpha_i的常数,然后检查在这些约束下可到达的任何状态是否满足P,如果不满足,则结束,否则 计算(z3外部)广义不变量,其中αi也可以是负数,并检查_sat,如果未统计,则得出结论,否则 在系统的每个转换中

问题

我试图用z3来反驳Petri网上的可达性断言

所以我声明N个状态变量v0,…v_N-1,它们是正整数,Petri网的每个位置一个

我给出的关于状态的原子命题p的主要策略如下:

  • (使用外部引擎)计算任何“简单”的正不变量作为变量的线性约束,形式为alpha_0*v_0+…=只有正或零alpha_i的常数,然后检查在这些约束下可到达的任何状态是否满足P,如果不满足,则结束,否则
  • 计算(z3外部)广义不变量,其中αi也可以是负数,并检查_sat,如果未统计,则得出结论,否则
  • 在系统的每个转换中添加一个正变量t_i,并断言Petri网状态方程,即任何可达状态都有一个Parikh触发计数向量(t_i的值),使得M0初始状态+该Parikh向量与关联矩阵的乘积给出到达状态。所以这个问题引入了很多新的变量,涉及到一些变量的乘法,但仍然是一个线性整数规划问题
我将这些步骤分开,因为我想要UNSAT,任何返回UNSAT的check_sat都会停止这个过程,特别是最后一步的成本非常高

我对更大的模型有问题,在那里我得到了令人望而却步的长回答时间,甚至是可怕的“未知”回答,特别是在添加状态方程时(步骤3)

背景

因此,除了将问题分解成增量更难的部分之外,我还尝试将逻辑设置为QF_LRA而不是QF_LIA,并将变量声明为实数而不是整数

这种过度近似在计算上是友好的(z3在这些方面很快!),但不幸的是,对于许多模型,解不是整数,也不存在整数解

所以我尝试设置Reals,但指定每个变量为=0或>=1,以删除触发分数小于1的解决方案。这确实消除了虚假的解决方案,但它“杀死”了z3(超时或未知)。在许多情况下,问题显然更难解决(例如,比仅使用整数更难)

例子

我没有一个小例子可以展示,尽管我可以很容易地制作一些。问题是,如果我选择QF_LIA,它在一些变量上会变得非常慢。作为一种度量,转换比位置多得多,因此添加状态方程确实会增加变量计数

正在生成我要询问的示例

这张幻灯片5和6精确地表达了我正在编码的问题,如果你想要更多的数学背景,那么幻灯片7和8将展示“unsat”给我们的结果

我正在从中生成问题,有多达数千个位置(主要变量),在某些情况下超过十万个转换。这些都是极值,中间范围是几千个位置,可能是我真正想处理的20000个过渡

Reals+大于1约束即使对于一些较小的问题也不是一个好的解决方案。整数从一开始就很慢

如果我得到一个非整数解,我可以尝试Reals,然后迭代成整数,但我没有尝试过,尽管这涉及到终止和重新启动解算器,但在我的基准集上这可能是一个不错的方法

我在找什么

我正在寻找一些设置Z3,可以更好地帮助它处理的问题,我喂养它,给它一些见解。 我对如何解决这些问题有一些先验的想法,传统上,这些问题都是由ILP解决者来解决的。所以我希望触发某种单纯形,但在某些情况下,可能有条件阻止z3使用“好”的解决方案策略

我已经成为一个相当不错的SMT/Z3用户,但我从未使用过:选项的精细设置来指导解算器


你们中有没有人尝试过将基本上是ILP问题的内容反馈给SMT,并找到了选项设置或特定编码来帮助它部署正确的解决方案?谢谢。

我正在对线性约束(“状态方程”)进行编码,我不确定您在想什么SAT编码,但例如,在某些情况下,这些东西可以在无界Petri网上回答,因此,没有直接的SAT编码看起来是等价的。好吧,我已经从一门关于Petri网的课程中链接到了这个问题的数学公式,如果我在编码线性约束(“状态方程”),我不确定你在想什么SAT编码,但举个例子,这个东西在某些情况下可以在无界Petri网上回答,所以没有直接的SAT编码是等价的。好吧,我已经从一门关于Petri网的课程中找到了这个问题的数学公式,如果这有帮助的话