Автор: Пользователь скрыл имя, 24 Января 2012 в 12:37, курсовая работа
Многие практически важные задачи представляют собой задачи на удовлетворение ограничениям. Для их решения придумано множество алгоритмов, начиная с классического метода Гаусса и кончая сложными методами применяемыми в системах доказательства теорем и в системах символьных вычислений. Возникло даже целое направление в программировании - программирование в ограничениях (constraint programming). Идея его чрезвычайно проста - программист определяет некоторое множество переменных и описывает ограничения, которым они должны удовлетворять, а система находит подходящие значения.
ВВЕДЕНИЕ……………………………………………………………………….3
УДОВЛЕТВОРЕНИЕ ОГРАНИЧЕНИЙ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ………………………………………………….…4
Удовлетворение ограничений…………………………………………...4
Решение задачи удовлетворения ограничений…………………………6
Расширение Prolog для использования в качестве языка логического программирования в ограничениях…………………………………...10
ПРИМЕНЕНИЕ МЕТОДА CLP ДЛЯ ОБРАБОТКИ ДЕЙСТВИТЕЛЬНЫХ ЧИСЕЛ – CLP(R)…………………………………………………………....12
ПЛАНИРОВАНИЕ С ПОМОЩЬЮ МЕТОДА CLP…………..…………15
МОДЕЛИРОВАНИЕ В ОРАНИЧЕНИЯХ…………………………………19
ПРИМЕНЕНИЕ МЕТОДА CLP ДЛЯ ПОДДЕРЖКИ КОНЕЧНЫХ ОБЛАСТЕЙ ОПРЕДЕЛЕНИЯ – CLP(FD)…………………………………20
ЗАКЛЮЧЕНИЕ…………………………………………………………………24
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ………………….……….26
( Sа + Da =< Sb )
Кроме того, требуется обеспечить, чтобы ни одно задание Т; не могло начаться до времени 0, а все задания должны быть выполнены ко времени завершения расписания FinTime следующим образом:
( Si >- 0, Si + Di =< FinTime )
Для определения конкретной задачи составления расписания введем следующие предикаты:
tasks( [Taskl/Durationl, Task2/Duration2, ...])
Приведенный ниже предикат задает список всех имен заданий и значений их продолжительности: prec( Taskl, Task2). Этот предикат определяет отношение предшествования между заданиями Taskl и Task.2.
resource( Task, [ Procl, Proc2, . . . ] ) - Данный предикат указывает, что задание Task может быть выполнено любым из процессоров Procl, Proc2, ... .
Рассмотрим простой случай без ограничений на ресурсы. Один из способов решения задачи планирования. В этой программе подразумевается использование некоторого определения конкретной. Основным предикатом является schedule ( Schedule, FinTime), где Schedule — наилучшее расписание для задачи, которая определена с помощью предикатов tasks и prec, a FinTime — время завершения расписания. Расписание имеет следующее представление:
Schedule = [ Taskl / Start l / Durationl , Task2 / Start2 / Duration2 , . . . ]
Планирование с помощью метода CLP С неограниченными ресурсами
Schedule (Schedule, FinTime) :-tasks( TasksDurs), precedence_constr( TasksDurs, Schedule, FinTime), minimize(FinTime). | % Сформировать отношения предшествования |
precedence_constr(
[1, [], FinTime).
precedence_constr( [T/D ] TDs], [T/Start/D I Rest], FinTime) :- ( Start > 0, |
% Выполнение должно начаться не раньше времени 0 |
Start + D =< FinTime), | % Временем завершения должно быть FinTime |
precedence_constr(
TDs, Rest, FinTime),
prec_constr( T/Start/D, Rest). prec_constt[ _, []). prec_constr( T/S/D, [T1/S1/D1 | Rest]) :- ( prec( T, Tl), !, t S+D -< SI) ;prec( Tl, T), !, ( Sl+Dl =< S) true ), |
|
prec_constr[ T/S/D, Rest). | % Список заданий, подлежащих планированию |
tasks; [ tl/5, t2/7, t3/10, t4/2, t5/9]) . | % Ограничения предшествования |
prec[ t l , t 2 ) . prec( tl, t4), prec ( t2, t 3 ) . prec( t4, t5). |
Процедура schedule, по сути, выполняет описанные ниже действия:
Поскольку все ограничения являются линейными неравенствами, данная задача сводится к задаче линейной оптимизации, для решения которой в системе CLP(R) предусмотрены встроенные средства:
Предикат precedence_constr( TasksDuraticns, Schedule, FinTime) формирует ограничения между значениями времени начала заданий в расписании Schedule и значением времени завершения расписания FinTime.
Предикат prec_constr( Task/Start/Duration, RestofSchedule) формирует ограничения между значением времени начала Start задания Task и значениями времени начала заданий в списке RestOfSchedule таким образом, чтобы эти ограничения на значения времени начала соответствовали ограничениям предшествования между заданиями.
В программе, приведенной выше, содержится также определение простой задачи составления расписания с пятью заданиями. Эта программа-планировщик вызывается на выполнение с помощью следующего вопроса:
?- schedule( Schedule, FinTime).
FinTime = 22,
Schedule =
[tl/0/5,t2/5/7;t3/12/10,t4/S4/
(SS =< 13)
(S4 >= 5}
(S4-S5 =< -2)
Для заданий t4 и t5 предусмотрена определенная степень свободы в отношении времени их начала. При всех значениях времени начала S4 и S5 для заданий t4 и t5 в пределах указанных интервалов достигается оптимальное время завершения расписания. Три другие задания ( tl , t2 и t3) находятся на критическом пути, и время их начала не может сдвигаться.
Иногда с помощью системы CLP(R) удается найти весьма изящные решения задач числового моделирования. Такие средства являются особенно подходящими, если моделируемая система может рассматриваться как состоящая из большого количества компонентов и соединений между этими компонентами. К таким системам относятся, например, электрические схемы, характерными компонентами которых являются резисторы и конденсаторы.
С компонентами связаны параметры и переменные, имеющие реальное значение, такие как электрические сопротивления, напряжения и токи. Подобная организация модели хорошо сочетается со стилем программирования в ограничениях. Законы физики налагают ограничения на переменные, связанные с компонентами. Соединения между компонентами налагают дополнительные ограничения. Поэтому для решения задач числового моделирования с помощью системы CLP(R) для семейства систем, таких как электрические сети, необходимо определить законы, распространяющиеся на компоненты тех типов, которые используются в данной проблемной области, а также законы, регламентирующие соединения компонентов. Эти законы задаются как ограничения на переменные. Затем для моделирования конкретной системы из такого семейства необходимо определить конкретные компоненты и соединения в системе. В результате этого интерпретатор CLP налагает ограничения на всю систему и осуществляет моделирование по принципу удовлетворения ограничений. Безусловно, такой подход является эффективным, если типы ограничений, относящиеся к моделируемой проблемной области, могут эффективно обрабатываться данной конкретной системой CLP.
Этот
подход применяется для моделирования
электрических схем, состоящих из резисторов,
диодов и источников питания. Отношения
между напряжениями и токами в таких схемах
являются кусочно-линейными. Учитывая
то, что применяемая система CLP(R) эффективно
обрабатывает линейные равенства и неравенства,
она является подходящим инструментальным
средством для моделирования подобных
схем.
Система
CLP, предназначенная для работы с
конечными областями
х in Set
В данном случае Set может быть одним из следующих.
Арифметические ограничения имеют следующую форму: Expl Relation Ехр2,
где Expl и Ехр2 — арифметические выражения, a Relation может представлять собой одно из следующих:
Предикат indomain (X) назначает с помощью перебора с возвратами возможные значения переменной X. Далее приведены некоторые полезные предикаты, которые определены на списках переменных:
Далее приведена программа CLP(FD) для решения задачи с восемью ферзями. В качестве указания по составлению подобных программ следует отметить, что программа имеет следующую основную структуру: вначале задаются области определения переменных, затем налагаются определенные ограничения и в конечном итоге предикат разметки находит конкретные решения. Это — обычная структура программ CLP(FD).
Solution(Ys) :- | % Ys - список координат Y ферзей | |
Ys = [_,_,_,_,_,_,_,_,], | % Количество ферзей равно 8 | |
Domain( Ys, 1, 8) , | % Все
координаты имеют область | |
a l l different(Ys), | % Все координаты - разные, что позволяет предотвратить взаимные нападения по горизонтали | |
safe( Ys), | % Ограничение,
с помощью которого | |
Labeling( [], Ys). | % Найти конкретные значения для Ys | |
Safe([]).
Safe([Y | Ys]) :- |
||
no_attack( Y, Ys, 1), | % 1 - расстояние по горизонтали между ферзем Y и ферзями из списка Ys | |
Safe(Ys) . | ||
% no_attack( Y, Ys, D): | % ферзь, который определен переменной Y, не нападает ни на одного из ферзей в списке Ys; D - расстояние по горизонтали между первым ферзем и остальными ферзями | |
no_attack(Y,
[],_).
no_attack (Y1, [Y2 | Ys] , D) :- D #\= Y1-Y2, D #\= Y2-Y1, Dl is D+l, no_attack( Yl, Ys, Dl) . |
Так же с помощью системы CLP(FD)можно решать различные задачи оптимизации, таких как минимизация времени завершения при составлении расписаний. Для решения подобных задач удобно применять следующие встроенные предикаты CLP(FD): minimize( Goal, X) и maximize(Goal, X). Эти предикаты находят такое решение Goal, которое минимизирует (максимизирует) значение X.
ЗАКЛЮЧЕНИЕ
Современные логическое программирование и программирование в ограничениях представляют декларативный взгляд на программирование и рассматривают решение задачи как объект, а не как процесс (чем характеризуется императивное программирование).В логическом программировании выполнение программы соответствует конструктивному выводу логической формулы из заданных аксиом. Для программирования в ограничениях характерно систематическое использование инвариантов, математических свойств и законов, которые присутствуют в решаемой задаче.
В
программировании в ограничениях естественным
образом возникает большое
В рамках программирования в ограничениях разработан ряд специальных методов и на их основе создано большое число систем для решения прикладных задач в области автоматического проектирования, ресурсного планирования, задач моделирования в различных естественно-научных дисциплинах. Для решения задач численного моделирования, возникающих в химии, роботике, механике, финансовойм атематике в программировании в ограничениях и недоопределенных моделях широко используется интервальное представление неизвестных значений в сочетании с потоковым принципом управления. Актуальным является изучение теоретических свойств таких методов, в частности, их сходимости к точному решению, что позволит точнее определить класс эффективно решаемых задач и дальнейшее направление совершенствования.
В
настоящее время методы программирования
в ограничениях активно используются
в рамках двух парадигм: объектно-ориентированной
и логической. Более органичным сочетанием,
в силу декларативности обеих его составляющих,
представляется логическое программирование
в ограничениях. Однако все известные
системы логического программирования
в ограничениях изначально ориентированы
на строго определенные классы задач.
Актуальным является создание систем
логического программирования в ограничениях,
настраиваемых на предметную область
решаемой задачи, и разработка соответствующих
методов.