- •СОДЕРЖАНИЕ
- •ТЕМА 1. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ РЕКУРСИИ
- •1.1. Понятие рекурсии
- •1.2. Порядок выполнения работы
- •1.2.1. Пример решения задачи
- •1.3. Варианты задач
- •ТЕМА 2. ПРОГРАММИРОВАНИЕ ПЕРЕБОРА ВАРИАНТОВ С ИСПОЛЬЗОВАНИЕМ ДЕРЕВЬЕВ РЕШЕНИЙ
- •2.1. Задача оптимального выбора и дерево решений
- •2.2. Рекурсивная процедура метода ветвей и границ
- •2.3. Эвристические методы
- •2.3.1. Метод максимальной стоимости
- •2.3.2. Метод наименьшего веса
- •2.3.3. Метод сбалансированной стоимости
- •2.3.4. Метод случайного поиска
- •2.4 Порядок выполнения работы
- •2.4.1 Пример решения задачи
- •2.5. Варианты задач
- •ТЕМА 3. ПОИСК И СОРТИРОВКА МАССИВОВ
- •3.1. Организация работы с базами данных
- •3.2. Поиск в массиве записей
- •3.2.1. Линейный поиск
- •3.2.2. Поиск делением пополам
- •3.3. Сортировка массивов
- •3.4. Порядок выполнения работы
- •3.4.1. Пример фрагмента программы
- •3.5. Индивидуальные задания
- •ТЕМА 4. РАБОТА СО СПИСКАМИ НА ОСНОВЕ ДИНАМИЧЕСКИХ МАССИВОВ
- •4.1. Работа со списками
- •4.2. Порядок выполнения работы
- •4.3. Индивидуальные задания
- •ТЕМА 5. ОРГАНИЗАЦИЯ ОДНОНАПРАВЛЕННОГО СПИСКА НА ОСНОВЕ РЕКУРСИВНЫХ ТИПОВ ДАННЫХ В ВИДЕ СТЕКА
- •5.1. Основные понятия и определения
- •5.2. Порядок выполнения работы
- •5.3. Индивидуальные задания
- •6.1. Основные понятия и определения
- •6.2. Порядок выполнения работы
- •6.3. Индивидуальные задания
- •ТЕМА 7. ИСПОЛЬЗОВАНИЕ СТЕКА ДЛЯ ПРОГРАММИРОВАНИЯ АЛГОРИТМА ВЫЧИСЛЕНИЯ АЛГЕБРАИЧЕСКИХ ВЫРАЖЕНИЙ
- •7.1. Задача вычисления арифметических выражений
- •7.2. Порядок написания программы
- •7.3. Индивидуальные задания
- •ТЕМА 8. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ДЕРЕВЬЕВ НА ОСНОВЕ РЕКУРСИВНЫХ ТИПОВ ДАННЫХ
- •8.1. Понятие древовидной структуры
- •8.2. Компонент TTreeView
- •8.3. Бинарное дерево поиска
- •8.4. Порядок написания программы
- •8.5. Индивидуальные задания
- •ТЕМА 9. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ ХЕШИРОВАНИЯ
- •9.1. Понятие хеширования
- •9.2. Порядок написания программы
- •9.2.1. Фрагмент программы
- •9.3. Индивидуальные задания
- •ТЕМА 10. РАБОТА С РАЗРЕЖЕННЫМИ МАТРИЦАМИ
- •10.1. Где применяются разреженные матрицы
- •10.2. Порядок написания программы
- •10.2.1. Пример оформления класса со стандартным минимальным набором методов
- •Type
- •Implementation
- •10.3. Индивидуальные задания
- •ЛИТЕРАТУРА
2.3.4. Метод случайного поиска
Используя датчик случайных чисел, алгоритм выбирает очередной элемент случайным образом. Поиск осуществляется несколько раз. Данный метод дает удивительно хорошие результаты.
2.4 Порядок выполнения работы
Задание: Написать отдельный модуль, содержащий класс, в состав которого входят пять методов решения указанной задачи и необходимые свойства класса (property). Составить программу решения задачи оптимального выбора различными методами.
2.4.1 Пример решения задачи
Листинг 2.1
Unit UPerebor;
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, wt, ct: Extended; Procedure VbrPP(i:byte);
Procedure VbrVG(i:byte; tw,oct:Extended);
< Добавить сюда необходимые методы >
…
End;
Implementation
Procedure Tzad2.VbrPP(i:byte); var j:byte;
begin
for j:=0 to 1 do begin
if j=0 then begin wt:=wt+a[i].w; ct:=ct+a[i].c;
|
Include(s,i) |
end |
else begin wt:=wt-a[i].w; ct:=ct-a[i].c; |
||
if i<n then |
Exclude(S,i); |
end; |
VbrPPj(i+1) |
|
else if (wt<=Wmax) and (ct>Cmax) then begin Cmax:=ct;Sm:=S; end;
end;//j
end;
11
Procedure TZad2.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
…
< Добавить сюда необходимые методы >
…
End. // Конец модуля UPerebor;
Unit unit1;
…
Uses UPerebor; // Подключение модуля UPerebor;
Var |
: TZad2; |
zad2 |
|
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
12
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.
13