Симплексный решатель в Z3

Я знаю, что в z3 реализован симплексный решатель. Можно ли использовать решатель для линейной оптимизации? Где находится интерфейс для решателя в исходном коде z3?


person liyistc    schedule 14.05.2013    source источник


Ответы (1)


Да, в Z3 есть решатель, основанный на симплексном методе. Он реализован в файлах src\smt\theory_arith*. Основные файлы src\smt\theory_arith.h и src\smt\theory_arith_core.h. Этот решатель имеет очень базовую поддержку оптимизации в файле src\smt\theory_arith_aux.h. Эта функциональность не «раскрывается» решателем. Он используется внутри расширений/эвристик для целочисленной и нелинейной арифметики.

Кстати, напомню, что решатель Z3 основан на рациональной (точной) арифметике. Таким образом, это намного медленнее, чем решатели, основанные на арифметике с плавающей запятой. Более того, этот решатель не использует переработанный симплекс-метод.

person Leonardo de Moura    schedule 16.05.2013
comment
В файле «theory_arith_aux.h» есть группа функций с именем «max_min». Они делают глобальную оптимизацию? - person liyistc; 04.06.2013
comment
Я не уверен, что вы подразумеваете под глобальной оптимизацией. Метод max_min(theory_var v, bool max) максимизирует/минимизирует данную внутреннюю переменную теории v по отношению к текущей симплексной таблице и заявленным границам. Функция игнорирует, является ли v целым числом или нет. Это просто выполнение симплексного алгоритма максимизации (минимизации) v. - person Leonardo de Moura; 05.06.2013