Решения комбинаторной задачи, их анализ и исследование

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

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

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

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

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

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

Оглавление

  • Задание на курсовую работу
    • Расширенная постановка задачи
    • Виды выполняемых работ
  • Анализ задания
  • 1. Формализация задачи
    • 1.1 Структуры данных для представления объектов задачи
    • 1.2 Анализ ограничений и усовершенствований. Аналитические и /или экспериментальные оценки
    • 1.3 Разработка алгоритмов решения задачи
  • 2. Оценка асимптотической временной сложности алгоритма
  • 3. Программная реализация алгоритмов
    • 3.1 Реализация данных
    • 3.2 Реализация алгоритмов
    • 3.3 Исследование способов программирования
  • Выводы по всей работе в целом
  • Список использованной литературы
  • Приложение A
  • Приложение B

Задание на курсовую работу

Расширенная постановка задачи

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

В качестве индивидуального задания на курсовое проектирование была предложена следующая задача: “Дана шахматная доска и шахматный конь, стоящий в углу доски. Некоторые поля (примерно половина) не пригодны для передвижения, то есть помещать коня на них нельзя. Требуется найти кратчайший путь (количество ходов и сами ходы) коня в противоположный угол доски, либо установить, что пути не существует. Также требуется исследовать асимптотическую временную сложность решения задачи в зависимости от n”.

Выполнение курсовой работы требует:

- формализация поставленной задачи;

- приспособление общих методов и алгоритмов решения классов задач к решению конкретной задачи;

- проведение сравнительной оценки различных вариантов с целью выбора наиболее эффективных структур данных и алгоритмов их обработки;

- исследование и оценка аналитически и экспериментально методов сокращения перебора в комбинаторных задачах;

- оценка эффективности предложенных в работе алгоритмов;

- экспериментальное исследование различных способов программной реализации алгоритмов.

Виды выполняемых работ

В ходе решения задач курсовой работы должны быть выполнены следующие виды работ:

- Анализ поставленной задачи, выводы о методах решения и путях повышения эффективности вычислений;

- Формализация поставленной задачи, приспособление и модификация общего алгоритма поиска с возвращением под конкретную задачу, разработка алгоритмов решения задачи;

- Оценка асимптотической временной сложности алгоритмов;

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

Анализ задания

Выводы о методах решения и путях повышения эффективности вычислений:

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

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

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

Из постановки задачи о том, что надо найти кратчайший путь легко увидеть следующее оптимизирующее соображение: если найден кратчайший путь длины L, то перебирать дерево глубже уровня L узлов не имеет смысла.

В связи с тем, что выбранная модель имеет древовидную структуру, наиболее целесообразным будет использование рекурсивного алгоритма.

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

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

Введем на доске систему координат такую, что начальные координаты коня будут (1,1) а конечные (n,n). Очевидно, что ходы коня записываются координатами вида (x,y).

Для алгоритма поиска с возвращением, в общем случае предполагается, что решение задачи представляет собой вектор (a1, a2, …) конечной, но неопределённой длины. В нашем случае, этот вектор будет содержать координаты ходов рассматриваемого в данный момент пути коня. Также введем два вектора dx и dy, содержащие возможные 8 ходов с текущей клетки. В связи с тем, что модель имеет древовидную структуру, текущий путь коня лучше записывать в стек.

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

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

Ограничение на глубину исследования дерева поиска напрямую и радикально действует на число исследованных вершин и как следствие - на время работы алгоритма. Данное ограничение принято как мера, принятая для уменьшения размеров поиска. Путь коня не длиннее n*n полей, дерево поиска содержит не более 8n*n узлов. Ниже приведена таблица исследования временной сложности алгоритма без введения ограничений:

Таблица 1

Работа алгоритма без ограничений

Размер доски (n)

Узлов в дереве перебора (шт)

Затраченное время (с)

8

120654

0,27

9

7174329

16,18

10

395553789

892,25

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

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

Таблица 2

Работа алгоритма с ограничением

Размер доски (n)

Узлов в дереве перебора (шт)

Затраченное время (с)

Быстрее, чем без ограничений (раз)

8

45598

0,10

2,65

9

2618368

5,91

2,74

10

138305521

311,97

2,86

Как видно из таблицы 2, по сравнению с результатами, приведёнными в таблице 1, выше оговорённый способ сокращения перебора уменьшил время перебора почти в три раза.

1.3 Разработка алгоритмов решения задачи

В данном пункте описаны алгоритмы для решения поставленной задачи. Был применен вышеописанный алгоритм поиска с возвращением и примененными ограничениями.

Алгоритм 1. Поиск кратчайшего пути рекурсивным методом

Этот алгоритм представляет модификацию общего рекурсивного алгоритма поиска с возвращением для решения данной задачи.

Алгоритм 2. Итерационный алгоритм поиска с возвращением.

Алгоритм 2 является модификацией итерационного алгоритма поиска с возвращением.

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

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

Алгоритм Монте-Карло для исследования деревьев имеет следующий вид:

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

Одной из важных частей данной работы является исследование временной сложности алгоритмов. Результаты исследований сведены в нижеприведённой таблице 3.

Таблица 3

Работа алгоритма с ограничением

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

Фактически

N

Число узлов

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

Число узлов

Время, ч:м:с

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

3

1

-

1

00:00:00

-

4

4

4,0

4

00:00:00

4,0

5

23

5,8

25

00:00:00

5,8

6

141

6,1

140

00:00:00

6,1

7

2957

21,0

3059

00:00:00

21,0

8

53570

18,1

50569

00:00:00

18,1

9

3185935

59,5

3186891

00:00:07

59,5

10

175631613

55,1

175859875

00:06:36

55,1

11

23300786658

132,7

~ 14:36:00

Из приведённых выше таблиц видно, что при увеличении размера задачи, время поиска увеличивается в некоторое количество раз. Этот факт говорит об экспоненциальном характере алгоритмов. Для интереса приведём тот факт, что по предварительным оценкам время перебора при N=11 будет примерено равно 14,5 часам. Отсюда вытекают следующие соображения: очень важно находить методы сокращения перебора!

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

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

Для реализации данных использовались следующие структуры:

var b:array [1..nmax,1..nmax] of shortint; {содержимое доски }

stack,optimal:tStack; {текущий и оптимальный путь }

x,y,n,p:integer; {счетчики цикла и т.п. }

first,found:boolean; {флаг первого и найденного решения}

u:longint; {количество узлов }

асимптотический сложность комбинаторный алгоритм

По той причине, что Pascal не поддерживает массивы неизвестного размера и была необходимость обеспечить ввод пользователем желаемого размера задачи, возникла потребность в предварительном резервировании места под массивы. Было зарезервировано место под доску 15x15, это вполне приемлемо, так как даже при размере доски 12x12 задача решается в среднем за 14,5 часов, то есть за большое время.

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

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

1. Процедура Main

Главная процедура программы. В ней происходит очистка экрана, запрашиваются у пользователя размеры задачи, происходит инициализация всех массивов и переменных начальными значениями. Конь устанавливается на поле (1,1), вызываются процедуры генерации препятствий, решения и вывода результата.

2. Процедура In Stack(x,y)

Данная процедура помещает в стек ходов (Stack) ход с координатами (x,y), увеличивая при этом его размер(Stack.hodov) на единицу.

3. Процедура Out Stack

Данная процедура извлекает из стека ходов (Stack) последний ход (лежащий на вершине стека), уменьшая при этом его размер(Stack.hodov) на единицу.

4. Функция In Doska (x,y)

Данная функция определяет принадлежит ли поле (x,y) доске.

5. Процедура Choose

Осуществляется проверка оптимальности полученного решения - не является ли оно оптимальнее ранее найденного оптимального решения.

6. Процедура Back Tracking (x,y)

Головная рекурсивная процедура - перебор узлов дерева, передается текущая позиция коня.

7. Процедура Print Optimal Way.

Производит вывод результата в удобочитаемой форме.

8. Процедура Randomly Generate P.

Заполняет случайно выбранные поля (половину от всех полей доски) препятствиями.

Как оговаривалось выше процедуры и функции для рекурсивного и итерационного варианта алгоритма абсолютно идентичны. Автор работы не видит смысла дублирования в данной работе их описания. Кроме того быстродействие этих алгоритмов не сильно различается. Для описания выбрана программа написана с использованием рекурсивного алгоритма.

3.3 Исследование способов программирования

Программа была реализована на языке высокого уровня Borland Pascal 7.0. Размеры поставленной задачи позволяют реализовать её в виде одного главного модуля.

Размеры исходного файла: 3478 байт.

Размеры исполняемого файла: 4832 байт.

Приведём пример работы программы:

Входные данные: n=8

Выходные данные:

количество ходов: 7

символическое изображение

1 . # . # # # .

# # # . # . . .

# 2 . # . # . .

. . . 3 . # # .

. # . # # . # #

# . 4 # # # # #

# # # # . 6 # .

. # . 5 . # # 7

число узлов 615

Выводы по всей работе в целом

В данной курсовой работе в соответствии с заданием были разработаны и тщательно исследованы алгоритмы решения поставленной комбинаторной задачи. Прежде всего, это рекурсивные алгоритмы поиска с возвращением. Подводя итоги проделанной работе, хочется отметить особую важность методов сокращения перебора, которые, вообще говоря, в комбинаторных задачах имеют весомую роль. От разработчика алгоритмов по сокращению перебора требуется большая изобретательность, умение видеть пространственно. Во время написания программ автор работы не стремился к разработке «красивых» интерфейсов, т. к. по мнению автора задачи по перебору решаются внутри других больших программах, которые имеют свой интерфейс. Основное внимание уделялось разработке и отладке алгоритмов программы. Это было вызвано тем, что при постановке задачи был сделан акцент не на сам факт решения поставленной задачи, а на исследование и разработку алгоритмов. О результатах исследований говорилось в пунктах 1.2 и 2 данной пояснительной записки, подведём небольшие итоги: ввод ограничения на перестановку пары ячеек переставленных на предыдущем шаге позволило сократить время перебора более чем в два раза, тем не менее алгоритм всё равно остаётся асимптотически сложным (O(cn)). Для примера повторюсь, что для решения задачи размером (10*10) необходимо затратить 6 минут времени, а для решения задачи размером (11*11) по приблизительным оценкам необходимо около 14,5 часов. В пункте 1.2 данной работы приведена формула диапазона, которому принадлежит количество вершин дерева поиска, в зависимости от размеров задачи.

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

Приложение A

В данном приложении приводится листинг программы с комментариями по решению поставленной задачи рекурсивным методом

{$M 65520,0,655360}

const nmax=15; {максимально возможный размер доски }

type mas=array [1..8] of shortint; {тип массива на 8

однобайтовыхэлементов}

tHod=record {тип записи на координату хода }

x,y:integer; {однобайтовые координаты x и y }

end;

tStack=record {тип стека }

way:array [1..nmax*nmax] of tHod;{текущий путь c максимальной

длиной n*n}

hodov:integer; {количество элементов в стеке }

end;

const dx:mas=(2,1,-1,-2,-2,-1,1,2); {возможные 8 ходов, коодрдинаты x }

dy:mas=(1,2,2,1,-1,-2,-2,-1); {возможные 8 ходов, коодрдинаты y }

var b:array [1..nmax,1..nmax] of shortint;{содержимое доски }

stack,optimal:tStack; {текущий и оптимальный путь }

x,y,n,p:integer; {счетчики цикла и т.п. }

first,found:boolean; {флаг первого и найденного решения }

u:longint; {количество узлов }

{записать в стек ход}

procedure InStack(x,y:integer);

begin

with stack do begin

inc(hodov);

way[hodov].x:=x;

way[hodov].y:=y;

end;

end;

{удалить ход из стека}

procedure OutStack;

begin

with Stack do dec(hodov);

end;

{координата принадлежит доске?}

function InDoska(x,y:integer):boolean;

begin

InDoska:=(x>=1) and (x<=n) and (y>=1) and (y<=n);

end;

{выбор оптимального пути}

procedure Choose;

begin

found:=true;

if first then begin

optimal:=stack;

first:=false;

end

else if optimal.hodov>stack.hodov then optimal:=stack;

end;

{головная рекурсивная процедура}

procedure BackTracking(x,y:integer);

var i:integer;

begin

if (stack.hodov>=optimal.hodov) and found then exit;

if (x=n) and (y=n) then Choose

else for i:=1 to 8 do if (InDoska(x+dx[i],y+dy[i])) and

(b[x+dx[i],y+dy[i]]=0) then begin

u:=u+1;

b[x+dx[i],y+dy[i]]:=1;

InStack(x+dx[i],y+dy[i]);

BackTracking(x+dx[i],y+dy[i]);

OutStack;

b[x+dx[i],y+dy[i]]:=0;

end;

end;

{наглядное изображение оптимального пути}

procedure PrintOptimalWay;

var x,y:integer;

ch:char;

begin

writeln('символическое изображение');

if found then with optimal do for x:=1 to hodov do

b[way[x].x,way[x].y]:=x+1;

for y:=1 to n do begin

for x:=1 to n do if b[x,y]=0 then write('. ')

else if b[x,y]=-1 then write('# ')

else write(b[x,y],' ');

writeln;

end;

end;

{случайная расстановка препятствий}

procedure RandomlyGenerateP;

var i,x,y:integer;

begin

randomize;

for i:=1 to p do begin

repeat

x:=random(n)+1;

y:=random(n)+1;

until (b[x,y]=0) and ((x<>n) or (y<>n));

b[x,y]:=-1;

end;

end;

{главная процедура}

procedure Main;

begin

u:=0;

writeln;

write('введите n ');

readln(n);

p:=n*n div 2;

first:=true;

found:=false;

for y:=1 to n do

for x:=1 to n do

b[x,y]:=0;

b[1,1]:=1;

RandomlyGenerateP;

BackTracking(1,1);

PrintOptimalWay;

if not found then writeln('пути не существует');

writeln('число узлов ',u);

end;

begin

Main;

end

Приложение Б

Решение поставленной задачи с использованием итерационного алгоритма

const nmax=15;

type tmove=record

x,y:integer;

end;

tstack=record

move:array [1..nmax*nmax] of tmove;

length:integer;

end;

mas=array [1..8] of integer;

const dx:mas=(1,2,2,1,-1,-2,-2,-1);

dy:mas=(2,1,-1,-2,-2,-1,1,2);

var b:array [1..nmax,1..nmax] of integer;

i,j,n:integer;

cway:tstack;

cx,cy:integer;

procedure Push(nx,ny:integer);

begin

inc(cway.length);

with cway do with move[length] do begin

x:=nx;

y:=ny;

end;

end;

procedure Pop;

begin

if cway.length=0 then halt;

dec(cway.length);

end;

function InDoska(x,y:integer):boolean;

begin

InDoska:=(x>=1) and (y>=1) and (x<=n) and (y<=n);

end;

procedure PrintDoska;

var i,j:integer;

begin

for j:=1 to n do begin

for i:=1 to n do write(b[i,j]:5);

writeln;

end;

readln;

end;

procedure DoAvailMove;

var i:integer;

z:boolean;

begin

z:=false;

for i:=1 to 8 do if (b[cx+dx[i],cy+dy[i]]=0) and

(InDoska(cx+dx[i],cy+dy[i])) then begin

z:=true;

b[cx+dx[i],cy+dy[i]]:=b[cx,cy]+1;

cx:=cx+dx[i];

cy:=cy+dy[i];

push(cx,cy);

break;

end;

if not z then begin

Pop;

with cway do with move[length] do begin

cx:=x;

cy:=y;

end;

end;

end;

begin

write('n=');

readln(n);

for j:=1 to n do for i:=1 to n do b[i,j]:=0;

b[1,1]:=1;

cx:=1;

cy:=1;

Push(cx,cy);

repeat

if (cx=n) and (cy=n) then begin

writeln('Оптимальный путь ');

with cway do for i:=1 to length do with move[i] do writeln(x,' ',y);

halt;

end;

DoAvailMove;

until false;

end

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


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

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

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

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

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

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

    курсовая работа [408,8 K], добавлен 22.10.2012

  • Особенности метода неопределенных множителей Лагранжа, градиентного метода и метода перебора и динамического программирования. Конструирование алгоритма решения задачи. Структурная схема алгоритма сценария диалога и описание его программной реализации.

    курсовая работа [1010,4 K], добавлен 10.08.2014

  • Исследование методов решения задачи о ходе коня. Описание алгоритмов для итеративной и рекурсивной программ. Генерация перестановок элементов по индексам. Построение эйлерова цикла на графе. Поиск кратчайшего пути на графе. Программная реализация задачи.

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

  • Описание предметной области решаемой задачи. Входные документы, необходимые для решения задачи, ее функции. Разработка информационного обеспечения задачи и реквизиты входной информации. Технология и алгоритмов решения задачи и их машинная реализация.

    контрольная работа [15,1 K], добавлен 21.10.2010

  • Концептуальная модель операции. Математическая постановка задачи. Описание метода ветвей и границ, прямого перебора. Проектирование сценария диалога. Описание структур данных. Ручная реализация решения задачи с помощью алгоритма Литла и перебора.

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

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

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

  • Требования к системе оперативного управления на предприятии. Входная и выходная информация. Алгоритм решения задачи по учету оказания услуг производственного характера, его программная реализация. Оценка экономической эффективности поставленной задачи.

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

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

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

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