Виды и свойства алгоритмов. Решение задачи Майхилла (о стрелках)

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

Виды и свойства алгоритмов. Решение задачи Майхилла (о стрелках)










Курсовая работа

по дисциплине: "Теория вычислительных процессов"

на тему:

"Виды и свойства алгоритмов. Решение задачи Майхилла (о стрелках)"

Содержание

Введение

1. Теоретический вопрос "Виды и свойства алгоритмов"

1.1 Виды алгоритмов

1.2 Свойства алгоритмов

2. Решение задачи Майхилла (о стрелках)

2.1 Постановка задачи

2.2 Решение задачи

Заключение

Список использованных источников

Введение

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

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

Говорят, что алгоритм корректен, если для каждого ввода результатом его работы является корректный вывод. Мы говорим, что корректный алгоритм решает данную вычислительную задачу. Если алгоритм некорректный, то для некоторых вводов он может вообще не завершить свою работу или выдать ответ, отличный от ожидаемого. Правда, некорректные алгоритмы иногда могут оказаться полезными, если в них есть возможность контролировать частоту возникновения ошибок. Тем не менее, обычно мы заинтересованы только в корректных алгоритмах.

Алгоритм может быть задан на естественном языке, в виде компьютерной программы или даже воплощен в аппаратном обеспечении. Единственное требование - его спецификация должна предоставлять точное описание вычислительной процедуры, которую требуется выполнить. [1, С.46-47]

1. Теоретический вопрос "Виды и свойства алгоритмов"

 

.1 Виды алгоритмов


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

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

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

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

Впрочем, модели второго и третьего типа довольно близки (их взаимная сводимость доказывается просто). [2, С.154-155]

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

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

·        механический алгоритм, или иначе детерминированный, жесткий (например алгоритм работы машины, двигателя и т.п.);

·        гибкий алгоритм, т.е. вероятностный и эвристический;

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

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

·        линейный алгоритм - набор команд (указаний), выполняемых последовательно во времени друг за другом;

·        разветвляющийся алгоритм - алгоритм, содержащий хотя бы одно условие, в результате проверки которого ЭВМ обеспечивает переход на один из двух возможных шагов;

·        циклический алгоритм - алгоритм, предусматривающий многократное повторение одного и того же действия (одних и тех же операций) над новыми исходными данными. К циклическим алгоритмам сводится большинство методов вычислений, перебора вариантов. [3]

1.2 Свойства алгоритмов


Для алгоритмов характерны общие черты и особенности.

1.      Дискретность

Применение каждого алгоритма осуществляется путем выполнения дискретной цепочки (последовательности) неких элементарных действий. Эти действия называют шагами, а процесс их выполнения называют алгоритмическим процессом [4, С.314].

2.      Детерминированность (определенность)

Каждый шаг алгоритма должен быть точно определен. Действия, которые нужно выполнить, должны быть строго и недвусмысленно определены для каждого конкретного случая. Предписания алгоритма единственным и вполне определенным путем всякий раз приводят к искомому результату. Для описания алгоритмов были разработаны формально определенные языки программирования, или машинные языки, в которых каждый оператор имеет строго определенное значение [5, С.23-24].

3.      Результативность

Данное свойство требует от алгоритма остановки после конечного числа шагов (зависящего от данных) с указанием того, что считать результатом. В частности, всякий, кто предъявляет алгоритм решения некоторой задачи, например вычисления функции f (x), должен показать, что алгоритм останавливается после конечного числа шагов (говорят, сходится) для любого x из области задания f. Проверить результативность (сходимость) непросто. Сходимость обычно не удается установить простым просмотром описания алгоритма; общего же метода проверки сходимости, пригодного для любого алгоритма А и любых данных х, не существует [2, С.149].

4.      Массовость

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

5.      Допустимость начальных данных

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

Среди допустимых начальных данных для алгоритма могут быть такие, к которым он применим, т.е. отправляясь oт которых можно получить искомый результат, а могут быть и такие, к которым данный алгоритм неприменим, т.е. отправляясь от которых искомого результата получить нельзя. Неприменимость алгоритма к допустимым начальным данным может заключаться либо в том, что алгоритмический процесс никогда не оканчивается, либо в том, что его выполнение во время одного из шагов наталкивается на препятствие, заходит в тупик. [4, С.314-315]

Также следует различать:

а) описание алгоритма (инструкцию или программу);

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

в) процесс реализации алгоритма, т.е. последовательность шагов, которая будет порождена при применении алгоритма к конкретным данным. [2, С.149]

2. Решение задачи Майхилла (о стрелках)

 

.1 Постановка задачи


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

 

.2 Решение задачи


Данная задача решается при помощи автоматной модели поведения стрелка.

На рисунке 1 представлена структурная модель поведения стрелков в задаче Майхилла. Дополнительно к стрелкам в задачу введены блок, моделирующий поведение офицера (он отдает команду стрелкам), и блок, выполняющий протоколирование внутренних состояний объектов, составляющих модель цепи стрелков.

Перечень блоков

-       Officer - модель офицера;

-       Rifleman 1, 2, … N - модели стрелков;

-       WriteStates - блок протокола.

Блоки Officer и WriteStates не обязательные. Первый введен для удобства управления цепью стрелков, второй - для визуализации решения.

Функционирование модели

Объекты модели функционируют параллельно. Время для всех объектов едино и моделируется абстрактным дискретным временем. Офицер, получив команду, передает ее ближайшему стрелку, тот следующему и т.д. Чтобы выполнить команду, стрелки обмениваются между собой информацией. По истечении некоторого периода времени они должны одновременно выполнить команду выстрел. В модели - перейти в одинаковое для всех объектов состояние. При этом все промежуточные состояния объектов на каждом такте протоколируются созданным для этого объектом, который функционирует параллельно остальным объектам, составляющим задачу. [6]

Рисунок 1 - Модель поведения стрелков в задаче Майхилла

 

Решение задачи на языке высокого уровня С++

Применяя автоматную модель поведения стрелков, выполним решение данной задачи на языке высокого уровня С++.

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

Листинг программ сервера ("Офицер") и клиента ("Стрелок") представлен ниже.

Программа-сервер ("Офицер")

// ---------------------------------------------------------------------------

#include <vcl. h>

#include <iostream. h>

#include "Unit1. h"

#define BUFSIZE 512

// ---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma resource "*. dfm"*Form1;hThread;hProcPipe [5];lpszPipename = "\\\\. \\pipe\\pipe1001";hPipe;hSemaphoreCount; // дескриптор семафора "Счет"

int SemaphoreMax=5; // максимальный размер счетчика семафора, и его начальное

// значениеCount=0;ConnectShooters (LPVOID); // создание именованного канала для общения с

// клиентомShooterThread (LPVOID); // поток для работы с клиентом

void Shoot (); // произвести выстрел

// ---------------------------------------------------------------------------

__fastcall TForm1:: TForm1 (TComponent* Owner)

: TForm (Owner)

{();(int i=0; i<5; i++)

{[i] =NULL;

}

}

// создание именованного канала для общения с клиентом

// ---------------------------------------------------------------------------ConnectShooters (LPVOID lpvParam)

{Number=0;(Number<5)

{fConnected;= CreateNamedPipe (lpszPipename,_ACCESS_DUPLEX,_TYPE_MESSAGE |_READMODE_MESSAGE |_WAIT,_UNLIMITED_INSTANCES,,,

,NULL);= ConnectNamedPipe (hPipe, NULL);(fConnected)

{[Number] =hPipe;

// создание потока для работы с клиентом

hThread = CreateThread (NULL,

, (LPTHREAD_START_ROUTINE) ShooterThread,

(LPVOID) Number,

,NULL);++;

}(hPipe);

}

}

// поток для работы с клиентом

// ---------------------------------------------------------------------------

void ShooterThread (LPVOID lpvParam)

{chBuf [BUFSIZE];cbRead,cbWritten;fSuccess;n= (int) lpvParam;(1)

{

// считывание ответов клиента из канала= ReadFile (hProcPipe [n],

chBuf,,

&cbRead,);(fSuccess)

{result=atoi (chBuf);(result)

{

// в случае ответа клиента "1" идет прямой счет

case (1):++;->StringGrid1->Cells [0] [Count-1] = IntToStr (Count) +"-й";

break;

// в случае ответа клиента "2" идет обратный счет

case (2):->StringGrid1->Cells [1] [Count-1] = IntToStr (Count) +"-й команду принял";

Count--;

// при окончании обратного счета производим выстрел

if (Count == 0) Shoot ();;: break;

}

}break;

}(hProcPipe [n]);[n] =NULL;

}

// выстрелShoot ()

{(int i = 1; i <= 5; i++)->StringGrid1->Cells [2] [i-1] = "Выстрел";->Button1->Enabled=true;

}__fastcall TForm1:: Button1Click (TObject *Sender)

{StartupInfo;_INFORMATION ProcessInfo;->Button1->Enabled=false;= CreateThread (NULL,

, (LPTHREAD_START_ROUTINE) ConnectShooters,

(LPVOID) 0,0,NULL);(hThread == NULL) {PrintInfo ("Ошибка при создании потока"); return; }

// для каждого стрелка создаем процесс

for (int i=0; i<5; i++)

{(&StartupInfo,sizeof (StartupInfo));. cb=sizeof (StartupInfo);. dwFlags = STARTF_USESHOWWINDOW;. wShowWindow = SW_HIDE;

// параметр командной строки, определяющий очередность счета

// "стрелков-клиентов"ShooterSleep= (i+1) *1000;CommandLine="";="Shooter "+IntToStr (i) +" "+IntToStr (ShooterSleep);(!(NULL,. c_str (), // Указатель на строку,

// определяющую командную строку для выполнения,

NULL,,

,NULL,(). c_str (), // имя текущего каталога

&StartupInfo, // информация предустановки

&ProcessInfo)) // информация о процессе

{PrintInfo ("Не могу создать процесс"); return; }

hProcPipe [i] =ProcessInfo. hProcess;

// создаем семафор "Счет"= CreateSemaphore (NULL, // Адрес структуры TSecurityAttributes

SemaphoreMax, // начальное значение счетчика, // максимальное значение

// счетчика

"SemaphoreCount"); // имя объекта

}

// ---------------------------------------------------------------------------

Программа-клиент ("Стрелок")

// ---------------------------------------------------------------------------

#include <vcl. h>

#include <iostream. h>

#define BUFSIZE 512

#define N 5

#pragma hdrstop

// ---------------------------------------------------------------------------

#pragma argsusedlpszPipename="\\\\. \\pipe\\pipe1001";hPipe;hSemaphoreCount; // дескриптор семафора "Счет"

// отправка сообщения на серверMsgToServer (int Message)

{chBuf [BUFSIZE];fSuccess;cbWritten;S=IntToStr (Message);(chBuf, (const char*) S. c_str (),"/0");=WriteFile (hPipe,,,

&cbWritten,);

}

// основная функцияmain (int argc, char* argv [])

{();chBuf [BUFSIZE];cbRead, cbWritten, dwMode;

// аргумент командной строки, отвечающий за очередность счета стрелковShooterSleep=atoi (argv [2]);

// получение дескриптора канала

while (1)

{= CreateFile (lpszPipename,_READ |_WRITE,_SHARE_READ,,_EXISTING,

,NULL);(hPipe! = INVALID_HANDLE_VALUE) break;(GetLastError ()! = ERROR_PIPE_BUSY) return 1;(! WaitNamedPipe (lpszPipename, 20000)) return 1;

}(ShooterSleep); (1)

{

// получение дескриптора семафора "Счет"

hSemaphoreCount = OpenSemaphore (SEMAPHORE_ALL_ACCESS, 0, "SemaphoreCount");

// "засыпание" потока для выполнения очередности счета(ShooterSleep);

// если семафор в сигнальном состоянии, то идет прямой счет

// иначе выход из цикла, далее - обратный счет

if (WaitForSingleObject (hSemaphoreCount,0) == WAIT_OBJECT_0) MsgToServer (1);break;

}

// обратный счет(2);

// "засыпание" для выполнения очередности обратного счета( (5000-ShooterSleep) *2);

// закрытие дескрипторов(hPipe);(hSemaphoreCount);0;

}

// ---------------------------------------------------------------------------

алгоритм логический математический свойство

Заключение


В теоретической части были рассмотрены виды и свойства алгоритмов.

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

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

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

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

В практической части было рассмотрено решение задачи Майхилла о стрелках. Данная задача была решена с использованием автоматной модели поведения стрелков. Основная проблема синхронизации заключалась в обеспечении одновременного залпа всех стрелков цепи.

Список использованных источников


1.       Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. - М.: Издательский дом "Вильямс", 2011. - 1296 с.

2.      Кузнецов О.П., Адельсон-Вельский Г.М. Дискретная математика для инженера. - М.: Энергоатомиздат, 1988. - 480 с.

.        Альфа и Омега [Электронный ресурс]. Режим доступа: http://alfa2omega.ru. Дата доступа: 13.12.2012.

.        Игошин В.И. Математическая логика и теория алгоритмов. - М.: Издательский центр "Академия", 2009. - 448 с.

.        Кнут Д. Искусство программирования, том 1. Основные алгоритмы - М.: Издательский дом "Вильямс", 2007. - 720с.

Похожие работы на - Виды и свойства алгоритмов. Решение задачи Майхилла (о стрелках)

 

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