- •А. К. Синицын, а. А. Навроцкий
- •Содержание
- •1.2. Порядок выполнения работы
- •1.2.1. Пример решения задачи
- •Interface
- •Implementation
- •1.3 Варианты задач
- •Тема 2. Программирование перебора вариантов с использованием деревьев решений
- •2.1. Задача оптимального выбора и дерево решений
- •2.2. Рекурсивная процедура метода ветвей и границ
- •2.3 Эвристические методы
- •2.3.1 Метод максимальной стоимости
- •2.5. Варианты задач
- •Тема 3. Поиск и сортировка массивов
- •3.1 Организация работы с базами данных
- •3.2 Поиск в массиве записей
- •3.2.1 Линейный поиск
- •3.2.2 Поиск делением пополам
- •3.3. Сортировка массивов
- •3.4 Порядок выполнения работы
- •3.4.1 Пример фрагмента программы
- •Interface
- •Implementation
- •3.5. Индивидуальные задания
- •Тема 4. Работа со списками на основе динамических массивов
- •4.1. Работа со списками
- •4.2 Порядок выполнения работы
- •Interface
- •Implementation
- •4.3. Индивидуальные задания
- •Тема 5 организация однонаправленного списка на основе рекурсивных типов данных в виде стека
- •5.1. Основные понятия и определения
- •5.2 Порядок выполнения работы
- •Interface
- •Implementation
- •5.3 Индивидуальные задания
- •Тема 6. Организация однонаправленного и двунаправленного списков в виде очереди на основе рекурсивных данных
- •6.1. Основные понятия и определения
- •6.2 Порядок выполнения работы
- •Interface
- •Implementation
- •6.3 Индивидуальные задания
- •Тема 7. Использование стека для программирования алгоритма вычисления алгебраических выражений
- •7.1. Задача вычисления арифметических выражений
- •7.2. Порядок написания программы
- •Interface
- •Implementation
- •7.3. Индивидуальные задания
- •Тема 8. Программирование с использованием деревьев на основе рекурсивных типов данных
- •8.1. Понятие древовидной структуры
- •8.2. КомпонентTTreeView
- •8.3. Бинарное дерево поиска
- •8.4. Порядок написания программы
- •Interface
- •Implementation
- •8.5. Индивидуальные задания
- •Тема 9. Программирование с использованием хеширования
- •9.1. Понятие хеширования
- •9.2. Порядок написания программы
- •9.2.1 Фрагмент программы
- •Interface
- •Implementation
- •9.3. Индивидуальные задания
- •Тема 10 Работа с разреженными матрицами
- •10.1. Где применяются разреженные матрицы
- •10.2. Порядок написания программы
- •10.2.1 Пример оформления класса со стандартным минимальным набором методов
- •Interface
- •Implementation
- •10.3. Индивидуальные задания
- •Литература
- •Основы алгоритмизации и программирования в среде delphi. Алгоритмы на структурах данных
- •220013, Минск, п. Бровки, 6
2.3.1 Метод максимальной стоимости
При каждом включении нового элемента в выборку выбирается элемент, имеющий максимальную цену, до тех пор, пока суммарный вес менее Wmax.
Решается задача очень просто, без всяких рекурсий, особенно если массив элементов вначале отсортировать по стоимости c.
2.3.2 Метод наименьшего веса
Эта стратегия в некотором смысле противоположна предыдущей.
На каждом шаге выбирается элемент с минимальным весом. В этом случае мы сформируем выборку с максимальным количеством элементов.
2.3.3 Метод сбалансированной стоимости
Эта эвристика состоит в том, что при включении очередного элемента в выборку сравнивается как стоимость, так и вес, а именно, элемент с самым большим отношением стоимости к весу.
2.3.4 Метод случайного поиска
Используя датчик случайных чисел, алгоритм выбирает очередной элемент случайным образом. Поиск осуществляется несколько раз. Данный метод дает удивительно хорошие результаты.
2.4 Порядок выполнения работы
Задание: Написать отдельный модуль, содержащий класс, в состав которого входят пять методов решения указанной задачи и необходимые свойства класса (property).составить программу решения задачи оптимального выбора различными методами.
2.4.1 Пример решения задачи
Листинг 2.1
UnitUPerebor;
Interface
Type
TElem=Record
c,w : Extended
end;
TZad2=class(TObject)
n : byte;
a : array[1..255] of TElem;
S,Sopt : set of byte;
Wmax,Cmax,oct1 : Extended;
Procedure VbrVG(i:byte; tw,oct:Extended);
ProcedureVbrPP(i:byte; tw,oct:Extended);
< Добавить сюда необходимые методы >
…
End;
Implementation
ProcedureTZad2.VbrVG;
begin
// Попытка включения
if tw+a[i].w<=Wmax then begin
Include(s,i);
if i<n then VbrVG(i+1,tw+a[i].w,oct)
else
if oct>Cmax then begin
Cmax:=oct;
Sopt:=S
end;
Exclude(S,i);
end;
//Попытка исключения
oct1:=oct-a[i].c;
if oct1>Cmax then
if i<n then VbrVG(i+1,tw,oct1)
else begin
Cmax:=oct1;
Sopt:=S
end;
End;// Конец процедуры VbrVG
Procedure TZad2.VbrPP;
var j:integer;
begin
Include(s,i);
tw:=tw+a[i].w;
oct:=oct+A[i].c;
if i<n then VbrPP(i+1,tw,oct)
else if (tw<=Wmax) and (oct>Cmax) then
begin Cmax:=oct; Sopt:=S;end;
Exclude(s,i);
tw:=tw-a[i].w;
oct:=oct-A[i].c;
if i<n then VbrPP(i+1,tw,oct)
else if (tw<=Wmax) and (oct>Cmax) then
begin Cmax:=oct; Sopt:=S;end;
End;
…
< Добавить сюда необходимые методы >
…
End. // Конец модуль UPerebor;
Unit unit1;
…
Uses UPerebor; // Подключение модуля UPerebor;
Var
zad2 : TZad2;
ocm : extended;
…
Procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='3';
Edit2.Text:='10';
StringGrid1.Cells[1,0]:='вес';
StringGrid1.Cells[2,0]:='цена';
for i:=1 to 10 do
StringGrid1.Cells[0,i]:=IntToStr(i);
for i:=1 to 3 do begin
StringGrid1.Cells[1,i]:=IntToStr(i*i);
StringGrid1.Cells[2,i]:=IntToStr(i+5);
end;
Memo1.Clear;
end;
Procedure TForm1.Button1Click(Sender: TObject);
Begin
Memo1.Clear;
zad2:=Tzad2.create;
With zad2 do begin
n:=strToInt(Edit1.Text); ocm:=0;
for i:=1 to n do begin
a[i].w:=StrToInt(StringGrid1.Cells[1,i]);
a[i].c:=StrToInt(StringGrid1.Cells[2,i]);
ocm:=ocm+a[i].c;
end;
Wmax:=StrToInt(Edit2.Text);
Cmax:=0; S:=[]; Sopt:=[];
VbrVG(1,0,ocm);
Memo1.Lines.Add('Оптимальный вариант');
Memo1.Lines.Add(' i w c');
for i:=1 to n do
if i in Sopt then
Memo1.Lines.Add(IntToStr(i)+' '+
FloatToStrF(a[i].w,ffFixed,8,3)+' '+
FloatToStrF (a[i].c,ffFixed,8,3));
Memo1.Lines.Add('Cmax='+
FloatToStrF (Cmax,ffFixed,8,3)+
' Wmax='+
FloatToStrF (Wmax,ffFixed,8,3));
End;
Zad2.Free;
end;
Панель диалога будет иметь вид, показанный на рис. 2.1.
Рис. 2.1.