Можно ли найти оптимальное решение для булевой формулы с помощью решателей SMT?

У меня есть большая логическая формула для решения, из-за редактирования я должен вставить изображение здесь:

введите здесь описание изображения

Кроме того, у меня уже есть функция area для измерения размера 4 целых чисел: area(c,d,e,f)=|c−d|×|e−f|

Я хотел бы сделать больше, чем просто выяснить, выполнима ли формула: я ищу оптимальный набор из шести (a,b,c,d,e,f), который делает большую формулу TRUE и area(c,d,e,f) больше или равной размерности любого другого набора из шести, который также удовлетворяет формула.

Другими словами, найдите Max(area(c,d,e,f)) подчиненное большой формуле.

Мне интересно, может ли решатель SMT помочь в этой проблеме. Я узнаю, что Z3 поддерживает quantifiers, и могу сказать, является ли логическое выражение выполнимым или нет. Но вопрос в том, может ли Z3 помочь найти оптимальное решение для функции area.

У кого-нибудь есть идеи? Любые комментарии о SMT-решателе, Z3 или других алгоритмах будут оценены...


person SoftTimur    schedule 14.12.2011    source источник


Ответы (4)


Короче говоря, да.

Поскольку ваша формула состоит из квантификаторов, я не думаю, что Microsoft Solver Foundation является подходящим выбором. Как вы сказали, Z3 поддерживает квантификаторы, теорию целых чисел и используется для проверки выполнимости. Хотя Z3 не поддерживает оптимизацию напрямую, вы можете легко кодировать проблемы оптимизации, используя универсальные квантификаторы:

sat(a, b, c, d, e, f) => (для всех a1, b1, c1, d1, e1, f1. sat(a1, b1, c1, d1, e1, f1) && target(a, b , c, d, e, f) >= цель(a1, b1, c1, d1, e1, f1))

где: sat — ваше логическое выражение для проверки выполнимости, а goal — функция area, ваша цель оптимизации.

Как видите, формулировка дословно переводится из вашего требования в вопросе. Задание для (a, b, c, d, e, f) — это оптимальное решение, которое вам нужно найти.

Кстати, Z3 имеет дистрибутив Linux и предоставляет OCaml API, который полностью соответствует вашим предпочтениям.

person pad    schedule 14.12.2011
comment
Спасибо за ваш комментарий, это хорошая новость... Я еще не пробовал Z3... Моя формула выглядит сложной, как вы думаете, Z3 действительно справится с этим? - person SoftTimur; 15.12.2011
comment
По сути, это просто целочисленные ограничения, логические связки и квантификаторы. Я уверен, что Z3 справится. - person pad; 15.12.2011
comment
По-видимому, этот метод стоит дорого... Затем я отправил еще один вопрос, если вам интересно... Спасибо - person SoftTimur; 15.12.2011

Целевая функция использует нелинейную целочисленную арифметику и квантификаторы. Нелинейная целочисленная арифметика уже сложна (неразрешима) без кванторов, а добавление кванторов делает ее еще хуже. Если вы измените сортировку с Int на Real, то у нас будет очень ограниченное исключение квантификатора для нелинейных вещественных чисел ((set-option: ELIM_QUANTIFIERS true) (set-option: ELIM_NLARITH_QUANTIFIERS true)) Но это кажется не совсем подходящим для проблема, которую вы, кажется, решаете. Попробуйте посмотреть, можно ли ее сформулировать как задачу линейной или квадратичной оптимизации. Есть много инструментов, которые настроены на квадратичную оптимизацию (и, возможно, они меньше настроены на, скажем, булев поиск, чем Z3). Попробуйте, например, Solver Foundation, который включает плагины для нескольких инструментов оптимизации.

Можно использовать Z3 для решения задач оптимизации, но типичный подход состоит в том, чтобы иметь цикл вне Z3. Сначала вы ставите задачу, которую хотите проверить, разрешима, а затем ищете следующее удовлетворительное задание, которое улучшает текущее (которое вы извлекаете из удовлетворяющей модели). Для поиска следующего удовлетворительного задания вы будете утверждать, что «цель», назначенная следующему значению, которое вы ищете, улучшает «цель», назначенную текущему лучшему значению.

Вот несколько слайдов: http://research.microsoft.com/en-us/people/nbjorner/lecture1.pptx, которые должны иметь отношение к делу. Они довольно близко подходят к решению такого рода проблем. Последние несколько слайдов в этой колоде иллюстрируют, как использовать Z3 API для поиска по моделям. Конечно, вы также можете использовать текстовый API, если хотите написать парсер для выходного формата. Есть много других способов взаимодействия с Z3 для решения проблем оптимизации, но все они требуют, чтобы вы запрограммировали поиск оптимизации поверх Z3. Это все еще может быть полезно, когда у вас есть логические комбинации ограничений по арифметике и другим областям, поддерживаемым Z3, но стандартные задачи оптимизации лучше решать с помощью специальных инструментов оптимизации.

person Nikolaj Bjorner    schedule 16.12.2011
comment
Я знаю, что это старый вопрос, но у меня та же проблема, и я хотел бы проверить слайды, которые вы включили в свой ответ, но ссылка не работает. не могли бы вы опубликовать это снова? - person Rehab11; 14.05.2018

Ваша проблема не совсем в выполнимости, а скорее в оптимизации или, точнее, в смешанном целочисленном программировании. Это не должно быть слишком сложно решить с помощью любого решателя, такого как (поскольку вы пометили свой вопрос Z3 и, похоже, используете Windows) Microsoft Solver Foundation, которая также предлагает бесплатную версию.

person em70    schedule 14.12.2011
comment
Спасибо за ваш комментарий... на самом деле я использую Linux и код Ocaml. Теперь меня беспокоит, поддерживает ли Solver Foundation квантификатор и имеет ли API Ocaml... - person SoftTimur; 14.12.2011

Я считаю, что эта страница будет очень полезно. Пример был хорошо объяснен, и это поможет прочитать весь пост.

person dhrumeel    schedule 03.03.2012