Программное обеспечение с ограничениями (CP): парадигма решения задач, где связи между переменными задаются в виде ограничений. ИИ, компьютерные науки.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Парадигма программирования, в которой отношения между переменными задаются в форме ограничений.
Programming paradigm wherein relations between variables are stated in the form of constraints
Программирование с ограничениями (CP) – это парадигма для решения комбинаторных задач, использующая широкий спектр методов из искусственного интеллекта, информатики и исследования операций. В программировании с ограничениями пользователи декларативно задают ограничения на допустимые решения для набора переменных принятия решений. Ограничения отличаются от стандартных примитивов императивных языков программирования тем, что они не указывают шаг или последовательность шагов для выполнения, а описывают свойства искомого решения. Помимо ограничений, пользователям необходимо указать метод их решения. Обычно это стандартные методы, такие как хронологический возврат и распространение ограничений, но также может использоваться специализированный код, например, эвристика ветвления, специфичная для задачи. Программирование с ограничениями берет начало в логическом программировании с ограничениями, которое встраивает ограничения в логическую программу. Этот вариант логического программирования разработан Джаффаром и Лассесом, которые в 1987 году расширили конкретный класс ограничений, впервые представленный в Prolog II. Первыми реализациями логического программирования с ограничениями были Prolog III, CLP(R) и CHIP. Вместо логического программирования ограничения могут комбинироваться с функциональным программированием, преобразованием термов и императивными языками. Языки программирования со встроенной поддержкой ограничений включают Oz (функциональное программирование) и Kaleidoscope (императивное программирование). Чаще всего ограничения реализуются в императивных языках с помощью инструментариев для решения ограничений – отдельных библиотек для существующих императивных языков.
Constraint programming (CP) is a paradigm for solving combinatorial problems that draws on a wide range of techniques from artificial intelligence, computer science, and operations research. In constraint programming, users declaratively state the constraints on the feasible solutions for a set of decision variables. Constraints differ from the common primitives of imperative programming languages in that they do not specify a step or sequence of steps to execute, but rather the properties of a solution to be found. In addition to constraints, users also need to specify a method to solve these constraints. This typically draws upon standard methods like chronological backtracking and constraint propagation, but may use customized code like a problem specific branching heuristic. Constraint programming takes its root from and can be expressed in the form of constraint logic programming, which embeds constraints into a logic program. This variant of logic programming is due to Jaffar and Lassez, who extended in 1987 a specific class of constraints that were introduced in Prolog II. The first implementations of constraint logic programming were Prolog III, CLP(R), and CHIP. Instead of logic programming, constraints can be mixed with functional programming, term rewriting, and imperative languages. Programming languages with built in support for constraints include Oz (functional programming) and Kaleidoscope (imperative programming). Mostly, constraints are implemented in imperative languages via constraint solving toolkits, which are separate libraries for an existing imperative language.
Программирование с логикой ограничений
Ограничивающее программирование — это встраивание ограничений в язык-хост. Первыми языками-хостами, которые использовались, были языки логического программирования, поэтому эта область первоначально называлась логическим программированием с ограничениями. Обе парадигмы имеют много общих важных особенностей, таких как логические переменные и возврат (backtracking). Сегодня большинство реализаций Prolog включают одну или несколько библиотек для логического программирования с ограничениями. Разница между ними заключается главным образом в стилях и подходах к моделированию мира. Некоторые задачи более естественно (и, следовательно, проще) представлять в виде логических программ, а другие — в виде программ с ограничениями. Подход ограничивающего программирования заключается в поиске состояния мира, в котором одновременно выполняется большое количество ограничений. Задача обычно формулируется как состояние мира, содержащее ряд неизвестных переменных. Программа с ограничениями ищет значения для всех переменных. Временное конкурентное программирование с ограничениями (TCC) и недетерминированное временное конкурентное программирование с ограничениями (MJV) — это варианты ограничивающего программирования, способные работать со временем.
Constraint programming is an embedding of constraints in a host language. The first host languages used were logic programming languages, so the field was initially called constraint logic programming. The two paradigms share many important features, like logical variables and backtracking. Today most Prolog implementations include one or more libraries for constraint logic programming. The difference between the two is largely in their styles and approaches to modeling the world. Some problems are more natural (and thus, simpler) to write as logic programs, while some are more natural to write as constraint programs. The constraint programming approach is to search for a state of the world in which a large number of constraints are satisfied at the same time. A problem is typically stated as a state of the world containing a number of unknown variables. The constraint program searches for values for all the variables. Temporal concurrent constraint programming (TCC) and non deterministic temporal concurrent constraint programming (MJV) are variants of constraint programming that can deal with time.
Распространение ограничений
Условия локальной согласованности — это свойства задач, связанных с удовлетворением ограничений, которые относятся к согласованности подмножеств переменных или ограничений. Они могут использоваться для уменьшения пространства поиска и упрощения решения задачи. Применяются различные виды условий локальной согласованности, включая согласованность узлов, дуг и путей. Каждое условие локальной согласованности может быть обеспечено преобразованием, которое изменяет задачу, не меняя при этом её решений. Такое преобразование называется распространением ограничений. Распространение ограничений работает путем сужения областей значений переменных, усиления ограничений или добавления новых. Это приводит к уменьшению пространства поиска, что упрощает решение задачи некоторыми алгоритмами. Распространение ограничений также может использоваться как средство проверки выполнимости, которое в общем случае является неполным, но в некоторых конкретных случаях — полным.
Local consistency conditions are properties of constraint satisfaction problems related to the consistency of subsets of variables or constraints. They can be used to reduce the search space and make the problem easier to solve. Various kinds of local consistency conditions are leveraged, including node consistency, arc consistency, and path consistency. Every local consistency condition can be enforced by a transformation that changes the problem without changing its solutions. Such a transformation is called constraint propagation. Constraint propagation works by reducing domains of variables, strengthening constraints, or creating new ones. This leads to a reduction of the search space, making the problem easier to solve by some algorithms. Constraint propagation can also be used as an unsatisfiability checker, incomplete in general but complete in some particular cases.
Решение ограничений
Существует три основных алгоритмических подхода к решению задач об удовлетворении ограничениям: поиск с возвратом, локальный поиск и динамическое программирование.
There are three main algorithmic techniques for solving constraint satisfaction problems: backtracking search, local search, and dynamic programming.
Поиск с обратным отслеживанием
Обратный поиск — это общий алгоритм для нахождения всех (или некоторых) решений вычислительных задач, в особенности задач об удовлетворении ограничениям, который инкрементно строит варианты решений и отбрасывает вариант ("возвращается назад"), как только определяет, что его невозможно дополнить до допустимого решения.
Backtracking search is a general algorithm for finding all (or some) solutions to some computational problems, notably constraint satisfaction problems, that incrementally builds candidates to the solutions, and abandons a candidate ("backtracks") as soon as it determines that the candidate cannot possibly be completed to a valid solution.
Локальный поиск
Местный поиск — это неполный метод для нахождения решения задачи. Он основан на итеративном улучшении присваивания значений переменным до тех пор, пока не будут выполнены все ограничения. В частности, алгоритмы локального поиска обычно изменяют значение одной переменной в текущем присваивании на каждом шаге. Новое присваивание близко к предыдущему в пространстве возможных присваиваний, отсюда и название "локальный поиск".
Local search is an incomplete method for finding a solution to a problem. It is based on iteratively improving an assignment of the variables until all constraints are satisfied. In particular, local search algorithms typically modify the value of a variable in an assignment at each step. The new assignment is close to the previous one in the space of assignment, hence the name local search.
Динамическое программирование
Динамическое программирование — это одновременно метод математической оптимизации и метод компьютерного программирования. Оно заключается в упрощении сложной задачи путём её разбиения на более простые подзадачи рекурсивным способом. Хотя некоторые задачи принятия решений нельзя разложить таким образом, задачи, охватывающие несколько моментов времени, часто поддаются рекурсивному разложению. Аналогично, в информатике, если задачу можно оптимально решить, разбив её на подзадачи и затем рекурсивно найдя оптимальные решения для этих подзадач, то говорят, что она обладает оптимальной подструктурой.
Dynamic programming is both a mathematical optimization method and a computer programming method. It refers to simplifying a complicated problem by breaking it down into simpler sub problems in a recursive manner. While some decision problems cannot be taken apart this way, decisions that span several points in time do often break apart recursively. Likewise, in computer science, if a problem can be solved optimally by breaking it into sub problems and then recursively finding the optimal solutions to the sub problems, then it is said to have optimal substructure.