如何利用Z3 SMT求解器解决ILP问题

时间:2019-04-15 20:06:15

标签: z3 linear-programming smt

问题

我正在尝试使用z3来证明Petri网络上的可达性断言。

所以我声明了N个状态变量v0,.. v_n-1,它们是正整数,对于Petri网的每个位置来说都是一个。

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

  • 计算(使用外部引擎)任何“简单的”正不变量,作为对变量的线性约束,形式为alpha_0 * v_0 + ... =仅具有正或零alpha_i的常数,然后检查在这些条件下可达到的任何状态约束满足P,如果结论不满意,否则
  • 计算(在z3外部)广义不变量,其中alpha_i也可以为负,并且check_sat可以得出结论,如果不满足,则为其他情况
  • 在系统的每次转换中添加一个正变量t_i,并声明Petri网状态方程,即任何可达状态都具有Parikh触发计数向量(t_i的值),使得M0为初始状态+此Parikh向量的乘积通过入射矩阵给出到达状态。因此,这一章引入了许多新变量,并涉及变量的乘法运算,但仍然存在线性整数编程问题。

我将步骤分开是因为因为我要使用UNSAT,所以任何返回UNSAT的check_sat都会停止该过程,特别是最后一步的成本非常高。

我在大型模型上遇到问题,我得到的答案时间过长,甚至是可怕的“未知”答案,特别是在添加状态方程式时(步骤3)。

背景

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

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

因此,我尝试设置Reals,但指定每个变量为= 0或> = 1,以删除分数小于1的解。这确实消除了虚假解,但会“杀死” z3(超时或未知),在很多情况下,问题显然要困难得多(例如,比仅整数困难)。

示例

尽管我可以很容易地提出一些例子,但我没有一个小例子可以展示。问题是,如果我选择QF_LIA,它在某些变量上会变得非常慢。作为度量,过渡要比地方多得多,因此添加状态方程实际上会增加变量计数。

This code正在生成我要询问的示例。

如果您需要更多的数学背景,这张general presentation幻灯片5和6表示了我正在精确编码的问题,幻灯片7和8阐述了“ unsat”给我们的结果。

我从Model Checking Contest产生问题,多达数千个位置(主变量),在某些情况下超过十万个转换。这些是极值,中间范围是几千个位置,也许我真的要处理2万个过渡。

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

如果我得到一个非整数的解决方案,我可以尝试使用Reals然后迭代到Integers中,我没有尝试过,尽管它涉及大量的终止和重新启动求解器的工作,但这对我的基准测试集可能是一个不错的方法。

我在寻找什么

我正在寻找Z3的一些设置,这些设置可以更好地帮助它解决我所遇到的问题,并提供一些见解。 对于可以解决这些问题的方法,我有一个先验的想法,传统上,这些问题已送给ILP解决者。因此,我希望触发某种单纯形,但是在某些情况下,也许有条件阻止z3使用“好的”解决方案策略。

我已经成为SMT / Z3的高级用户,但我从未使用过:options的精细设置来指导求解器。

您是否尝试过将基本上是ILP的问题反馈给SMT,并找到了有助于其部署正确解决方案的选项设置或特定编码?谢谢。

0 个答案:

没有答案