Методы разработки алгоритмов.ppt
- Количество слайдов: 79
Методы разработки алгоритмов
Литература 1. Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн. Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2 -е изд. — М. : «Вильямс» , 2006. — С. 1296 2. Ахо А. , Хопкрофт Дж. , Ульман Дж. Структуры данных и алгоритмы. : Пер. с англ. : Уч. пос. – М. : Издательский дом «Вильямс» , 2000. - 384 с. 3. Ахо А. , Хопкрофт Дж. , Ульман Дж. Построение и анализ вычислительных алгоритмов: Пер. с англ. – М. : Мир, 1979. – 536 с. 4. Гудман С. , Хидетниеми С. Введение в разработку и анализ алгоритмов. - М. : Мир, 1981 - 386 с.
Методы получения эффективных алгоритмов: • 1. Полный перебор? • 2 Разделяй и властвуй (декомпозиция или разбиение). • 3. Динамическое программирование • 4. Жадные методы (поиск локальных оптимумов) • 5. Локальный поиск. • 6. Поиск с возвращением • 7. Метод ветвей и границ • 8. Эвристики
Метод декомпозиции или Разделяй и властвуй Этот метод называют также методом разбиения или методом частных целей Метод заключается в сведении трудной задачи к последовательности более простых задач. Естественно, что более простые задачи должны легче обрабатываться, чем первоначальная задача и решение первоначальной задачи может быть получено из решений этих более простых задач. Использование этого метода требует, чтобы в процессе разбиения подзадачи не повторялись и не пересекались друг с другом. Если это условие не выполняется, то данный метод решения не применим к таким задачам.
• Этот метод достаточно разумен, но, как и большинство общих методов, его не всегда легко перенести на конкретную задачу. Осмысленный выбор более простых задач – скорее дело искусства и интуиции, чем науки. • Более того, не существует общего набора правил для определения класса задач, которые можно решить с помощью такого подхода. Тем не менее, эти методы используются достаточно часто.
• Первый шаг – это разделение задачи на a подзадачи со сложностью n/b. • Властвование – второй шаг алгоритма. Это – чаще всего, использование рекурсивного процесса разбиения подзадач на еще более мелкие подзадачи, до тех пор, пока подзадачи n-го уровня разделения будут достаточно малы для их тривиального решения. • Третий этап метода – соединение, склеивание множества решений отдельных подзадач в общее решение.
Пример • Например, на основе такого подхода построены алгоритмы внутренней сортировки с последующим внешним слиянием. • Данные из файла очень большого размера последовательно загружаются в массив определенного (максимально возможного) размера, упорядочиваются каким-либо быстрым алгоритмом, и помещаются в новые файлы. Далее эти полученные файлы с уже упорядоченными данными сливаются в одну упорядоченную последовательность. • Такой подход позволяет значительно снизить общее время сортировки и максимально использовать имеющуюся оперативную память.
Другие примеры • Другим примером использования является использование декомпозиции при решении задач автоматизированного проектирования. • В реальных САПР метод декомпозиции используется как для понижения размерности решаемой задачи, так и для разбиения сложной задач на ряд боле простых. • Так при решении задачи трассировки схем с большим числом элементов схему можно разбить на части, каждая из которых трассируется отдельно, затем проводятся соединения между частями. • Для снижения сложности задачу проектирования топологии разбивают на размещение и трассировку и решают их отдельно, устанавливая для них формальные частные цели (критерии).
• Эффективность алгоритмов, основанных на декомпозиции, зависит от размеров отдельных подзадач. Как их выбирать заранее не известно. • Очень часто декомпозиция позволяет получать достаточно эффективные алгоритмы, при этом размеры отдельных подзадач выбираются примерно равные другу (говорят о применение балансировки). • T(n)= a. T(n/b) +D(n)+ C(n)
Динамическое программирование • Динамическим программированием (в наиболее общей форме) называют процесс пошагового решения задачи, когда на каждом шаге выбирается одно решение из множества допустимых (на этом шаге) решений, причем такое, которое оптимизирует заданную целевую функцию
• Процесс пошагового решения может быть сведен к пошаговому заполнению таблиц решений всех подзадач. Мы заполняем эту таблицу независимо от того, нужна ли нам на самом деле конкретная подзадача для получения общего решения. • Заполнение таблицы подзадач для получения решения определенной задачи получило название динамического программирования (терминология из теории управления).
• В основе динамического программирования лежит принцип оптимальности Беллмана (Теория управления). • Он состоит в применении рекуррентных соотношений – функциональных уравнений относительно оптимального значения целевой функции. Их решение позволяет получить оптимальное управление для исходной оптимизационной задачи.
• Оптимальное решение обладает тем свойством, что какими бы ни были начальное состояние и начальное решение, все последующие решения должны быть оптимальной последовательностью решений относительно текущего состояния.
• Как изменение самой системы во времени, так и процесс управления системой, допускает разбивку по времени на этапы (шаги). Отсюда и термин «динамическое» – изменяющееся во времени. • Особенность динамического программирования заключалась в том, что допускалась разбивка процесса на фиксированные промежутки времени и, в целом, оптимальное решение задачи как бы складывалось из оптимальных решений на каждом из промежутков (этапе, шаге).
• Термин «программирование» (dynamic programming) в данном случае никоим образом не связан с разработкой программ для компьютера, так же как, например, и «линейное программирование» (linear programming). Он означает нечто другое, а именно, строго заданную последовательность операций (арифметических, логических) по нахождению оптимального решения. Т. е. это алгоритм, метод решения задачи.
• Этот метод дает глобальное оптимальное решение, в отличие от эвристик или «жадного алгоритма» . Для ДП решение на каждом шаге должно быть оптимальным с точки зрения процесса в целом. • Класс задач, решаемых алгоритмами ДП, обширен. Задачи различаются как по содержанию, так и по характеру моделей. Наиболее часто ДП используется в экономических задачах оптимизации производства и задачах принятия решений в экспертных системах.
Примеры задач: • Задачи оптимального распределения ресурсов. • Задачи оптимального управления запасами. • Задача оптимального плана производства. • Задачи целочисленного линейного программирования. • Задачи маршрутизации (сетевые графики, транспортные перевозки).
Пример Задача о черепашке • Черепашке необходимо попасть из пункта А в пункт В • На каждом углу она может поворачивать только на север (вверх) и на восток (вправо) • Требуется найти минимальное время за которое черепашка может попасть из А в В • На каждом участке пути проставлено время прохождения этого участка
•
• Построение пути начинается из точки В • Каждому узлу присваивается вес = минимальному времени движения из этого узла до В • Для каждого узла найденное решение не изменяется и используется на следующих этапах • Отметим, что для каждого узла найденное решение является решением задачи меньшей размерности.
Жадные методы • На каждом шаге «жадный» метод (алгоритм) выбирает тот вариант, который является локально-оптимальным в том или игом смысле. Такой подход далеко не всегда позволяет получить оптимальное решение поставленной задачи, в целом.
Простой пример • У нас имеются монеты достоинством 20, 10, 5 и 1 копейка. Необходимо вернуть сдачу, равную 53 копейкам. Количество монет должно быть минимальным. «Жадный» алгоритм выберет монеты 20, 10 и три копейки. Оптимальное решение получено. • Но если, предположить наличие монет другого достоинства и другую сумму: нужно сдать 15 копеек, имеются монеты достоинством 11, 5, 1. «Жадный» алгоритм в этом случае выберет монеты 11 и четыре копейки (всего пять монет). Лучшим решением будет другое: три монеты по 5 копеек.
Алгоритм построения кратчайшего связывающего дерева • Алгоритм построения кратчайшего связывающего дерева (остовного дерева), разработан Краскалом (J. Kruskal). • Он позволяет получить глобальнооптимальное решение. • Даны координаты вершин (точек) на плоскости. Построить на заданных вершинах кратчайшее (минимальное) связывающее дерево. • Дерево – связный граф, не содержащий циклов. Минимальное дерево – дерево, сумма длин ребер которого минимальна.
1. Определим длины всех возможных ребер полного графа, построенных на заданных 5 вершинах, и результат поместим в таблицу
1. Определим длины всех возможных ребер полного графа, построенных на заданных 5 вершинах 2. Упорядочим ребра по возрастанию их длин 3. Выбираем ребро 2 -3 и включаем его в дерево. 4. Если число ребер в дереве равно 4, то завершаем работу, иначе к 5. 5. Выбираем следующее ребро и, если оно не образует цикл, включаем его в дерево. Возвращаемся к 4.
• Полученное решение: 2 -3, 1 -2, 1 -4, 2 -5
Алгоритм Прима • 1. Выбираем произвольную вершину и рассматриваем как дерево • Повторяем N-1 раз шаг 2 • 2. Выбираем ребро с минимальным весом, которое соединяет вершину, входящую в дерево с вершиной , не входящей в дерево
Методы локального поиска • 1. Выбрать начальное решение. • 2. Для улучшения имеющегося решения необходимо применить к нему какое-либо преобразование из заданной совокупности преобразований. Если в результате получится лучшее решение, чем было, то взять его в качестве текущего. • 3. Повторять указанные действия до тех пор, пока ни одно из преобразований в заданной совокупности не позволит получить лучшее решение, чем предыдущее.
Методы локального поиска • Эти методы называют также методами подъема. Они довольно грубы, но просты в реализации. Описанная стратегия нередко приводит к хорошему решению. • Подобные методы в значительной степени зависят от совокупности и сложности преобразований. Они гарантируют получение локально-оптимальных решений. Хотя, среди локально-оптимальных решений может оказаться и глобально-оптимальное решение.
Примеры • Типичными примерами таких алгоритмов являются итерационные алгоритмы. • Алгоритмы парных перестановок, используемые при решении задач разрезания и размещения элементов в САПР. • Алгоритмы численных методов, дающие приближенные решения. • Метод последовательного улучшения решения задачи коммивояжера, который будет рассмотрен в дальнейшем.
Алгоритмы парных перестановок, для решения задачи размещения элементов в САПР • Дана модель схемы соединений элементов в виде графа. • Выберем начальное размещение элементов на заданных позициях (рисунок ). I, III, IV, V, VI – номера позиций, 1, 2, 3, 4, 5, 6 – номера элементов. Определим S - условную суммарную длину соединений (УСДС) для начального размещения Необходимо, за счет перестановок пар вершин, уменьшить значение УСДС.
Алгоритмы парных перестановок, задача размещения элементов САПР
Алгоритм парных перестановок • 1. Выполнить п. 2 -10 для всех позиций Р 1 от I до V 2. Выбираем элемент, стоящий на позиции I. ΔSmax=0. 3. Выполнить п. 4 -9 для всех позиций Р 2 от Р 1+1 до VI. 4. Определяем суммарную длину связей элементов, стоящих на позициях Р 1 и Р 2 – S 1. 5. Меняем местами элементы, стоящие на позициях Р 1 и Р 2. 6. Определяем суммарную длину связей элементов, стоящих на позициях Р 1 и Р 2 – S 2. 7. Определяем ΔS = S 1 -S 2. 8. Если ΔS>ΔSmax, запоминаем эту улучшающую перестановку. 9. Возвращаем переставленные элементы на свои места. 10. Если есть улучшающие перестановки, то осуществляем перестановку, которую мы запомнили в п. 8. 11. Если при выполнении пунктов 1 -10 были зафиксированы улучшающие перестановки, то можно начать следующую итерацию (т. е. повторить пункты 1 -10, иначе завершить работу).
Эвристики • Эвристический алгоритм — это алгоритм решения задачи, правильность которого для всех возможных случаев не доказана, но про который известно, что он даёт достаточно хорошее решение в большинстве случаев. В действительности может быть даже известно (то есть доказано) то, что эвристический алгоритм формально неверен. Его всё равно можно применять, если при этом он даёт неверный результат только в отдельных, достаточно редких и хорошо выделяемых случаях, или же даёт неточный, но всё же приемлемый результат. • Проще говоря, эвристика — это не полностью математически обоснованный (или даже «не совсем корректный» ), но при этом практически полезный алгоритм.
Важно понимать, что эвристика, в отличие от корректного алгоритма решения задачи, обладает следующими особенностями: • Она не гарантирует нахождение лучшего решения. • Она не гарантирует нахождение решения, даже если оно заведомо существует (возможен «пропуск цели» ). • Она может дать неверное решение в некоторых случаях.
• Эвристические алгоритмы широко применяются для решения задач высокой вычислительной сложности (задачи, принадлежащие классу NP), то есть вместо полного перебора вариантов, занимающего существенное время, а иногда технически невозможного, применяется значительно более быстрый, но недостаточно обоснованный теоретически, алгоритм.
• В областях искусственного интеллекта, таких, как распознавание образов, эвристические алгоритмы широко применяются также и по причине отсутствия общего решения поставленной задачи. • Различные эвристические подходы применяются в антивирусных программах, компьютерных играх и т. д.
• Например, программы, играющие в шахматы, проводят середину игры, основываясь, преимущественно, на эвристических алгоритмах (в дебюте может использоваться база данных, в эндшпиле — таблицы Налимова, но в миттельшпиле часто количество возможных ходов исключает полный перебор, а точных алгоритмов правильной игры не существует).
• Алгоритмы трассировки – Лучевой алгоритм (эвристический) – Волновой алгоритм (всегда находит решение если оно есть)
• Возможность (допустимость) использования эвристик для решения каждой конкретной задачи определяется соотношением затраты на решение задачи точным и эвристическим методом, ценой ошибки и статистическими параметрами эвристики. Кроме того, важным является наличие или отсутствие на выходе «фильтра здравого смысла» — оценки результата человеком.
• Если же на выходе результат решения критически оценивается человеком, то ситуация становится лучше: когда ошибка, выданная эвристикой, оказывается достаточно мала, чтобы человек её не заметил, цена этой ошибки обычно гораздо ниже, а серьёзные ошибки будут отсеяны «фильтром здравого смысла» , следовательно, не нанесут существенного вреда.
При выборе правильного метода решения задачи необходимо ответить на вопросы: • А) Что представляют собой входные данные? • Б) Что должен представлять собой результат? • В) Можно ли решить пример задачи на ограниченном малом объёме входных данных вручную? • Г) Каков реальный типовой размер задачи на практике (N=? ). • Д) Какие условия и ограничения накладываются на время решения задачи? • Е) Что приемлемо: прямое решение простым алгоритмом или разработка специального эффективного алгоритма в течение какого-то времени. • Ж) Определение класса к которому можно отнести задачу (комбинаторная, задача принятия решений, на графах и др. ).
Можно ли построить простой алгоритм или эвристику? • Если ДА, то будет ли такой алгоритм корректным и какова его вычислительная сложность T(N)? • Существует ли типовой алгоритм решения задачи данного класса? • Существует ли какой-либо упрощенный вариант задачи, который можно решить сразу, если игнорировать некоторые входные параметры и ограничения задачи, допуская упрощенное представление форматов данных? • Можно ли обобщить алгоритм решения упрощенного варианта задачи на всю задачу? • Какой из стандартных методов разработки эффективных алгоритмов наиболее соответствует задаче?
Поиск с возвращением • Иногда приходится иметь дело с задачей поиска оптимального решения, когда невозможно применить ни один из известных методов, способных помочь отыскать оптимальный вариант решения. • Остается прибегнуть к последнему средству – полному перебору. Систематическим методом реализации полного перебора является поиск с возвращением (возвратом) или поиск с отходом назад.
• Термин backtrack был введен в 1950 году американским математиком Дерриком Генри Лемером. • Этот метод лежит в основе логического программирования, реализованный в таких языках как Пролог и Плэнэр
• Классическим примером использования алгоритма поиска с возвратом является задача о восьми ферзях. • Её формулировка такова: «Расставить на стандартной 64 -клеточной шахматной доске 8 ферзей так, чтобы ни один из них не находился под боем другого» .
• Первый ферзь ставится на первую горизонталь, затем каждый следующий пытаются поставить на следующую так, чтобы его не били ранее установленные ферзи. Если на очередном этапе постановки свободных полей не оказывается, происходит возврат на шаг назад — переставляется ранее установленный ферзь
• В более «математическом» виде задача может быть сформулирована несколькими способами, например, так: «Заполнить матрицу размером 8× 8 нулями и единицами таким образом, чтобы сумма всех элементов матрицы была равна 8, при этом сумма элементов ни в одном столбце, строке или диагональном ряде матрицы не превышала единицы» .
Пример • Типичным примером алгоритма поиска с возвращением является алгоритм Брона. Кербоша, используемый для поиска множества максимальных полных подграфов в графе. Но этот алгоритм ограничивает множество просматриваемых вариантов, используя знания о ранее полученных решениях.
Пример • Другим примером является алгоритм перебора Робертса и Флойда, используемый для поиска гамильтоновых циклов в ориентированном графе. • Гамильтонов цикл –цикл в графе, проходящий по каждой вершине ровно один раз. Каков размер наибольшего гамильтонова цикла в графе. Определение всех наибольших гамильтоновых циклов.
• Однако время нахождения решения может быть очень велико даже при небольших размерностях задачи, причём настолько велико (может составлять годы) • Поэтому при проектировании таких алгоритмов, обязательно нужно теоретически оценивать время их работы на конкретных данных. • В наихудшем случае алгоритмы поиска с возвращением имеют экспоненциальную сложность.
• Незначительные модификации метода поиска с возвратом, связанные с представлением данных или особенностями реализации, имеют и иные названия: метод ветвей и границ, поиск в глубину, метод проб и ошибок и т. д. • Поиск с возвратом практически одновременно и независимо был изобретен многими исследователями еще до его формального описания.
Метод ветвей и границ • Этот метод называют также методом поиска, использующим дерево решений • Основной принцип, на котором базируется этот метод, состоит в разбиении начальной задачи P 0 на некоторое число подзадач P 1, P 2, …, Pk (в целом представляющих всю задачу P 0) с последующей попыткой разрешить каждую из этих подзадач.
• Выражение разрешить понимают так: – (П 1) - либо найти оптимальное решение; – (П 2) - либо показать, что значение оптимального решения хуже, чем значение полученного до этого наилучшего решения; – (П 3) - либо показать, что подзадача не является допустимой.
• Это разбиение описывается деревом, в котором вершины изображают подзадачи.
• Смысл разбиения задачи P 0 на некоторое число подзадач состоит в том, • что или эти подзадачи проще разрешить, или • они имеют меньший размер, или • обладают структурой, не присущей первоначальной задаче P 0. •
• Однако может оказаться, что подзадачу Pi нельзя разрешить, тогда эта подзадача разбивается на новые подзадачи Pi 1, Pi 2, …, Pir. Это разбиение, называемое ветвлением, повторяется для каждой подзадачи, которая не может быть разрешена. • На любом этапе полное множество подзадач, требующих разрешения, представляется множеством концевых (висячих) вершин всех цепей, исходящих из корня дерева решений P 0.
• Если поиск исчерпан, то множество подзадач, на которые разбита задача, должно представлять всю задачу. Так, если задача Pi разбита на r подзадач Pi 1, Pi 2, …, Pir, то • – где {P} обозначает множество всех допустимых решений задачи P.
Так как соотношение должно быть применено к каждому разбиению, то
• В тех случаях, когда требуется перебрать все решения задачи Pi (а не только найти оптимальное решение), желательно уметь перебирать решения с помощью приведенного разбиения задачи на подзадачи и перебирать решения каждой из этих подзадач. • В этом случае нужно избежать дублирования построенных решений, для чего нужно разбивать задачу Pi на подзадачи Pi 1, Pi 2, …, Pir, так чтобы
• Соотношение определяет собственное разбиение задачи Pi. Оно не является необходимым, но имеет большое значение для снижения вычислительной сложности, так как: – а) для задачи оптимизации P 0 оптимальное решение является решением одной и только одной подзадачи, представляемой висячей вершиной; – б) для задачи полного перебора объединение множеств решений подзадач, представляемых висячими вершинами, дает множество всех решений задачи P 0 без дублирования.
• Рассмотрим некоторые примеры ветвления для задачи Pi с n переменными, в которой некоторая переменная ξ может принимать только четыре возможных значения, скажем a, b, c и d. – а) Возможно разбиение Pi на четыре подзадачи Pi 1, Pi 2, Pi 3, Pi 4, причем для подзадачи Pi 1 полагаем ξ = a, для Pi 2 - ξ = b, для Pi 3 - ξ = c и для Pi 3 - ξ = d. Каждая из подзадач Pi 1, Pi 2, Pi 3, Pi 4, содержит n-1 переменных и, следовательно, допускает более простое решение, чем задача Pi
• Возможно другое разбиение Pi на две подзадачи Pi 1 и Pi 2, – где для Pi 1, полагаем ξ = a, – а для Pi 2 полагаем ξ≠ a, т. е. ξ равно b, c или d
• Еще одно возможное разбиение Pi на две подзадачи Pi 1 и Pi 2, где для Pi 1, ξ = a или b, а для Pi 2 ξ = c или d • Все три ветвления являются допустимыми и удовлетворяют условию • Какому из них отдать предпочтение – зависит от природы решаемой задачи.
Функция ветвления • В методе вводится понятие функции ветвления. Функция ветвления - это функция, которая позволяет «вычислить» , какая из допустимых вершин должна использоваться при следующем ветвлении. Для вершины, соответствующей подзадаче Pj, эта функция является некоторой мерой вероятности того, что оптимальное решение всей задачи P 0 является решением для Pj.
• Существует два основных типа поиска в зависимости от того, как выбирается следующая висячая вершина для продолжения процесса ветвления: – поиск по глубине – поиск по ширине.
Поиск по глубине • При этом типе поиска ветвление производится в вершине, соответствующей последней полученной подзадаче до тех пор, пока не будет порождена подзадача, которую можно разрешить. В этом месте производится шаг возвращения, т. е. берется предпоследняя порожденная подзадача и ветвление продолжается в соответствующей вершине.
• При этом типе поиска задача, получаемые на каждом этапе, хранятся в стеке вместе с самой верхней задачей, выбранной для исследования (разрешения или разбиения). Вновь получаемые задачи помещаются в вершину этого стека, а когда подзадача разрешена, она удаляется из стека. Вид дерева решений при этом типе поиска, когда разрешается первая подзадача, представлен на рисунке
Поиск по ширине • При поиске по ширине ветвление производится от уровня к уровню, так что если на уровне 1 начальная задача P 0 разбивается на подзадачи P 1, P 2, …, Pk, то каждая из этих подзадач исследуется раньше, чем задачи уровня 2. • Задачи уровня 1, которые не могут быть разрешены, разбиваются на подзадачи уровня 2, и опять все они исследуются до исследования какой-либо из подзадач уровня 3, и т. д. Вид дерева решений при этом типе поиска представлен на рисунке
Применение границ • Если задача P 0 подлежит решению как задача оптимизации, то безотносительно к типу поиска он завершается только тогда, когда будут разрешены все подзадачи, представляемые висячими вершинами. Для ускорения процесса разрешения для каждой из висячих вершин вычисляются нижние или верхние границы (для случаев минимизации или максимизации соответственно).
• Эти границы дают наименьшее (или наибольшее) возможное значение оптимального решения той подзадачи, которая соответствует рассматриваемой вершине. • Таким образом (для задачи минимизации), если окажется, что нижняя граница для вершины, соответствующей задаче Pi, больше, чем величина наилучшего решения, полученного ранее при поиске, то в Pi нет необходимости производить дальнейшее ветвление, так как {Pi} нет решения, лучшего, чем текущее решение.
• Использование метода ветвей и границ будет приведено при решении задачи коммивояжера. • Задача коммивояжера – определение минимального пути (и цикла) обхода всех вершин графа. Каждая вершина посещается ровно один раз.
Методы разработки алгоритмов.ppt