Автор работы: Пользователь скрыл имя, 06 Декабря 2010 в 01:33, Не определен
1. Методы разработки алгоритмов
2. Жадные алгоритмы
3. Задача о выборе заявок
4. Правильность алгоритма
5. Когда применим жадный алгоритм?
6. Принцип жадного выбора
7. Оптимальность для подзадач
8. Жадный алгоритм или динамическое программирование?
9. Заключение.
10. Литература
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ГУМАНИТАРНЫЙ
ФАКУЛЬТЕТ
Реферат на тему:
«Методы
разработки алгоритмов.
«Жадные» алгоритмы.»
Студента 2 курса
Специальность «Информатика»
Ющенко
Артёма
2010г
Содержание.
Методы разработки
алгоритмов
Составление алгоритмов решения задач - это работа творческая. Нет универсального способа, позволяющего без особого труда составлять любые алгоритмы. К сожалению, такого способа не существует, ведь жизненные ситуации и задачи так разнообразны и непредсказуемы! Если бы дело обстояло иначе, появилась бы реальная возможность автоматизировать сам процесс алгоритмизации, поручив его некоторому исполнителю - вероятно, очень высокоинтеллектуальному компьютеру.
Тем не менее, некоторые рекомендации, касающиеся методики разработки алгоритмов, можно дать.
При решении
простых задач можно
В большинстве случаев та или иная задача может быть решена несколькими численными методами. Выбор конкретного численного метода решения задачи обычно производится по следующим критериям:
обеспечение оптимального времени решения задачи;
обеспечение оптимального
использования имеющихся
обеспечение требуемой точности вычислений;
минимальные стоимостные затраты;
возможность использования стандартных подпрограмм.
При дальнейшей постановке задачи на ПК отыскивается наиболее рациональный способ решения задачи.
Однако, алгоритмы становятся все более и более сложными, соответственно растет трудность понимания того, как они работают. А еще труднее обнаружить и исправить в них ошибки или внести какие-то изменения. От 50 до 100% времени программист тратит на исправление и модификацию программ. В связи с этим индустрия программирования предлагает более систематичные подходы к программированию (а тем самым и к алгоритмизации задач в общем), т.е. предлагает методики, использование которых уменьшает вероятность ошибок в программах, упрощает их понимание и облегчает модификацию.
Структурное программирование - одна из популярных методик. Фундаментом структурного программирования является доказанная Бемом и Джекопини теорема о структурировании [15]. Эта теорема устанавливает, что как бы сложна ни была задача, блок-схема соответствующей программы (читай - "соответствующего алгоритма") всегда может быть представлена с использованием весьма ограниченного числа элементарных управляющих структур (последовательность, ветвление, цикл).
Главная идея доказательства
этой теоремы состоит в
Цель структурного программирования - выбор структуры программы путем расчленения исходной задачи на подзадачи. Программы должны иметь простую структуру. Сложные, запутанные программы, как правило, являются неработоспособными, а их тестирование требует больших затрат.
Разработка алгоритма, являясь четким логичным процессом, упрощается на каждом уровне шаг за шагом. Затем в процессе задействуется следующий метод алгоритмизации - метод пошагового уточнения (совершенствования). Сначала задача рассматривается в целом, выделяются наиболее крупные ее части. Алгоритм, указывающий порядок выполнения этих частей, описывается в структурированной форме, не вдаваясь в мелкие детали. Затем от общей структуры переходят к описанию отдельных частей. Таким образом, разработка алгоритма состоит из последовательности шагов в направлении уточнения алгоритма.
Дальнейшим развитием, расширением структурного программирования является модульное программирование, идея которого состоит в том, что алгоритм может быть представлен в виде системы, совокупности отдельных модулей. Каждый модуль рассматривается как самостоятельная, относительно независимая программа, которая может содержать набор данных и функций, доступных только из этого модуля.
Модульное программирование позволяет значительно ускорить процесс засчет привлечения к работе нескольких специалистов сразу, доверив каждому разработку отдельного модуля. Кроме того, модульное программирование предполагает возможность использования заранее разработанных стандартных программ (т.н. библиотек стандартных подпрограмм).
На этапе проектирования
алгоритма решения сложной
При нисходящем проектировании вначале проектируются функции управляющей программы - драйвера. Затем более подробно представляют каждую подзадачу и разрабатывают другие модули. При нисходящем проектировании на каждом шаге функционирование модуля описывается с помощью ссылок на последующие, более подробные шаги.
При восходящем проектировании вначале проектируют программы низшего уровня, иногда в виде самостоятельных подпрограмм. Затем на каждом шаге разрабатываются модули более высокого уровня.
Существует также
несколько общих
Жадные алгоритмы
Для
многих оптимизационных задач есть более
простые и быстрые алгоритмы, чем динамическое
программирование. В этой главе мы рассматриваем
задачи, которые можно решать с помощью
жадных алгоритмов (greedy algorithms). Такой алгоритм
делает на каждом шаге локально оптимальный
выбор, - в надежде, что итоговое решение
также окажется оптимальным. Это не всегда
так – но для многих задач такие алгоритмы
действительно дают оптимум. Наш первый
пример – простая, но не вполне тривиальная
задача о выборе заявок . Далее мы обсуждаем,
для каких задач годятся жадные алгоритмы.
Задача о выборе заявок
Пусть даны n заявок на проведение занятий в одной и той же аудитории. Два разных занятия не могут перекрываться по времени. В каждой заявке указаны начало и коней занятия (si и fi для i-й заявки). Разные заявки могут пересекаться, и тогда можно удовлетворить только одну из них. Мы отождествляем каждую заявку с промежутком [si , fi), так что конец одного занятия может совпадать с началом другого, и это не считается пересечением.
Формально говоря, заявки с номерами i и j совместны (compatible), если интервалы [si , fi) и [sj,fj) не пересекаются (иными словами, если
fi £ sj или fj £ si). Задача о выборе заявок ( activity-selection problem) состоит в том, чтобы набрать максимальное количество совместных друг с другом заявок.
Жадный алгоритм работает следующим образом. Мы предполагаем, что заявки упорядочены в порядке возрастания времени окончания:
Если
это не так, то можно
Тогда алгоритм выглядит так (f и s – массивы):
Greedy-Activity- Selector (s, f)
1 n ¬ length [s]
2 A ¬ {1}
3 j ¬ 1
4 for i ¬ 2 to n
do if si ³ fj
then A ¬ A È{i}
j ¬ i
return A
Работа этого алгоритма показана на рис.1. Множество F состоит из номеров выбранных заявок, j – номер последней из них; при этом
поскольку заявки отсортированы по возрастанию времени окончания. Вначале А содержит заявку номер 1, и j=1 (строки 2-3). Далее ( цикл в строках 4-7) ищется заявка, начинающаяся не раньше окончания заявки номер j. Если таковая найдена, она включается в множество Ф и переменной j присваивается ее номер (строки 6-7).
Алгоритм
Greedy-Activity- Selector требует всего лишь q
(n) шагов ( не считая предварительной сортировки).
Как и подобает жадному алгоритму, на каждом
шаге он делает выбор так, чтобы остающееся
свободным время было максимально.
Правильность алгоритма
Не для всех задач жадный алгоритм дает оптимальное решение, но для нашей дает. Убедимся в этом.
Теорема 1. Алгоритм Greedy-Activity- Selector дает набор из наибольшего возможного количества совместных заявок.
Доказательство. Напомним, что заявки отсортированы по возрастанию времени окончания. Прежде всего докажем, что существует оптимальное решение задачи о выборе заявок, содержащее заявку номер1 (с самым ранним временем окончания). В самом деле, если в каком-то оптимальном множестве заявок заявка номер 1 не содержится, то можно заменить в нем заявку с самым ранним временем окончания не заявку номер 1, что не повредит совместности заявок ( ибо заявка номер 1 кончается еще раньше, чем прежняя, и не с чем пересечься не может) и не изменит их общего количества. Стало быть, можно искать оптимальное решение, начинающееся с жадного выбора.
После
того, как мы договорились
Когда применим жадный алгоритм?
Как узнать,
даст ли жадный алгоритм оптимум применительно
к данной задаче? Общих рецептов тут нет,
но существует две особенности, характерные
для задач, решаемых жадными алгоритмами.
Это принцип жадного выбора и свойство
оптимальности для подзадач.
Принцип жадного выбора
Говорят,
что к оптимизационной задаче
применим принцип жадного
Как доказать,
что жадный алгоритм дает
Информация о работе Методы разработки алгоритмов. «Жадные» алгоритмы