Исследование алгоритмов поиска с возвращением

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    28,17 Кб
  • Опубликовано:
    2013-06-25
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Исследование алгоритмов поиска с возвращением














исследование алгоритмов поиска с возвращением

1.Анализ индивидуального задания

поиск возвращение программный алгоритм

          Итак, задача состоит в нахождении такого размещения компонент в ячейках, которое минимизирует общую длину использованного провода. Число ячеек на плате - п. Очевидно, что если число компонент k больше п , то решения не существует, а при k ≤ п , то k компонент всегда можно разместить в п ячейках. Эффективность вычислений при решении задачи зависит от характера расположения ячеек на плате. Если расположение ячеек симметричное, то можно предложить некоторые способы повышения эффективности вычислений, которые связаны с эквивалентностью решений. Чем больше осей симметрии имеет плата, тем больше существует эквивалентных решений и значит тем больше можно сократить время перебора. Эквивалентные решения можно найти и в случае ассиметричной схемы, если имеются компоненты с одинаковым числом соединений с другими компонентами. Пример такого решения рассмотрим на следующем рисунке(компонента обозначена парой чисел (l,m), где l - номер компоненты, а m - порядковый номер некоторого способа соединения компоненты с остальными компонентами):

















(1,3)








(1,3)






































(2,4)








(4,4)










(5,1)








(5,1)

































(3,2)








(3,2)










(4,4)








(2,4)

































Рисунок 1. Пример эквивалентного решения для задачи о платах

Так как компоненты с номерами 2 и 4 имеют одинаковый способ соединения с остальными компонентами, то обмен местами данных компонент не изменит стоимость общего решения, следовательно, расположения компонент представленное на рисунке 1 эквивалентны.

Очевидно, что для решения поставленной задачи можно применить метод поиска с возвращением, а точнее его разновидность метод ветвей и границ.

2.Формализация задачи

На данном этапе производится детальный анализ поставленной задачи с целью приспособления выбранного метода задачи решения к конкретной задаче, определение различных ограничений и специальных методов и приёмов повышения эффективности поиска. Рассмотрим задание на курсовую работу:

Имеются компоненты, которые нужно расположить в n ячейках на плате. Число соединений между парами компонент задается матрицей C, в которой C(i,j) - число связей между i-й и j-й компонентами. Расстояние между парами мест задается матрицей D, в которой D(k,l) - расстояние между k-й и l-й ячейками. Таким образом, в терминах общей длины использованного провода размещение i-й компоненты в k-й ячейке и j-й компоненты в l-й ячейке стоит C(i,j)D(k,l). В каждой ячейке можно поместить только одну компоненту, и каждая компонента может находиться только в одной ячейке. Найдите размещение компонент в ячейках, минимизирующее общую длину использованного провода.

Как видно из постановки задачи, задание на курсовую работу практически уже формализовано. С математической точки зрения необходимо минимизировать функцию стоимости F = C(i,j)D(k,l), где i¹j и i,jÎ K (множество K - множество компонент), k¹ l и k,l Î Y (множество Y - множество ячеек). Эта задача эквивалентна другой задаче: нужно найти такое множество двоек S = {p, q}, pÎ K, q Î Y’, Y’ ÍY, которое минимизирует F= C(i,j)D(k,l), и где двойки (i,k) и (j,l) принадлежат множеству S ( (i,k), (j,l) Î S).

.1 Структуры данных для представления объектов задачи

          В первую очередь необходимо определиться со структурами данных для представления множеств Ak, Sk, векторов решений и их элементов ak, а также с множеством производимых над ними операций, позволяющих добиться наибольшей эффективности вычислений.

          Решим вопрос о представлении вектора решений. Если m - это число компонент, которые нужно расположить в n ячейках на плате и m< n, то решение можно представить вектором (а1,…,а m), в котором аi - есть двойка чисел (j,l), где j - номер компоненты, а l - номер ячейки, в которой располагается данная компонента. Очевидно, что при заданном числе компонент m все решения имеет одну и ту же длину m. Множества значений элементов вектора решений для i-ой компоненты имеют вид Аk = (i,1…, r ,… n). Аналогичную структуру имеют и множества кандидатов Sk для решения, за исключением одного отличия: допустим если S1 = (i,1…, r ,… n) и если r-ая ячейка, i-ая компонента уже выбраны, то S2 = (j,1… n).

.2 Анализ ограничений и усовершенствований. Аналитические и/или экспериментальные оценки

          Будем считать, что матрицы C(i,j) и D(k,l) задаются случайным образом и число способов соединения компонент с остальными компонентами достаточно велико.

Рассмотрим ограничения свойственные данной задаче: в каждой ячейке можно поместить только одну компоненту, и каждая компонента может находиться только в одной ячейке, следовательно, для любых двух элементов вектора решений, которые можно представить двойками чисел (i,k) и (j,l) i¹j, k¹ l. Так как эффективность вычислений при решении задачи зависит от характера расположения ячеек на плате, то для того, чтобы у нас были возможности для повышения эффективности и быстродействия вычислений, будем считать, что плата симметричная и конкретно имеет ровно одну ось симметрии. При этом ячейка с номером 1 симметрична ячейке с номером n, ячейка с номером 1 симметрична ячейке с номером n-1 и т.д.

Данное ограничение способствует тому, что у нас появляются эквивалентные решения, которые можно исключить для просмотра и тем самым увеличить быстродействие. Эквивалентные решения можно найти и в случае ассиметричной схемы, если имеются компоненты с одинаковым числом соединений с другими компонентами. Пример такого решения уже был рассмотрен в разделе №2. Рассмотрим данный способ нахождения эквивалентных решений. Пусть s - число способов соединения компонент с остальными компонентами, п - число ячеек на плате, т - число компонент (s достаточно велико по сравнению с т). Так как матрицы C(i,j) и D(k,l) задаются случайным образом, то определим вероятность того, что хотя бы две компоненты из т будут иметь одинаковые способы соединения с остальными компонентами.

p0 - вероятность того, что не будет ни одного совпадения способов соединения с остальными компонентами.

p1 - вероятность того, что будет одно совпадение способов соединения с остальными компонентами.

,

где  - вероятность того, что у двух компонент совпадут количества соединений к какому-нибудь третьему компоненту,

- вероятность того, что у двух рассматриваемых компонент совпадут количества соединений ко всем остальным компонентам.

          Так как p1 = 1 - p0, то окончательная формула имеет вид .

Даже для простой задачи, где число способов соединения компонент с остальными компонентами s = 5 и число компонент т = 10 такая вероятность примерно равна 0,0000046, то есть настолько мала, поиск таких эквивалентных решений только понизит быстродействие алгоритма. Следовательно, такие эквивалентные решения при дальнейшей разработке алгоритмов учитываться не будут.

          Если не использовать никаких усовершенствований, то дерево поиска для задачи размерностью т=4 и п=4 имеет около 1312 узлов. Использование ограничения, касающегося симметрии платы даёт оценку около 656 узлов.

Таблица 1. Оценки усовершенствований

Усовершенствование

Аналитическое выражение для оценки

Количество возможных решений для п = 4, т = 4

Нет никаких ограничений

-

1312 узлов (оценка экспериментальная)

Плата имеет одну ось симметрии

-

656 узлов (оценка экспериментальная)


.3 Разработка алгоритмов решения задачи (итерационный и рекурсивный варианты)

          Очевидно что, для решения поставленной задачи необходимо применить метод ветвей и границ. Этот метод является специальным типом поиска с ограничениями. Ограничения основываются на предположении, что каждое решение связано с определенной стоимостью, и что нужно найти оптимальное решение (решение с минимальной стоимостью).

          Для применения метода ветвей и границ стоимость должна быть четко определена для частичных решений. Кроме того, для всех частичных решений  и для всех расширений  должно выполнятся соотношение:

cost ≤ cost (1).

В нашем случае стоимость частичных решений уже определена в задании на курсовую работу: в терминах общей длины использованного провода размещение i-й компоненты в k-й ячейке и j-й компоненты в l-й ячейке стоит C(i,j)D(k,l), где C - матрица числа связей между компонентами, а D - матрица расстояний между ячейками. Если у нас имеется частичное решение ((i1,j1), (i2,j2),…,(im,jm)), в котором i1 компонента размещается в j1 ячейке и т.д., то его стоимость вычисляется по следующему алгоритму:

cost := 0;k :=2 to m dol:=1 to (k-1) do cost := cost + C(ik,il)*D(jk,jl)

Стоимость частичных решений рассматриваемой задачи также удовлетворяет требованию 1 (расположение новой компоненты в общем случае увеличивает стоимость частичного решения, решение минимум может не измениться если располагаемая компонента не имеет ни одной связи ни с одной из остальных компонент), поэтому для решения задачи может быть применен общий алгоритм метода ветвей и границ, который применительно к рассматриваемой задаче имеет вид

Алгоритм 1. Итерационный вариант решения задачи

         

Данный алгоритм очень похож на общий алгоритм метода ветвей и границ, но в нём всё же есть свои отличия, так как он применён для решения конкретной задачи. Например, на первом шаге в множество кандидатов S1 выбиралось всё множество А1, в нашем же алгоритме с учётом симметричности платы в множество S1 выбираются только те элементы А1, которые не являются симметричными друг к другу, т.е. множество . Это позволит нам не просматривать эквивалентные решения. Другое отличие алгоритма - вектор решения считается искомым решением, если k равно числу компонент. Это связано с тем, что все решения имеют фиксированную длину.

          Данный итерационный алгоритм можно преобразовать в рекурсивный; после преобразования он будет выглядеть следующим образом:

Алгоритм 2. Рекурсивный вариант решения задачи

3. Оценка асимптотической временной сложности алгоритма (метод Монте-Карло)

Вычисление по методу Монте-Карло можно использовать для оценки эффективности алгоритма поиска с возвращением путём сравнения его с эталоном, полученным для задачи с меньшей размерностью. В данной курсовой работе этот метод будет использован для исследования асимптотической временной сложности решения задачи в зависимости от количества ячеек п на плате.

Алгоритм Монте-Карло для исследования деревьев поиска методом ветвей и границ, который использовался в данной курсовой работе, имеет следующий вид:

Алгоритм 3. Исследование дерева поиска методом Монте-Карло

          Задание на курсовую работу включает исследование асимптотической временной сложности решения в зависимости от количества ячеек на плате. Данное исследование проведем в случае постоянного значении количества компонент и в случае, когда количество компонент изменяется пропорционально количеству ячеек.

          1). Количество компонент не изменяется.

Таблица 2. Исследование решения задачи при постоянном количестве компонент

Размер задачи (комп.*ячейки)

Метод Монте-Карло


Число узлов

Порядок роста

Число узлов

Время, млс

Порядок роста

4*4

-

-

1312

0

-

4*5

3775

в 2.8 раз

3800

16


4*6

6972

в 1.8 раз

6973

31

в 1.9 раз

4*7

15410

в 2.2 раз

17140

47

в 1.5 раз

4*8

29393

в 1.7 раз

29065

63

в 1.3 раз

4*9

41981

в 1.4 раз

39194

94

в 1.5 раз

4*10

53182

в 1.4 раз

53984

125

в 1.3 раз


          Из таблицы видно, что при увеличении размера задачи на единицу, время поиска фактически увеличивается в одно и тоже количество раз (примерно в 1,5 раз). Это означает, что даже при неизменном количестве компонент на плате мы получаем решение с экспонентациальной временной сложностью.

          Проведём аналогичное исследование для случая, когда количество компонент изменяется пропорционально количеству ячеек.

Таблица 3. Исследование решения задачи при изменяющемся количестве компонент

Размер задачи (комп.*ячейки)

Метод Монте-Карло

Фактически


Число узлов

Порядок роста

Число узлов

Время, млс

Порядок роста

4*4

-

-

1312

0

-

5*5

28618

в 21 раз

28877

125


6*6

1150623

1113570

6469

в 52 раза

7*7

57905113

в 52 раза

48841193

381109

в 59 раз

8*8

1558443648

в 32 раза




9*9






10*10







Из таблицы 3 видно, что во втором случае, когда количество компонент изменяется пропорционально количеству ячеек, при увеличении размера задачи на единицу, время поиска увеличивается не в полтора раза, как в первом случае, а примерно в 40-50 раз. При размерности задачи 7*7 фактическое время вычислений составляет примерно 6,5 минут, фактическое число исследованных узлов - 48841193. Зная это, можно предположить примерное время поиска решения задачи размерностью 8*8: так как количество узлов в дереве поиска найденное методом Монте-Карло для задачи данной размерности составляет 1558443648 узлов, т.е. в 32 раза больше, чем для задачи размерностью 7*7, то ожидаемое время поиска будет больше примерно в столько же раз и составит около 3,5 часов.

         

4. Программная реализация алгоритмов

.1 Реализация данных

          Для начала определимся с представлением ak - k-го элемента вектора решения. В пункте 3 (формализация задачи) условились, что аk есть двойка чисел (j,l), где j - номер компоненты, а l - номер ячейки, в которой располагается данная компонента. Логичнее всего данный элемент представить как запись с двумя полями целочисленного типа, в котором одно поле есть номер компоненты, а другой - номер ячейки, в которую помещается данная компонента:

TElement = record

          i,j : byte;;

Вектор решения будет представлен соответственно линейным массивом данных записей, а множество кандидатов в решение Sk представим прямоугольным массивом переменных булевского типа. В последнем случае в массиве на пересечении i-ой строки и j-го столбца будет находиться значение TRUE если двойка (i, j) входит в множество кандидатов в решение, и FALSE в противном случае. Множество Sk будет считаться пустым, если на пересечении всех строк и всех столбцов будут находиться значения FALSE.

.2 Реализация алгоритмов

          Программная реализация алгоритма метода ветвей и границ включает реализацию таких важных моментов алгоритма как

1)       Проверка множества кандидатов в решение Sk на пустоту

2)       Выбор элемента ak из множества Sk в качестве следующего элемента вектора решения

)         Удаление элемента ak из множества Sk

)         Определение стоимости частичного решения

)         Определение следующего множества Sk

. Проверка множества кандидатов в решение Sk на пустоту. Осуществляется следующим образом: в массиве множества кандидатов последовательно проверяется каждый элемент до тех пор, пока не будет найден первый элемент со значением TRUE. Если такой элемент не найден, то множество кандидатов в решение пусто.

. Выбор элемента ak из множества Sk в качестве следующего элемента вектора решения. Осуществляется таким же образом, как и пункт 1, но номер строки элемента со значением TRUE записывается в поле i элемента вектора решения, а номер строки в поле j.

. Удаление элемента ak из множества Sk : в массиве Sk элемент стоящий на пересечении соответствующей строки столбца принимает значение FALSE.

. Определение стоимости частичного решения. Пуст А - переменная типа TElement, параметр k - длина вектора решения, то стоимость частичного решения вычисляется следующей функцией:

functuion SolCost(k : byte):word;i,j : byte;: word;:= 0;i:=2 to k doj:=1 to (i-1) do begin:= cost + (C[A[i].j][A[j].j]*D[A[i].i][A[j].i]);

end;:= cost;;

. Определение следующего множества Sk. Для того чтобы определить следующее множества Sk, т.е. для того чтобы, найти следующий массив надо просмотреть все предыдущие массивы, и те сороки и столбцы, в которых содержится значение FALSE также приравнять этому значению.

          Рекурсивный и итерационный варианты решения задачи используют одни и те же данные, процедуры и функции и отличаются только структурой. Текст программ с этими данными и подпрограммами приведен в приложении.

.3 Исследование способов программирования. Характеристики программ

          Программа полностью написана на Borland Delphi 7.0 и оформлена в виде отдельных модулей предназначенных для решения конкретных задач. Список модулей программы приведён ниже:

Таблица 4. Список модулей программы

Название модуля

Назначение модуля

Размер исход. кода

Размер модуля dcu

Время выполнения

KR_mainu

Главный модуль программы

3698 байт

-

-

KR_data

Модуль данных

678 байт

812 байт

-

KR_proc

Модуль используемых функций и процедур

9450 байт

8156 байт

-

KR_treeb

Модуль, содержащий процедуру решения задачи итерационным способом без ограничений

1143 байт

1152 байт

6406 мс

KR_Btreeb

Модуль, содержащий процедуру решения задачи итерационным способом с ограничениями

1011 байт

1137 байт

3188 мс

Модуль, содержащий процедуру решения задачи рекурсивным способом без ограничений

1370 байт

1395 байт

6719 мс


          Общий размер exe-кода программы - 448512 байт. Время выполнения подпрограмм измерялось на задаче размером 6 компонент на 6 ячеек.

заключение

          результатом курсовой работы стали составление, программная реализация и исследование алгоритмов решения задачи (итерационный и рекурсивный варианты). Программная реализация алгоритмов имеет следующие характеристики:

Таблица 5. Характеристики программной реализации алгоритмов

Алгоритм решения

Размер исполняемого кода, байт

Время выполнения задачи размером 6 компонент на 6 ячеек, мс

Итерационный вариант

1152

6406

Рекурсивный вариант

1395

6719

 

          Используя данные, приведенные в таблице 5 можно сделать вывод, что рекурсивный вариант реализации алгоритма поиска уступает как в требуемом объеме памяти, так и в скорости выполнения поиска.

          Если предположить, что плата, на которой размещаются ячейки, симметрична, то существуют эквивалентные решения, которые можно исключить из процесса поиска. Аналогичные характеристики программной реализации алгоритма в данном случае выглядят следующим образом: размер исполняемого кода 1137 байт, время выполнения задачи размером 6 компонент на 6 ячеек - 3188 мс.

          Цель задания для данной курсовой работы - исследование асимптотической временной сложности решения в зависимости от количества ячеек на плате. Исследование данной асимптотической временной сложности решения проводилось для двух случаев: когда число компонент постоянно и в случае, когда оно изменяется пропорционально числу ячеек. Результаты данных исследований приведены в таблицах 2 и 3. В обоих случаях мы получили экспонентациальную временную сложность - О(сп) , (при этом коэффициент с1 для первого случая гораздо меньше с2 ). Построим графики зависимостей времени решения от размера задачи.

         

Рисунок 2. Графики зависимостей времени решения от размера задачи

Приложение

          В данном приложении приведен текст программы по решению исходной задачи. Программа полностью написана на Borland Delphi 7.0 и оформлена в виде отдельных модулей, предназначенных для решения конкретных задач.

unit KR_mainu;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, KR_treeb, ExtCtrls, ComCtrls, XPMan, Spin, KR_data, KR_proc, KR_recurs,KR_Btreeb,KR_near;= class(TForm)_D: TGroupBox;: TMemo;: TGroupBox;: TMemo;: TLabel;: TLabel;: TGroupBox;: TLabel;: TButton;: TLabel;: TRadioButton;: TRadioButton;: TButton;: TGroupBox;: TButton;: TRichEdit;: TSpinEdit;: TLabel;: TSpinEdit;: TRadioButton;: TRadioButton;: TButton;Button2Click(Sender: TObject);Button3Click(Sender: TObject);Button1Click(Sender: TObject);Button4Click(Sender: TObject);;: TForm1;

{$R *.dfm}TForm1.Button2Click(Sender: TObject);int: integer;:= SpinEdit1.Value;(int);:= SpinEdit2.Value;(SpinEdit2.Value>SpinEdit1.Value) then begin.Value := SpinEdit1.Value;:= SpinEdit1.Value;;(int);.Enabled := TRUE;.Lines.Text := Cstr;.Lines.Text := Dstr;;TForm1.Button3Click(Sender: TObject);wait = 'Ждите. Идёт поиск...';

name = '"Электорнные платы"';

var int: integer;.Caption := wait;:= SpinEdit2.Value;(Form1.RadioButton1.Checked) then TreeBench(int,SpinEdit1.Value);(Form1.RadioButton2.Checked) then NearMethod(int);(Form1.RadioButton3.Checked) then BT.InitBackTrack(int,SpinEdit1.Value);(Form1.RadioButton4.Checked) then TreeBenchB(int,SpinEdit1.Value);.Caption := name;.Text := answer;;TForm1.Button1Click(Sender: TObject);

const mess =

' Данная программа решает следующую задачу:'+^M^J+^M^J+

' Имеются компоненты, которые нужно расположить в n' + ^M^J+

'ячейках на плате. Число соединений между парами компо'+^M^J+

'нент задается матрицей C, в которой C(i,j) - число св'+^M^J+

'язей между i-й и j-й компонентами. Расстояние между па'+^M^J+

'рами мест задается матрицей D, в которой D(k,l) - рас-'+^M^J+

'стояние между k-й и l-й ячейками.' +^M^J+

' Таким образом, в терминах общей длины использован-'+^M^J+

'ного провода раз-мещение i-й компоненты в k-й ячейке и'+^M^J+

'j-й компоненты в l-й ячейке стоит C(i,j)D(k,l).'+^M^J+

' В каждой ячейке можно поместить только одну компон'+^M^J+

'енту, и каждая компонента может находиться только в од'+^M^J+

'ной ячейке. Найти размещение компонент в ячейках, мини'+^M^J+

'мизирующее общую длину использованного провода.';

begin.MessageBox(mess, 'Справка', MB_OKCANCEL) = IDOK;;TForm1.Button4Click(Sender: TObject);int,check: integer;:= SpinEdit2.Value;check of

..5: int := 1000;

: int := 100;

: int := 25;int := 2;;(Form1.RadioButton1.Checked) then MonteKarlo(int,SpinEdit2.Value,SpinEdit1.Value);(Form1.RadioButton4.Checked) then MonteKarloB(100,SpinEdit2.Value,SpinEdit1.Value);.Text := answer;;.KR_data;Cmaxsize = 15;

inf = 1000000;TElement = record {запись для элемента вектора решения},j : byte;;= array [1..Cmaxsize,1..Cmaxsize] of boolean;{тип для множества кандидатов в решение}

TSol = array [1..Cmaxsize] of TElement; {тип вектора решения}C,D : array [1..Cmaxsize,1..Cmaxsize] of integer; {массивы C и D},Dstr : string;: array [0..Cmaxsize] of Tsquere; {множество множеств кандидаторв в решение}

bestsol,A : TSol; {вектора текущего и лучшего решений}

answer : string;.KR_proc;SysUtils, Windows, Math, KR_data;,lowcost : longword;initC(N : integer);initD(N : integer);SetS;SNotZero(k,sizeC,sizeD:byte):boolean;SNotZeroB(k,size,sizeD:byte):boolean;ElementFromSB(k,size,sizeD: byte):word;ElementFromS(k,size,sizeD: byte):word;SolCost(k : byte):word;FindNewS(k,size: byte);RecordAnswer(size: byte; lowcost: word; time: longint; uzels: longword);powerS(k,size,sizeD: integer):integer;RandomElementFromS(k,size,sizeD: byte):word;MonteKarlo(N,size,sizeD: integer):longword;powerSB(k,size,sizeD: integer):integer;RandomElementFromSB(k,size,sizeD: byte):word;MonteKarloB(N,size,sizeD: integer):longword;

implementation

//////////////////////////////////

{Процедура формирования матрицы C}

//////////////////////////////////initC(N : integer);i,j : byte;;i:=1 to N do begin

          for j:=1 to N do begin

           if (i <> j) then begin C[i][j]:=random(50)+1;[j][i]:= C[i][j];

           else begin C[i][j]:= inf; end;

          end;;:='';i:=1 to N do begin:= Cstr + ^M^J;

          for j:=1 to N do if (i<>j)then(C[i][j]>9)then Cstr := Cstr + inttostr(C[i][j])+' 'Cstr := Cstr + inttostr(C[i][j])+' '

           else Cstr := Cstr + ' - ';

end;;

//////////////////////////////////

{Процедура формирования матрицы D}

//////////////////////////////////initD(N : integer);i,j : byte;;i:=1 to N do begin

           for j:=1 to N do begin

           if (i <> j) then begin D[i][j]:=random(50)+1;

D[j][i]:= D[i][j];

           else begin D[i][j]:= inf; end;

          for j:=1 to N do if (i<>j)then(D[i][j]>9)then Dstr := Dstr + inttostr(D[i][j])+' 'Dstr := Dstr + inttostr(D[i][j])+' '

           else Dstr := Dstr + ' - ';

end;;

//////////////////////////////////

{Первоначальная установка множеств решений}

//////////////////////////////////SetS;i,j : byte;i:=1 to Cmaxsize doj:=1 to Cmaxsize do begin[1][i][j] := TRUE;;

S[0] := S[1];;

//////////////////////////////////

{Проверка на пустоту множества S}

//////////////////////////////////SNotZero(k,sizeC,sizeD:byte):boolean;i,j : byte;:= FALSE;(k > sizeC) then exit;j:=1 to sizeC doi:=1 to sizeD do(S[k][i][j]) then begin:= TRUE;;;;

Похожие работы на - Исследование алгоритмов поиска с возвращением

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!