1. На темы:
1.Итерация или рекурсия.
2.Метод полного перебора.
3.Метод Greedy- жадный алгоритм.
4.Метод перебора с возвратом.
5.Метод динамического перебора.
6.Разделяй и властвуй.
7.Метод ветвей и границ.
2. 1.Итерация или рекурсия.
2.Метод полного перебора .
3.Метод Greedy- жадный алгоритм.
4.Метод перебора с возвратом.
5.Метод динамического перебора.
6.Разделяй и властвуй.
7.Метод ветвей и границ
3. Рекурсия - это такой способ организации
обработки данных, при котором программа
вызывает сама себя непосредственно, либо с
помощью других программ.
В программировании рекурсия — вызов
функции (процедуры) из неё же самой,
непосредственно (простая рекурсия) или
через другие функции (сложная рекурсия),
например, функция A вызывает функцию B, а
функция B — функцию A. Количество
вложенных вызовов функции или процедуры
называется глубиной рекурсии.
4. В основе рекурсивного вычислительного
процесса лежит рекурсивный цикл, который
реализуется через вызов рекурсивной
процедуры, причем каждая активация
рекурсивной процедуры эквивалентна одному
проходу итеративного цикла While.
Общая схема рекурсивного цикла:
Procedure Рекурсивный_Цикл (…);
begin
begin
< тело рекурсивного цикла; >
Рекурсивный_Цикл (…);
end;
end;
5. Итерация - способ организации обработки
данных, при котором определенные
действия повторяются многократно, не
приводя при этом к рекурсивным вызовам
программ.
Когда какое-то действие необходимо
повторить большое количество раз, в
программировании используются циклы.
В основе итеративного вычислительного
процесса лежит итеративный цикл While,
Repeat-Until, For. Наиболее общим является
цикл While:
While < условие цикла > do < тело цикла >;
6. Существует два важных положения,
известных в математике и в
программировании, определяющих
соотношение между итерацией и
рекурсией:
- Любой итеративный цикл может быть
заменен рекурсией.
- Рекурсия не всегда может быть заменена
итерацией.
7. Перед специалистами самых различных
областей часто встает задача нахождения
элемента конечного множества,
обладающего заданными свойствами (если
такой элемент существует). Эта задача в
принципе может быть решена с помощью
перебора. Есть мнение, что такая
принципиальная возможность имеет
только теоретическое значение, так как
трудоемкость перебора слишком велика.
Между тем, любой общий метод, в том
числе и метод перебора, может оказаться
как хорошим, так и плохим. Все зависит от
конкретной задачи и способов реализации.
При этом реализация данного метода очень
зависима от достижений вычислительной
техники, а она в свою очередь не перестает
делать всё большие и большие успехи.
8. В сущности, перебор - это решение задач, возникающих
из заданной, когда значение некоторого искомого
параметра фиксируется различным образом, и
производится выбор того из рассмотренных значений,
которое дает наиболее подходящее решение. Часто
каждая из рассматриваемых задач с фиксированным
значением данного параметра в свою очередь решается
переборными методами. Тогда говорят о
многоуровневом или иерархически устроенном
алгоритме. Основываясь на столь общем определении
перебора, можно дать лишь тривиальные рекомендации
о способах его выполнения (однако, и они иногда
полезны). К счастью, рассматриваемые задачи, кроме
возможности их решения методами перебора, обычно
имеют и другие характерные общие особенности. Это
позволяет создавать, изучать и применять общие
методы перебора.
9. Основная задача при реализации переборных
методов заключается в нахождении такого
порядка элементов перебора, при котором
искомый элемент встретится как можно
раньше. Это задача сокращения перебора.
Существуют и другие проблемы, связанные с
этим методом, например, проблема
оптимизации генерации элементов перебора.
10. Один из способов сокращения перебора тогда -
это отсечение бесперспективных ветвей. При
этом реально никакого отсечения может и не
происходить. Если, скажем, осуществлять
обход дерева вглубь, выбирая ветви слева на
право, то отсечение ветви - это такое
изображение дерева, при котором отсекаемая
ветвь окажется самой правой. Если же обход
некоторой ветви не осуществляется совсем,
то только в случае, когда формально
доказывается отсутствие на ней решения. В
связи с этим метод перебора часто называют
методом полного перебора.
11. К алгоритмам полного перебора обращаются
тогда, когда нет других способов решить
определенную задачу. Например, никому в голову не
придет решать квадратное уравнение перебором
всех возможных значений, даже если известно, что
решением являются целые числа.
Полный перебор – это решение “в лоб”,
построенное на подстановке и проверке
всех возможных вариантов из области
допустимых значений. На словах в
решении задачи полного перебора нет
ничего сложного, но на деле алгоритмы, которые
действительно ищут и находят решения подобным
способом за “приемлемое время” довольно таки
непростые.
12. Многие задачи на графах также
решать с помощью полного перебора, хотя для
их решения придуманы специальные методики
– оптимальные с точки зрения количества
операций алгоритмы, которые осуществляют
поиск решений на порядки быстрее, чем
обычный полный перебор. К таким задачам
относят поиск кратчайшего маршрута
между вершинами (алгоритм Дейкстры) или
поиск максимального пропускного потока в
графе. Если обобщить все вышесказанное, то
для решения некоторой задачи методом
полного перебора нужно разработать
алгоритм перебора всех возможных
кандидатов на решение и реализовать
процедуру проверки корректности решения для
каждого из них.
13. Вычислительная сложность алгоритмов
полного перебора оценивается по
следующей обобщенной формуле:
O(N!/(N-R)!)
, где N – количество элементов в области
поиска решений, а R – количество
элементов, образующих одно целое
решение задачи.
14. Алгоритмы полного перебора довольно часто реализуют с помощью
рекурсии: на каждом шаге рекурсии осуществляют поиск части
решения для одного элемента, и, найдя его, рекурсивно запускают
тот же поиск для следующего элемента. Если для текущего
элемента решение найти не удается, то осуществляется переход к
предыдущему элементу (возврат из рекурсии на один шаг), где
найденное решение отменяется и начинается поиск
другого варианта.
Как только найдены решения для всех элементов – найдено все
решение. Дальше, алгоритм сохраняет вариант решения и
продолжает искать другие.
Цель предпринимаемой оптимизации - как можно скорее найти
хотя бы одно решение, а не все варианты заполнения кроссворда.
Таким образом, оптимизация рекурсивного алгоритма полного
перебора, направленная на минимизацию количества элементарных
операций.
15. Для многих оптимизационных задач есть более
простые и быстрые алгоритмы, чем динамическое
программирование. В этой главе мы рассматриваем
задачи, которые можно решать с помощью жадных
алгоритмов (greedy algorithms). Такой алгоритм
делает на каждом шаге локально оптимальный выбор,
- в надежде, что итоговое решение также окажется
оптимальным. Это не всегда так – но для многих
задач такие алгоритмы действительно дают
оптимум.
16. Принцип жадного выбора
Говорят, что к оптимизационной
задаче применим принцип жадного
выбора (greedy-choice property), если
последовательность локально
оптимальных (жадных) выборов
дает глобально оптимальное
решение. Различие между жадными
алгоритмами и динамическим
программированием можно
пояснить так: на каждом шаге
жадный алгоритм берет "самый
жирный кусок", а потом уже
пытается сделать наилучший
выбор среди оставшихся, каковы бы
они ни были; алгоритм
динамического программирования
принимает решение, просчитав
заранее последствия для всех
вариантов.
Оптимальность для подзадач
Говоря иными словами,
решаемые с помощью жадных
алгоритмов задачи обладают
свойством оптимальности для
подзадач (have optimal
substructure): оптимальное
решение всей задачи содержит в
себе оптимальные решения
подзадач.
17. Классический пример
применения жадины: Васе
выгодно делать самые «дорогие
задания», а наименее дорогие
можно и не выполнять — тогда
прибыль будет максимальна.
Возникает вопрос: каким
образом распределить задания?
Будем перебирать задания в
порядке убывания стоимости и
заполнять расписание
следующим образом: если для
заказа есть еще хотя бы одно
свободное место в расписании
раньше его дедлайна, то
поставим его на самое последнее
из таких мест, в противном
случае в срок мы его не можем
выполнить, значит поставим в
конец из свободных мест.
Получается следующий код:
//tasks - массив заданий
Arrays.sort(tasks); //сортируем по убыванию
стоимости
TreeSet<Integer> time
= new TreeSet<Integer>();
for (int i = 1; i <= n; ++i) {
time.add(i);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
Integer tmp = time.floor(tasks[i].time);
if (tmp == null) { // если нет свободного
места в расписании, то в конец
time.remove(time.last());
} else { //иначе можно выполнить задание,
добавляем в расписание
time.remove(tmp);
ans += tasks[i].cost;
}
}
18. Жадные алгоритмы – это общее название подхода к решению задач
оптимизации. Они применимы в случаях, когда исходную задачу
можно разбить на ряд более простых подзадач, которые можно
решать в определенной последовательности, чтобы в результате
получить
решение исходной задачи. Решив подзадачу мы уже
не возвращаемся к ней. Жадный подход далеко не
всегда дает
Оптимальное решение, но
во многих
случаях получаемое решение
оказывается достаточно
близкимк оптимальному, а для
некоторых задач известны
и оптимальные жадные
алгоримы (построение
оптимального префиксного
кода по Хаффману, построение
остовного дерева максимального
веса, планирование вычислений на процессоре с минимизацией
ожидания и другие).
19. Основными достоинствами жадных алгоритмов
является их простота и нетребовательность к
ресурсам.
Жадные (градиентные) алгоритмы, действуют по
принципу "максимальный выигрыш на каждом
шаге". Такая стратегия не всегда ведет к
конечному успеху - иногда выгоднее сделать не
наилучший, казалось бы, выбор на очередном шаге с
тем, чтобы в итоге получить оптимальное
решение.
Но тем не менее, существует большое количество
задач, для которых применение жадных
алгоритмов оказывается оправданным.
20. Метод полного перебора предполагает, что
решение рассматриваемой задачи может быть
найдено путем последовательного анализа
элементов Si, принадлежащий конечному
множеству S={S1,S2,S3…Sn},называемому
множеством возможных решений.
В простейших случаях, элементы Si могут
быть представлены значениями какого-нибудь
порядкового типа:integer, boolean, char,
перечисления и интервального. В более
сложных задачах используются массивы,
записи(record) или множества.
21. Общая схема алгоритма, основанного на
методе полного перебора, может быть
представлена с помощью цикла:
For i:=1 to k do
if SolutiePosibila(Si) then PrelucrareaSolutiei(Si)
Где SolutiePosibila-это логическая функция,
возвращающая значение true, если элемент
удовлетворяет условиям задачи, и false-в
противном случае, а PrelucrareaSolutiei-
процедура, осуществляющая обработку
выбранного элемента.
22. Такие алгоритмы реализуют операции,
связанные с обработкой конечных множеств:
-объединение
-пересечение
-разность
-генерирование всевозможных подмножеств
-генерирование элементов декартова
произведения множеств
- генерирование всевозможных перестановок,
размещений или сочетаний элементов и т.д.
23. Метод динамического
программирования является модификацией
метода простого перебора. В этом методе для
сокращения числа вариантов при переборе
вводится понятие доминирующая
последовательность – подмножество
вариантов, перспективных
с точки зрения поиска
оптимального решения.
24. Вначале найдём длину наибольшей
подпоследовательности. Допустим,
мы ищем решение для случая (n1, n2),
где n1, n2 — длины первой и второй
строк.
Пусть уже существуют решения для
всех
подзадач (m1, m2), меньших заданной.
Тогда задача (n1, n2) сводится к
меньшим подзадачам следующим
образом:
A B C B
0 0 0 0 0
D
0
←
0
←
0
←
0
←
0
C
0
←
0
←
0
↖
1
←
1
B
0
←
0
↖
1
←
1
↖
2
A
0
↖
1
←
1
←
1
↑
2
25. В основу метода динамического программирования
положен принцип оптимальности,
сформулированный в 1957 г. американским
математиком Ричардом Беллманом: «Оптимальное
поведение обладает тем свойством, что каковы бы
ни были первоначальные состояние и решение в
начальный момент времени, последующие решения
должны составлять оптимальное поведение
относительно состояния, получающегося в
результате первого решения».
Физическая сущность принципа оптимальности
заключается в том, что ошибка выбора решения в
данный момент не может быть исправлена в
будущем.
Рассматривается следующая общая задача.
Имеется некоторая физическая система, в которой
происходит какой-то процесс, состоящий
из n шагов. Эффективность процесса
характеризуется некоторым показателем W,
который называют выигрышем. Пусть общий
выигрыш W за все n шагов процесса складывается из
выигрышей на отдельных шагах:
где wi — выигрыш на i-м шаге.
Если W обладает таким свойством, то
его называют аддитивным критерием.
26. Процесс, о котором идет речь, представляет собой
управляемый процесс, т.е. имеется возможность
выбирать какие-то параметры, влияющие на его ход и
исход, причем на каждом шаге выбирается какое-то
решение, от которого зависит выигрыш на данном
шаге. Это решение называется шаговым
управлением. Совокупность всех шаговых управлений
представляет собой управление процессом в целом.
Обозначим его буквой U, а шаговые управления —
буквами
Таким образом:
Шаговые управления в общем случае не числа, а, как правило,
векторы, функции и т.п.
28. Метод”разделяй и властвуй” представляет собой
обобщенный подход к разработке алгоритмов ,
основанный на:
1)повторяющемся разделении решаемой задачи большого
размера на две или более подзадачи такого же типа, но
меньшего размера
2)решении полученных подзадач прямым способом , если их
размеры это позволяют, или их разделении на другие
подзадачи еще меньшего размера
3)Обработке частичных решений соответствующих
подзадач с целью получения решения исходной задачи.
29. Предположим, что на определенном шаге
алгоритма вычислено упорядоченное
множество:
А=(ai, ai+1, …, aj)
Но для получения решения необходима дальнейшая
обработка его элементов. Для того чтобы
разделить задачу на две близкие по размерам
подзадачи , положим
m=(j-i) div 2
И разделим множество А на два подмножества,
которые будут обработаны по отдельности:
A1=(ai, ai+1,…,ai+m);A2=(ai+m+1,…,aj)
Далее каждое из множеств А1 и А2 снова делится
на два подмножества А1-1, А1-2 и А2-1, А2-2
соответственно.
30. Общая схема алгоритма может быть
представлена с помощью следующей
рекурсивной процедуры:
Procedure DesparteSiStapineste(i, j: integer; var x:tip);
var m: integer;
x1,x2: tip;
procedure DesparteSiStapineste(I, j: integer; var x:tip );
var m: integer;
x1,x2: tip;
begin
if SolutieDirecta(I, j) then Prelucrare(I, j, x)
else
begin
m:= (j-i) div 2;
DesparteSiStapineste(i, i+m, x1);
DesparteSiStapineste(i+m +1, j, x2);
Combina(x1, x2, x);
end;
end.
31. Методы этого типа широко используются
для решения дискретных оптимизационных
задач. Различные варианты
метода существенно используют специфику
задачи и поэтому заметно отличаются друг
от друга. Однако, все они основаны на
последовательном разбиении множества
допустимых решений на части (ветвление) и
вычислении оценок (границ), позволяющих
отбрасывать подмножества, заведомо не
содержащие оптимального решений.
32. В методе ветвей и границ поиск решения задачи
осуществляется путем прохода некоторого
дерева порядка m, именуемого деревом
решений. Узлы этого дерева представляют
множество возможных состояний
S={s1,s2,…,sn}, в которых может находиться
изучаемая система. На дереве решений связи Si-
Sj типа предок-потомок указывают на то, что
из состояния si система может
непосредственно перейти в состояние sj в
результате относительно простых
преобразований или операций .
33. В других случаях решение задачи
может быть представлено как
путь , связывающий корень дерева с
одним из терминальных узлов и
оптимизирующий определенный
критерий качества , например, кол-
во ходов в шахматной партии,
общее расстояние, которое проехал
автомобиль, суммарное время
чтения-записи файла и т.д.
34. Формально задачи рассматриваемого типа
могут быть решены методом полного
перебора , для чего выполняются следующие
операции:
-обходим дерево решений в глубину или в
ширину и находим конечные состояния
системы
-строим множество всех возможных путей ,
соединяющих начальное состояние с
конечными состояниями
-из множества полученных путей выбираем
те, которые оптимизируют заданный
критерий качества
35. Схема вычислений метода ветвей и границ
может быть изображена следующей
последовательностью операторов ПАСКАЛЯ:
InitializareaListei;
repeat
Ramifica;
Margineste;
until Gasit or ListaEsteVida
36. Метод ветвей и границ может быть применен
для решения тех задач, из условия которых
следуют правила или операции , необходимые
для непосредственного построения дерева
решений. Обычно в таких задачах
моделируется поведение воображаемого
партнера, цели или намерения которого
противоположным вашим: военные игры,
сценарии экономического развития ,игра в
шахматы или шашки и т.д.