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