我正在使用Z3(使用python api)进行实验,其中我正在为类分配建立调度模型,在该模型中,我必须经常使用模数(因为它是周期性的)。 Modulo似乎已经大大降低了z3的速度,但是如果我尝试在顶部进行一些优化(将成本函数最小化为总和),那么相当小的问题将花费很多时间。
没有优化,它就可以正常工作(较小的问题只需几秒钟)。话虽如此,我现在有两个问题:
1)使用模数功能有什么窍门吗?我已经将模数值分配给函数了。还是有其他方法来表达周期性/响铃行为?
2)我对寻找最佳解决方案不感兴趣。一个好的,就足够了。有没有办法为成本函数设定一些界限。喜欢,如果知道上下限呢?其他技巧,我可以使用领域知识快速找到解决方案。 此外,我认为,如果我将使用超时选项solver.set(“ timeout” 10000),则求解器将使用最佳解决方案超时。事实并非如此。只是超时。
答案 0 :(得分:0)
无法对mod
函数进行注释而看不到任何代码。但是根据经验,划分是困难的。您使用的是Int
值还是位向量?如果您使用的是无界整数,则可能要尝试使用位向量,这可能会受益于更好的内部启发式方法。或尝试使用Real
值,然后进行适当的减小。
关于如何获得“迄今为止最好的”最佳值,请参见以下答案:Finding suboptimal solution (best solution so far) with Z3 command line tool and timeout
答案 1 :(得分:0)
可以使用未解释的函数mymod
和mydiv
来代替使用内置的模和除法,为此,它们仅提供问题所需的必要的除法和模数公理。如果我没记错的话,Microsoft的Ironclad和/或Ironfleet团队在遇到与模/除法相关的性能问题时(使用管道Dafny-> Boogie-> Z3)做到了这一点。