
- •Теоретический раздел лекции Тема 1. Программирование с использованием рекурсии
- •1.1. Cтратегии решения задачи разбиением ее на подзадачи
- •1.2. Программирование рекуррентных соотношений
- •Var z:extended;
- •1.3. Условия окончания рекурсии
- •1.4. О целесообразности использования рекурсии
- •Var I,X,y,z:word;
- •1.5 Правила выбора программной реализации рекуррентных соотношений
- •Тема 2. Задачи перебора вариантов
- •2.1. Модель дерева решений
- •2.2. Задача оптимального выбора (задача о рюкзаке)
- •2.3. Метод полного перебора двоичного дерева
- •Var wt,ct:extended;
- •Var j,k:byte;
- •If k in s then begin
- •Var j:byte;
- •Var j:byte;
- •Var wt1,oct1:byte;
- •2.4. Метод ветвей и границ
- •Var n,I:byte;
- •Var wt1,oct1:Extended;
- •Include(s,I);
- •If I in Sopt then writeln(I,a[I].W,a[I].C);
- •2.5. Эвристические методы
- •Тема 3. Поиск и сортировка массивов записей
- •3.1. Применимость сортировки и поиска
- •3.2. Массив записей и поиск в нем
- •Var m:word;
- •3.3. Сортировки массивов
- •Var c: mas; I,j,k:word;
- •Var m:word;
- •Var I,j:Word;
- •Var I,j,l,r:Word; X:Tk; w:Tzp;
- •Тема 4. Связанные списки с использованием рекурсивных данных
- •4.1. Список, стек, очередь
- •4.2. Списки на основе динамических массивов
- •Inherited create;
- •Var turn:Tlist; с1,c2:Tinf;
- •4.3. Рекурсивные данные и однонаправленные списки
- •Inherited create;
- •Var stec,st1,turn,tr1:Tlist; inf:Tinf;
- •4.4. Начальное формирование, добавление и удаление элементов однонаправленного списка
- •4.5. Разновидности связанных списков
- •Inf:Tinf;
- •Тема 5. Поиск и сортировки на связанных линейных списках
- •5.1. Поиск в однонаправленных списках
- •5.2. Сортировка однонаправленных списков
- •1 3Var Inf:tInf;
- •Тема 6. Использование линейных связанных списков
- •6.1. Вычисления арифметических выражений
- •Var ch,ch1,ch2,chr:char;
- •I:byte;ch,ch1:char;
- •6.2. Сложение больших целых чисел
- •Var u,V,s,t:byte;
- •6.3. Работа с разреженными матрицами
- •Inf:Tinf;
- •Inf:tInf;
- •Var proot,p:Ptree;
- •Var bl:boolean;
- •7.2. Бинарное дерево поиска
- •7.3. Основные операции с бинарным деревом поиска
- •Inf:tInf;
- •Var d1:Tree; c:Tinf; k:Tkey;
- •Var bl:Boolean;
- •Var m:Word;
- •Var p:Ttree; m:Word;
- •Тема 8. Хеширование
- •8.1. Что такое хеширование
- •8.2. Схема хеширования
- •Interface
- •Inf:Tinf;
- •8.4. Другие способы хеширования
- •Практический раздел Указания по выбору варианта
- •Индивидуальные практические работы и контрольные работы
- •Индивидуальная практическая работа №1. Программирование с использованием рекурсии
- •1.1. Понятие рекурсии
- •1.2. Порядок выполнения работы
- •1.2.1. Пример решения задачи
- •Индивидуальная практическая работа №2. Организация однонаправленного списка на основе рекурсивных типов данных в виде стека
- •2.1. Основные понятия и определения
- •Inf:tInf; // информация
- •Контрольная работа №1. Программирование с использованием деревьев на основе рекурсивных типов данных
- •1.1. Понятие древовидной структуры
- •Inf:tInf;
- •1.2. Компонент tTreeView
- •1.3. Бинарное дерево поиска
- •Основные операции с двоичным деревом поиска
- •1.4. Порядок написания программы
- •Inf:tInf;
- •Inherited Free;
- •Var tr:Ttree;
- •1.5. Индивидуальные задания
- •Курсовая работа
- •Литература
If I in Sopt then writeln(I,a[I].W,a[I].C);
writeln(’maxC=’,maxC,’ Wmax=’,Wmax);
end;
В
процедуре VbrVG(i,wt,oct)
для более компактной реализации
суммирования веса и стоимости введены
дополнительно два формальных параметра
– wt
– суммарный вес текущей выборки
иoct
– общая ее
стоимость.
Вначале
,
т.е. максимальная стоимость всех
элементов. Затем при движении вдоль
выбираемого пути, по мере не включения
элементов изoct
вычитается их стоимость. Таким образом
oct
в каждом узле имеет смысл стоимости,
которую еще можно достичь,
двигаясь от данного узла до листа.
Критерием <приемлемо включение i-го элемента> является тот факт, что он подходит по весовым ограничениям, т.е:
tw+a[i].wWmax.
Если элемент не подходит по этому критерию, то попытки добавить еще один элемент в текущую выборку можно прекратить.
Когда же речь идет об исключении, то критерием <приемлемости, не включения> т.е. возможности продолжения построения текущей выборки без данного элемента, будет то, что после данного исключения общая стоимость текущей выборки oct будет не меньше полученной до этого стоимости Cmax оптимальной выборки находящейся в Sopt:
oct-a[i].c>Cmax.
Ведь если выполняется это неравенство, то продолжение поиска, хотя он и может дать некоторое решение, не приведет к более оптимальному решению, чем то, что уже было достигнуто. Следовательно, дальнейший поиск на текущем пути бесполезен.
Приведенная на листинге программа реализует метод ветвей и границ: схему поиска с возвратами, которая использует ограничения для отсечения неперспективных ветвей дерева поиска.
2.5. Эвристические методы
Мы уже видели, что для программирования поиска в дереве решений рекурсивные процедуры оказываются довольно эффективным средством.
Если, однако, дерево очень большое, например, если в задаче оптимального выбора N=100 дерево содержит >1020 узлов, то даже современный компьютер при неудачных отсечениях методом ветвей и границ будет решать эту задачу >1 млн. лет.
Для огромных деревьев остается единственный способ – использовать эвристический метод. Найденный эвристическим методом вариант может оказаться не наилучшим из возможных, но зачастую близким к нему. Эвристические методы позволяют исследовать практически любое дерево.
Приведем ряд эвристических методов решения задачи оптимального выбора.
Метод максимальной стоимости:
При каждом включении нового элемента в выборку выбирается элемент, имеющий максимальную цену, до тех пор, пока суммарный вес <Wmax.
Решается задача очень просто, без всяких рекурсий особенно если массив элементов вначале отсортировать по стоимости c.
Метод наименьшего веса:
Эта стратегия в некотором смысле противоположна предыдущей.
На каждом шаге выбирается элемент с минимальным весом. В этом случае мы сформируем выборку с максимальным количеством элементов.
Листинг 2.7
Procedure VbrMW(a:mas; wmax:extended;n:word;var S:set1);
Var mw:extended; i,k:word; //метод наименьшего веса
Function Imin():word;
Begin
mw:=Wmax;
for i:=1 to n do
if not(i in S) and (a[i].w<mw) then
begin mw:=a[i].w; Imin:=i end;
end; //Imin
Begin
i:=Imin; wt:=0; ct:=0; k:=1; S:=[];
while (k<=n) and (wt+a[i].w<=wmax) do
begin k:=k+1; S:=S+[i];
wt:=wt+a[i].w; ct:=ct+a[i].c;
i:=Imin;
end;
end;
Метод сбалансированной стоимости:
Эта эвристика состоит в том, что при включении очередного элемента в выборку сравнивается как стоимость так и вес, а именно, элемент с самым большим отношением стоимости к весу.
Метод случайного поиска:
Используя датчик случайных чисел алгоритм выбирает очередной элемент случайным образом. Поиск осуществляется несколько раз. Как ни странно, данный метод дает удивительно хорошие результаты.
Сравнение:
Различные эвристические методы ведут себя по разному в различных задачах. Рекомендуется попробовать решить задачу всеми вам известными эвристическими методами и выбрать наилучшее из полученных решений.
Следует отметить, что условия оптимальности в каждой задаче задаются по разному и не всегда так просто сформулировать условия отсечения перспективных ветвей в методе ветвей и границ. Более того, даже метод сбалансированной стоимости не всегда так просто реализовать. Часто приходится придумывать свои эвристики при решении очередной сложной задачи. Вот здесь уже начинается искусство программирования.