Z3优化中的间隙公差控制

时间:2019-12-13 00:51:56

标签: optimization z3

我想使用z3优化类来获得次优的结果,同时仍然能够控制我离最优结果有多远。我正在使用C ++ API。

例如,CPLEX具有参数epgap和epagap分别用于相对和绝对公差。它使用当前的上下限(取决于是最小化还是最大化)来评估当前解决方案与最佳解之间的距离(最多)。

当近似解决方案已经足够好时,这将缩短运行时间。

是否可以使用optimize类,还是我需要使用求解器实例并自己控制范围的事情?

1 个答案:

答案 0 :(得分:1)

对此我不确定,但我怀疑z3是否具有这样的参数。

可以肯定,在命令行界面中似乎没有类似的东西暴露出来:

~$ z3 -p
...
[module] opt, description: optimization parameters
    dump_benchmarks (bool) (default: false)
    dump_models (bool) (default: false)
    elim_01 (bool) (default: true)
    enable_sat (bool) (default: true)
    enable_sls (bool) (default: false)
    maxlex.enable (bool) (default: true)
    maxres.add_upper_bound_block (bool) (default: false)
    maxres.hill_climb (bool) (default: true)
    maxres.max_core_size (unsigned int) (default: 3)
    maxres.max_correction_set_size (unsigned int) (default: 3)
    maxres.max_num_cores (unsigned int) (default: 4294967295)
    maxres.maximize_assignment (bool) (default: false)
    maxres.pivot_on_correction_set (bool) (default: true)
    maxres.wmax (bool) (default: false)
    maxsat_engine (symbol) (default: maxres)
    optsmt_engine (symbol) (default: basic)
    pb.compile_equality (bool) (default: false)
    pp.neat (bool) (default: true)
    priority (symbol) (default: lex)
    rlimit (unsigned int) (default: 0)
    solution_prefix (symbol) (default: )
    timeout (unsigned int) (default: 4294967295)
 ...

替代#01:

一个选择是自己在z3之上实现此目标。

我建议使用 binary search 模式(请参阅Optimization in SMT with LA(Q) Cost Functions),否则OMT求解器将仅优化优化搜索间隔的一端,这可能无法达到预期目的您的搜索终止条件

请注意,为了使此方法有效,重要的是在搜索过程中遇到的每个中间模型的布尔分配上调用内部T-optimizer(我不确定此功能是否通过z3在API级别公开)。

您可能还想看看基于Puli - A Problem-Specific OMT Solver中使用的线性回归的方法。如果可以的话,它可以加快优化搜索的速度,并改善距最优解的相对距离的估计。


替代#02:

OptiMathSAT可能在API和命令行级别都公开了您正在寻找的功能:

~$ optimathsat -help
Optimization search options:
 -opt.abort_interval=FLOAT
          If greater than zero, an objective is no longer actively optimized as 
          soon as the current search interval size is smaller than the given 
          value. Applies to all objective functions. (default: 0) 
 -opt.abort_tolerance=FLOAT
          If greater than zero, an objective is no longer actively optimized as 
          soon as the ratio among the current search interval size wrt. its 
          initial size is smaller than the given value. Applies to all 
          objective functions. (default: 0) 

终止间隔是基于当前优化搜索间隔的绝对大小而终止条件,而终止耐受性是基于当前优化搜索间隔的相对大小相对于初始搜索间隔的终止条件。 >

请注意,为了使用这些终止条件,用户应:

  • 为任何最小化目标至少提供一个初始下限:

    (minimize ... :lower ...)
    
  • (至少)为任何最大化目标提供初始上限:

    (maximize ... :upper ...)
    

此外,该工具必须配置为使用 Binary Adaptive 搜索:

 -opt.strategy=STR
          Sets the optimization search strategy: 
           - lin : linear search (default)
           - bin : binary search
           - ada : adaptive search
          A lower bound is required to minimize an objective with bin/ada 
          search strategy. Dual for maximization. 

如果这些终止标准都不能使您满意,则还可以在OptiMathSAT之上实现自己的算法。由于可以通过API和命令行同时设置以下选项,因此相对来说操作相对容易:

 -opt.no_optimization=BOOL
          If true, the optimization search stops at the first (not optimal) 
          satisfiable solution. (default: false) 

启用后,它使OptiMathSAT的行为与常规SMT求解器相同,不同之处在于,当它找到存在输入公式的模型的完整布尔分配时,可以确保该模型是最优的。目标函数和给定的布尔赋值(换句话说,它为您调用内部T-optimizer过程)


一些想法。

OMT求解器的工作方式不同于大多数CP求解器。他们使用无限精度算法,并且在SAT引擎的指导下进行了优化搜索。提高目标函数的值变得越来越困难,因为在解决冲突和回跳的过程中,OMT求解器被迫枚举越来越多的(可能是总数)布尔分配。

我认为,当前搜索间隔的大小并不总是很好地表明优化搜索取得进展的相对难度。有太多因素需要考虑,例如涉及目标函数,输入公式的编码等的冲突子句的修剪能力。据我所知,这也是为什么OMT社区中的大多数人只是使用固定的 timeout 而不是费心使用任何其他终止条件的原因之一。我发现它特别有用的唯一情况是在处理非线性优化(但是OptiMathSAT尚不公开)。