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

Составление и программная реализация в среде Borland Delphi 7.0 алгоритмов итерационного и рекурсивного вариантов решения задачи поиска с возвращением. Исследование асимптотической временной сложности решения в зависимости от количества ячеек на плате.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.06.2013
Размер файла 57,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

2

Размещено на http://www.allbest.ru/

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

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), где ij и 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).

2.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.2 Анализ ограничений и усовершенствований. Аналитические и/или экспериментальные оценки

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

Рассмотрим ограничения свойственные данной задаче: в каждой ячейке можно поместить только одну компоненту, и каждая компонента может находиться только в одной ячейке, следовательно, для любых двух элементов вектора решений, которые можно представить двойками чисел (i,k) и (j,l) ij, 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.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;

for k :=2 to m do

for l:=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

в 40 раз

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. Программная реализация алгоритмов

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

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

TElement = record

i,j : byte;

end;

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

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

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

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

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

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

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

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

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

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

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

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

functuion SolCost(k : byte):word;

var i,j : byte;

cost : word;

begin

cost := 0;

for i:=2 to k do

for j:=1 to (i-1) do begin

cost := cost + (C[A[i].j][A[j].j]*D[A[i].i][A[j].i]);

end;

SolCost := cost;

end;

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

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

4.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 мс

KR_recurs

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

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;

interface

uses

Windows, 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;

type

TForm1 = class(TForm)

Matrix_D: TGroupBox;

Memo1: TMemo;

GroupBox1: TGroupBox;

Memo2: TMemo;

Label1: TLabel;

Label2: TLabel;

GroupBox2: TGroupBox;

Label3: TLabel;

Button2: TButton;

Label4: TLabel;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

Button3: TButton;

GroupBox3: TGroupBox;

Button1: TButton;

RichEdit1: TRichEdit;

SpinEdit1: TSpinEdit;

Label8: TLabel;

SpinEdit2: TSpinEdit;

RadioButton3: TRadioButton;

RadioButton4: TRadioButton;

Button4: TButton;

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);

var int: integer;

begin

int := SpinEdit1.Value;

InitD(int);

int := SpinEdit2.Value;

if (SpinEdit2.Value>SpinEdit1.Value) then begin

SpinEdit2.Value := SpinEdit1.Value;

int := SpinEdit1.Value;

end;

InitC(int);

Button3.Enabled := TRUE;

Memo1.Lines.Text := Cstr;

Memo2.Lines.Text := Dstr;

end;

procedure TForm1.Button3Click(Sender: TObject);

const wait = 'Ждите. Идёт поиск...';

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

var int: integer;

begin

Form1.Caption := wait;

int := SpinEdit2.Value;

if (Form1.RadioButton1.Checked) then TreeBench(int,SpinEdit1.Value);

if (Form1.RadioButton2.Checked) then NearMethod(int);

if (Form1.RadioButton3.Checked) then BT.InitBackTrack(int,SpinEdit1.Value);

if (Form1.RadioButton4.Checked) then TreeBenchB(int,SpinEdit1.Value);

Form1.Caption := name;

RichEdit1.Text := answer;

end;

procedure 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

Application.MessageBox(mess, 'Справка', MB_OKCANCEL) = IDOK;

end;

procedure TForm1.Button4Click(Sender: TObject);

var int,check: integer;

begin

check := SpinEdit2.Value;

case check of

1..5: int := 1000;

6: int := 100;

7: int := 25;

else int := 2;

end;

if (Form1.RadioButton1.Checked) then MonteKarlo(int,SpinEdit2.Value,SpinEdit1.Value);

if (Form1.RadioButton4.Checked) then MonteKarloB(100,SpinEdit2.Value,SpinEdit1.Value);

RichEdit1.Text := answer;

end;

end.

unit KR_data;

interface

const Cmaxsize = 15;

inf = 1000000;

type TElement = record {запись для элемента вектора решения}

i,j : byte;

end;

Tsquere = array [1..Cmaxsize,1..Cmaxsize] of boolean;{тип для множества кандидатов в решение}

TSol = array [1..Cmaxsize] of TElement; {тип вектора решения}

var C,D : array [1..Cmaxsize,1..Cmaxsize] of integer; {массивы C и D}

Cstr,Dstr : string;

S : array [0..Cmaxsize] of Tsquere; {множество множеств кандидаторв в решение}

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

answer : string;

implementation

end.

unit KR_proc;

interface

uses SysUtils, Windows, Math, KR_data;

var

cost,lowcost : longword;

procedure initC(N : integer);

procedure initD(N : integer);

procedure SetS;

function SNotZero(k,sizeC,sizeD:byte):boolean;

function SNotZeroB(k,size,sizeD:byte):boolean;

function ElementFromSB(k,size,sizeD: byte):word;

function ElementFromS(k,size,sizeD: byte):word;

function SolCost(k : byte):word;

procedure FindNewS(k,size: byte);

procedure RecordAnswer(size: byte; lowcost: word; time: longint; uzels: longword);

function powerS(k,size,sizeD: integer):integer;

function RandomElementFromS(k,size,sizeD: byte):word;

function MonteKarlo(N,size,sizeD: integer):longword;

function powerSB(k,size,sizeD: integer):integer;

function RandomElementFromSB(k,size,sizeD: byte):word;

function MonteKarloB(N,size,sizeD: integer):longword;

implementation

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

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

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

procedure initC(N : integer);

var i,j : byte;

begin

randomize;

for i:=1 to N do begin

for j:=1 to N do begin

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

C[j][i]:= C[i][j];

end

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

end;

end;

Cstr:='';

for i:=1 to N do begin

Cstr := Cstr + ^M^J;

for j:=1 to N do if (i<>j)then

if (C[i][j]>9)then Cstr := Cstr + inttostr(C[i][j])+' '

else Cstr := Cstr + inttostr(C[i][j])+' '

else Cstr := Cstr + ' - ';

end;

end;

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

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

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

procedure initD(N : integer);

var i,j : byte;

begin

randomize;

for 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];

end

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

end;

end;

for j:=1 to N do

for i:=1 to (N-j+1) do D[i][j]:=D[N-j+1][N-i+1];

Dstr:='';

for i:=1 to N do begin

Dstr := Dstr + ^M^J;

for j:=1 to N do if (i<>j)then

if (D[i][j]>9)then Dstr := Dstr + inttostr(D[i][j])+' '

else Dstr := Dstr + inttostr(D[i][j])+' '

else Dstr := Dstr + ' - ';

end;

end;

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

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

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

procedure SetS;

var i,j : byte;

begin

for i:=1 to Cmaxsize do

for j:=1 to Cmaxsize do begin

S[1][i][j] := TRUE;

end;

S[0] := S[1];

end;

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

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

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

functuion SNotZero(k,sizeC,sizeD:byte):boolean;

var i,j : byte;

begin

SNotZero := FALSE;

if (k > sizeC) then exit;

for j:=1 to sizeC do

for i:=1 to sizeD do

if (S[k][i][j]) then begin

SNotZero := TRUE;

exit;

end;

end;

Размещено на Allbest.ru


Подобные документы

  • Переход от словесной неформальной постановки к математической формулировке данной задачи. Оценка различных вариантов с целью выбора наиболее эффективных структур данных и алгоритмов обработки. Реализация алгоритмов на одном из языков программирования.

    курсовая работа [35,0 K], добавлен 25.06.2013

  • Исследование асимптотической временной сложности решения шахматной задачи; разработка наиболее эффективных алгоритмов и структуры данных; аналитическая и экспериментальная оценка методов сокращения перебора в комбинаторных задачах; программная реализация.

    курсовая работа [36,6 K], добавлен 25.06.2013

  • Проектирование программного модуля в среде программирования Borland Delphi 7.0. Схемы алгоритмов решения задач по темам "Символьные переменные и строки", "Массивы", "Работа с файлами", "Создание анимации". Реализация программного модуля, код программы.

    отчет по практике [961,6 K], добавлен 21.04.2012

  • Методы реализации алгоритмов сортировки и алгоритмов поиска на языках программирования высокого уровня. Программирование алгоритмов сортировки и поиска в рамках создаваемого программного средства на языке Delphi. Создание руководства пользователя.

    курсовая работа [1,7 M], добавлен 16.04.2012

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

    курсовая работа [538,1 K], добавлен 29.08.2010

  • Обзор алгоритмов распознания объектов на двумерных изображениях. Выбор языка программирования. Обнаружение устойчивых признаков изображения. Исследование алгоритмов поиска объектов на плоскости. Модификация алгоритма поиска максимума дискретной функции.

    дипломная работа [1,0 M], добавлен 16.06.2013

  • Понятие алгоритма и анализ теоретических оценок временной сложности алгоритмов умножения матриц. Сравнительный анализ оценки временной сложности некоторых классов алгоритмов обычным программированием и программированием с помощью технологии Open MP.

    дипломная работа [1,6 M], добавлен 12.08.2017

  • Реализация комплекса программ поиска подстроки в тексте алгоритмом прямого поиска и алгоритмом Кнута-Морриса-Пратта. Сравнительный анализ теоретических и экспериментальных оценок эффективности алгоритмов. Разработка структуры программы, ее листинг.

    курсовая работа [2,8 M], добавлен 22.01.2015

  • Изучение особенностей создания алгоритмов вычислительных задач. Визуальное программирование стандартных компонентов среды программирования Delphi. Технология создания компонента Delphi для решения производственной задачи. Выполнение блок-схемы алгоритма.

    курсовая работа [638,0 K], добавлен 30.01.2015

  • Исследование особенностей разработки линейных алгоритмов и их реализации в среде Delphi. Составление тестов для проверки программы. Характеристика основных элементов интерфейса, компонентов, значения их свойств. Построение графической схемы алгоритма.

    лабораторная работа [316,6 K], добавлен 08.11.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.