
- •Теоретический раздел лекции Тема 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. Индивидуальные задания
- •Курсовая работа
- •Литература
Var wt1,oct1:byte;
begin
wt1:=wt+a[i].w;
Include(s,i); ip:=ip+1;
if i<n then VbrPP4(i+1,wt1,oct)
else if (wt1<=Wmax) and (oct>Cmax) then
begin Cmax:=oct;Sm:=S; end;
Exclude(S,i); im:=im+1;
oct1:=oct-a[i].c;
if i<n then VbrPP4(i+1,wt,oct1)
else if (wt<=Wmax) and (oct1>Cmax) then
begin Cmax:=oct1;Sm:=S; end;
End;
Вызов процедуры VbrPP4(1,0,c1+c2+…cn)
В результате, здесь суммируется только текущий вес и вычитается только общая стоимость.
В таком виде процедура удобна для организации отсечения заведомо неоптимальных ветвей дерева.
Полный перебор используется редко, так как для больших деревьев он требует слишком больших затрат времени компьютера.
2.4. Метод ветвей и границ
Для работы с большими деревьями используют метод ветвей и границ. Идея этого метода в том, что на каждом шаге решения делается оценка целесообразности дальнейшего спуска по той или иной ветви и прекращение (отсечение) просмотра по пути заведомо не оптимальному. Такое отсечение позволяет значительно уменьшить количество просматриваемых вариантов.
Стратегия отсечения заведомо неприемлемых и неоптимальных решений позволяет резко сократить количество просматриваемых вариантов. При рассмотрении каждого элемента (кандидата на включение) возможны два заключения: включать или не включать элемент в текущую выборку. В общем случае условия приемлемости включения и не включения кандидата в выборку различны. Поэтому цикл по j в Листинге 2.2 удобнее расписать в явном виде. В результате получим следующую рекурсивную процедуру, реализующую стратегию метода ветвей и границ:
Procedure VbrVG0(i:Index); Листинг 2.6
begin
if < приемлемо включение i-го элемента > then
begin
<включаем i-й элемент в выборку>;
if i<n then VbrVG0(i+1)
else <проверка оптимальности>;
<исключение i-го элемента из выборки>;
end;
if <приемлемо не включение i-го элемента > then
if i<n then Vbr(i+1)
else <проверка оптимальности>;
end;//VbrVG0
С помощью приведенной рекурсивной процедуры VbrVG0 описывается процесс исследования на пригодность очередного i-го элемента к включению или невключению в выборку и генерацию всех допустимых выборок с проверкой на оптимальность.
Ниже приведен листинг 2.6 программы, реализующей решение задачи оптимального выбора методом ветвей и границ:
Type Листинг 2.7
Telem=Record c,w:Extended end;
Var n,I:byte;
a:array[1..255] of Telem;
S,Sopt:Set of byte;
Wmax,Cmax:Extended;
//рекурсивная процедура выбора
Procedure VbrVG(i:byte;wt,oct:Extended);
Var wt1,oct1:Extended;
begin
//Попытка включения:
wt1:=wt+a[i].w;
if wt1<=Wmax then
begin
Include(s,I);
if i<n then VbrVG(i+1,wt1,oct)
else
if oct>maxC then begin Cmax:=oct;Sopt:=S end;
Exclude(S,i);
end;
//Попытка исключения:
oct1:=oct-a[i].c;
if oct1>Cmax then
if i<n then Vbr(i+1,wt,oct1)
else begin Cmax:=oct1; Sopt:=S end;
End;//VbrVG
begin oct:=0; readln(n);
for i:=1 to n do begin //ввод массива элементов
readln(a[i].w,a[i].c); oct:=oct+a[i].c end;
readln(Wmax); //ввод ограничения по весу
Cmax:=0; S:=[]; Sopt:=[];
Vbr(1,0,oct);
for i:=1 to n do