Оптимизация тактики решателя для Circuit SAT

Я использую решатель Z3 с Python API для решения проблемы Circuit SAT. Он состоит из множества выражений Xor с 21 входом и выражений And с тремя входами. Z3 умеет решать мои маленькие примеры, но не справляется с большими.

Вместо создания объекта Solver с

s = Solver()

Я попытался оптимизировать тактику решателя, как в

t = Then('simplify', 'symmetry-reduce', 'aig', 'tseitin-cnf', 'sat' )
s = t.solver()

Я получил список тактик через describe_tactics()

К сожалению, мои попытки не увенчались успехом. Последовательность тактик по умолчанию, кажется, неплохо справляется со своей задачей. Учебник по тактике, ранее доступный в rise4fun, больше недоступен.

Другая попытка - без видимого эффекта - заключалась в установке параметра фазы, так как я ожидаю, что большинство моих переменных будут иметь ложные значения. (см. связанный пост)

set_option("sat.phase", "always-false")

Какая последовательность тактик рекомендуется для решения проблем Circuit SAT?


person Axel Kemper    schedule 08.11.2015    source источник
comment
Для этого типа проблем не существует рекомендуемой тактики, и я подозреваю, что она будет сильно зависеть от того, что именно появляется в проблеме, например, большое количество ограничений xor может очень затруднить решение. Z3py больше не доступен на Rise4fun, стратегии (smt2-) по-прежнему доступны здесь: rise4fun.com/ Z3/учебник/стратегии   -  person Christoph Wintersteiger    schedule 09.11.2015