Optimization Z3优化中的间隙公差控制

Optimization Z3优化中的间隙公差控制,optimization,z3,optimathsat,Optimization,Z3,Optimathsat,我想使用z3优化类来获得次优结果,同时仍然能够控制距离最佳结果有多远。我使用的是C++ API。 例如,CPLEX的参数epgap和epagap分别用于相对公差和绝对公差。它使用当前的下限或上限(取决于它是最小化还是最大化)来评估当前解决方案与最佳解决方案之间的距离(最多) 当近似解已经足够好时,这会缩短运行时间 这可能是使用optimize类实现的,还是我需要使用解算器实例实现并自己控制边界?对此我不是绝对肯定,但我怀疑z3是否有这样的参数 可以肯定的是,在命令行界面中没有显示类似的内容: ~

我想使用z3优化类来获得次优结果,同时仍然能够控制距离最佳结果有多远。我使用的是C++ API。 例如,CPLEX的参数epgap和epagap分别用于相对公差和绝对公差。它使用当前的下限或上限(取决于它是最小化还是最大化)来评估当前解决方案与最佳解决方案之间的距离(最多)

当近似解已经足够好时,这会缩短运行时间


这可能是使用optimize类实现的,还是我需要使用解算器实例实现并自己控制边界?

对此我不是绝对肯定,但我怀疑
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
之上自己实现

我建议使用二进制搜索模式(请参阅),否则OMT解算器将只优化优化搜索间隔的一端,这可能会破坏搜索终止条件的预期目的

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

您可能还想看看中使用的基于线性回归的方法。如果适用,它可以加快优化搜索,并改进与最优解的相对距离估计


备选方案#02:

可能会在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 ...)
    
  • 提供(至少)任何最大化目标的初始上限:

    (minimize ... :lower ...)
    
    (maximize ... :upper ...)
    
此外,该工具必须配置为使用二进制或自适应搜索:

如果这两个终止条件都不符合您的要求,您也可以在OptiMathSAT上实现自己的算法。由于可以通过API和命令行设置以下选项,因此操作相对容易:

 -opt.no_optimization=BOOL
          If true, the optimization search stops at the first (not optimal) 
          satisfiable solution. (default: false) 
启用时,它使OptiMathSAT的行为类似于常规SMT解算器,只是当它找到存在输入公式模型的完整布尔赋值时,它确保该模型是最优wrt。目标函数和给定的布尔赋值(换句话说,它为您调用内部
T-optimizer
过程)


一些想法。

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

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