- •Глава 10. Дискретные задачи удовлетворения ограничений (уо) и алгоритмы их решения.
- •10.1. Основные понятия теории удовлетворения ограничений.
- •10.1.1. Определение задачи удовлетворения ограничений
- •10.1.2. Примеры задач удовлетворения ограничений
- •10.1.3. Бинарные и общие задачи удовлетворения ограничений
- •10.1.4. Графовые представления структуры задачи удовлетворения ограничений
- •10.2. Основные методы решения задач удовлетворения ограничений
- •10.2.1. О методах решения задач удовлетворения ограничений
- •10.2.2. Методы поиска с возвратами
- •10.2.3. Структура и методы декомпозиции задач удовлетворения ограничений
- •10.2.4. Программирование в ограничениях
- •10.2.5. Современные программные системы программирования в ограничениях.
10.2.4. Программирование в ограничениях
Программирование в ограничениях (constraint programming) ‑ программная технология для декларативного описания и эффективного решения больших комбинаторных задач в областях планирования и календарного планирования.
Цель программирования в ограничениях состоит в разработке языков программирования для задания ограничений и процедур поиска задач УО.
Процедура поиска в УО неявно описывает обход дерево поиска. При этом она не описывает, как обходить это дерево, это уже ‑ задача стратегий поиска. Обычно дерево поиска обходится с помощью поиска в глубину (depth-first search).
Благодаря успешному решению многих прикладных задач, стратегии поиска стали неотъемлемой частью языков программирования в ограничениях.
В частности, программная система OZ впервые ввела спецификацию общих стратегий поиска, которые могут быть заданы независимо от процедуры поиска.
Поисковый язык SALSA (Laburthe & Caseau, 1998)19 также содержит ряд заданных общих стратегий поиска.
Основные идеи, лежащие в основе программирования в ограничениях, просты: декларативное представление ограничений задачи, совмещенное с общими методами решения типа хронологического поиска с возвратами или локального поиска.
Программирование в ограничениях имеет множество сильных сторон: мощные языки моделирования, позволяющие представить сложные и динамические прикладные задачи; быстрые методы вывода общего назначения типа вынуждения дуговой совместимости, для усечения части пространства поиска; быстрые методы вывода специального назначения, связанные с глобальными ограничениями; гибридные методы, сочетающие преимущества методов программирования в ограничениях и подходов исследования операций; методы локального поиска, позволяющие быстро находить решения, близкие к оптимальным; большой диапазон расширений типа мягких ограничений и распределенного решения ограничений, с помощью которых возможно более адекватное моделирование практических задач.
Логическое программирование в ограничениях
За последние 20 лет программирование в ограничениях прошло путь от научной идеи до мощной парадигмы программирования, которая все больше используется для моделирования и решения многих трудных практически важных задач.
Под программированием в ограничениях (constraint programming) понимается программирование алгоритмов решения задач УО. Программирование в ограничениях, считающееся в настоящее время одним из стратегических направлений информатики20, является декларативной парадигмой, позволяющей выразить многие прикладные задачи с помощью ограничений. Программирование в ограничениях состоит из двух необходимых компонентов: решателя ограничений и машины поиска.
Логическое программирование ‑ это парадигма программирования, основанная на логике. Его конструкты ‑ булевы импликации (т.е. илиp:-q), композиций, использующих булевы операции конъюнкции и дизъюнкции. Логическое программирование может рассматриваться как процедурный язык, в котором процедуры ‑ это булевы функции, результат работы программы всегда истина или ложь.
Тот факт, что системы удовлетворения ограничений и логического программирования ‑ декларативные парадигмы, использующие отношения и поиск с возвратами, сделал их интеграцию легкой и естественной. Логическое программирование в ограничениях ‑ расширение логического программирования, в котором унификация может быть заменена или дополнена другими видами ограничений, определенных на доменах (областях определения) используемых переменных. Схема логического программирования в ограничениях (ЛПО) может рассматриваться как оболочка логического программирования, поддерживаемая системой ограничений, с помощью которой может записывать и решать любые ограничения. По этой причине схема ЛПО может обозначаться как ЛПО(X), где X определяет класс используемых ограничений.
Поскольку описание задачи в виде системы ограничений является декларативным, то при этом описывается, «что» должно выполняться, но не указывается, «как» это сделать.
Общепринятый подход к решению задач УО сочетает дерево поиска с возвратами с распространением ограничений. Это реализовано в системах программирования в ограничениях с конечными доменами, таких как SICStus Prolog, ILOG Solver, и Gecode.
Языки запросов с ограничениями
В области исследований взаимосвязи между ЛПО и базами данных (БД) имеются два главных направления. С одной стороны, результаты из теории БД были обобщены и применены для задач УО, что позволило разработать полезные инструменты для проверки некоторых классов задач УО на легкую разрешимость и эффективного решения этих задач. С другой стороны, классические языки обработки запросов в БД были расширены для работы с ограничениями, которые используются не только для установления целостности информации, но также как средство для представления компактным образом множества кортежей БД, приводит к определению БД с ограничениями (Constraint Databases).