Файл: Алгоритмизация как обязательный этап разработки программы (Подходы к разработке программных систем).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 24.05.2023

Просмотров: 64

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

3. Программная разработка

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

Алгоритм Форда–Беллмана представляет собой специализированный алгоритм для нахождения кратчайшего пути в рамках обработки взвешенного графа. За отведенное время O(|V| × |E|) алгоритм Форда–Беллмана позволяет выполнить необходимый поиск кратчайшего пути от определенной вершины графа ко всем остальным.

Алгоритм Беллмана–Форда, в отличие от алгоритма Дейкстры допускает оперативную обработку рёбер обрабатываемого объекта, которые имеют отрицательный вес. Данный алгоритм был предложен независимо Ричардом Беллманом и Лестером Фордом.

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

Следует построить матрицу Aij, элементы которой обозначают следующее: Aij представляет собой длину наименьшего пути из s в i, который содержит не более j рёбер исследуемого графа.

Можно предположить, что граф содержащий 0 рёбер, может существовать только до вершины s. Таким образом, Ai0 является равным 0 при i = s, и +∞ в противном случае.

Теперь следует рассмотреть все возможные пути из s в i, содержащие ровно j рёбер исследуемого графа. Каждый такой путь является путем из j-1 ребра, к которому будет добавлено последнее ребро данного графа. Если на пути длины j-1 все данные уже будут подсчитаны, то определить j-й столбец матрицы не будет составлять особого труда.

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

for v V

do d[v] +

d[s] 0

for i 1 to |V| - 1

do for (u, v) E

if d[v] > d[u] + w(u, v)

then d[v] d[u] + w(u, v)

return d

В представленном алгоритме переменная V представляет собой специальное множество вершин исследуемого графа, переменная E представляет собой множество его рёбер, а переменная w является весовой функцией, которая задается на ребрах исследуемого графа (используется для возвращения длины полученной дуги, которая ведет из вершины u в вершину v), переменная d представляет собой массив, который содержит расстояния от вершины s до любой другой вершины исследуемого графа.


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

Вместо массива d можно хранить всю анализируемую матрицу A, но это требует O(V²) достаточно большого количества вычислительной памяти. Зато при этом можно будет выполнить вычисление и самих кратчайших путей, а не только их непосредственной длины. Для этого необходимо завести дополнительную матрицу в виде массива Pij.

Если элемент матрицы Aij будет включать длину наименьшего по длине пути из s в i, который содержит j рёбер исследуемого графа, то Pij будет включать предыдущую вершину до i в одном из таких кратчайших путей (ведь кратчайших путей в исследуемом графе может быть и несколько).

Теперь изучаемый алгоритм Форда-Беллмана будет выглядеть следующим образом:

for v V

for i 0 to |V| - 1

do Avi +

As0 0

for i 1 to |V| - 1

do for (u, v) E

if Avi > Au, i-1 + w(u, v)

then Avi Au, i-1 + w(u, v)

Pvi u

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

while j > 0

p[j] i

i Pij

j j - 1

return p

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

После непосредственного запуска программа предлагает пользователю ввести имя файла с параметрами графа и необходимые вершины графа, между которыми будет вычисляться кратчайший путь. Графическое представление файла data.txt представлено на рис. 2.

1

1

4

1

7

5

1

3

2

2

2

Рисунок 2 – Граф

Например, пользователь вводит data.txt 1 7, это значит, что параметры графа будут взяты с заранее созданного информационного файла data.txt. Содержание файла data.txt

7 11

1 2 5

1 6 7

2 3 1

2 4 3

2 6 1

3 4 1

3 5 2

3 7 4

4 6 2

5 7 2

6 5 1

Значения 1 7 представляют собой вершины графа, между которыми и будет найден кратчайший путь.


3.2. Разработка алгоритма программы

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

  1. при помощи использования положений алгоритма Форда-Беллмана находим кратчайшее расстояние между двумя вершинами в исследуемом графе и сам путь;
  2. устанавливаем вес ребер исследуемого графа;
  3. заново применяем положения алгоритма Форда-Беллмана, в процессе чего будут удалены ненужные ребра по которым будет проходить путь (в процессе чего будут найдены две вершины в графе которые не пересекаются по ребрам);
  4. выполняем предыдущий путь, если существуют новые пути.

Приведем реализацию алгоритма Форда-Беллмана.

for (h=1 ; h<=N ;h++) {

i=0;

for (j=2 ; j<=N ; j++) {

for (k=1 ; k<=N ; k++) {

if (D[k] > D[j]+m[j][k])

D[k]=D[j]+m[j][k] ;

i++;

// преобразуем полученный информационный массив расстояний

// в матрицу значений

for (l=2 ; l<=N ; l++) {

// (i-ая строка информационной матрицы является массивом

// расстояний на i-ом шаге)

W[i][l]=D[l];

// выполняем отслеживание улучшений полученного пути

// исследуемого графа

if (W[i][l]<W[i-1][l])

// выполняем запоминание вершины, через которую

// будет проходить данный путь

G[k][2]=j ;

}

}

}

}

Реализация функции для непосредственного нахождения возможных путей между данными вершинами в исследуемом графе не пересекающиеся по ребрам выглядит следующим образом

void PYTU () {

// пока путь будет существовать ...

while (D[F]<MAX) {

// выполняем вызов функции нахождения наименьшего

// расстояния для исследуемого графа

// без учета весов рёбер (все ребра будут иметь вес равный единице)

GRAF(v);

for (j=0 ; j<M ; j++)

// пройденные ребра будут удалены

v[Z[j+1]][Z[j]]=MAX;

}

// завершение функции

return;

}

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

for ( i=1 ; i<=N ; i++)

for ( j=1 ; j<=N ; j++) {

m[i][j]=MAX;

v[i][j]=MAX;

}

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

3.3. Порядок работы с программой

После выполнения запуска программы необходимо будет ввести имя файла, которое содержит информацию о графе (имя файла txt.txt). Затем ввести необходимые узлы графа, для определения кратчайшего пути (например, вводим вершины 1 и 7). Результат работы программы представлен на рис. 3.


Рисунок 3 – Результат работы программы

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

Рисунок 4 – Результат работы программы

Результат выполнения программы с введенными вершинами 1 и 5 имеет следующий вид, представленный на рис. 5.

Рисунок 5 – Результат работы программы

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

Заключение

В процессе выполнения данной работы были получены следующие результаты. Установлено, что существует широкий спектр методологий, которые придерживаются принципами и ценностями, заявленными в Agile Manifesto, к основным можно отнести следующие: Agile Modeling; Agile Unified Process; Agile Data Method; DSDM; Feature driven development; Getting Real; OpenUP; Scrum. Описанные методологии базируются на принципах и ценностях методологии Agile позволяя разработчикам выбрать наиболее подходящий инструмент разработки программных систем.

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

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

Установлено, что язык программирования С++ представляет собой компилируемый, статически типизированный язык программирования общего назначения. Поддерживает такие парадигмы программирования, как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование.


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

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

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

В языках программирования существуют следующие циклические операторы: for; while; do while.

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

Алгоритм Беллмана–Форда, в отличие от алгоритма Дейкстры допускает обработку рёбер, которые имеют отрицательный вес. Данный алгоритм был предложен независимо Ричардом Беллманом и Лестером Фордом.

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

Список использованной литературы

  1. Гаврилов М.В. Информатика и информационные технологии: Учебник / М.В. Гаврилов, В.А. Климов. - Люберцы: Юрайт, 2016. – 383 c.
  2. Гома Х. UML. Проектирование систем реального времени, распределенных и параллельных приложений / Х. Гома. - М.: ДМК, 2016. – 700 c.
  3. Дарков А.В. Информационные технологии: теоретические основы: Учебное пособие / А.В. Дарков, Н.Н. Шапошников. - СПб.: Лань, 2016. – 448 c.
  4. Довек Ж. Введение в теорию языков программирования / Ж. Довек, Ж.-Ж. Леви. - М.: ДМК, 2016. – 134 c.
  5. Ерохин В.В. Безопасность информационных систем: учеб пособие / В.В. Ерохин, Д.А. Погонышева, И.Г. Степченко. - М.: Флинта, 2016. – 184 c.
  6. Информационные технологии: Учебное пособие / Л.Г. Гагарина, Я.О. Теплова, Е.Л. Румянцева и др.; Под ред. Л.Г. Гагариной - М.: ИД ФОРУМ: НИЦ ИНФРА-М, 2015. – 320 c.
  7. Информационные системы и технологии: Научное издание. / Под ред. Ю.Ф. Тельнова. - М.: ЮНИТИ, 2016. – 303 c.
  8. Корнеев И.К. Информационные технологии в работе с документами: Учебник / И.К. Корнеев. - М.: Проспект, 2016. – 304 c.
  9. Косиненко Н.С. Информационные системы и технологии в экономике: Учебное пособие для бакалавров / Н.С. Косиненко, И.Г. Фризен. - М.: Дашков и К, 2015. – 304 c.
  10. Кулямин В.В. Технологии программирования. Компонентный подход / В.В. Кулямин. - М.: Интуит, 2014. – 463 c.
  11. Куроуз Д. Компьютерные сети. Нисходящий подход / Д. Куроуз, К. Росс. - М.: Эксмо, 2016. – 912 c.
  12. Лукин В.Н. Введение в проектирование баз данных / В.Н. Лукин. - М.: Вузовская книга, 2015. – 144 c.
  13. Романова Ю.Д. Информационные технологии в управлении персоналом: Учебник и практикум / Ю.Д. Романова, Т.А. Винтова, П.Е. Коваль. - Люберцы: Юрайт, 2016. – 291 c.
  14. Сальникова Л.С. Современные коммуникационные технологии в бизнесе: Учебник / Л.С. Сальникова. - М.: Аспект-Пресс, 2015. – 296 c.
  15. Советов Б.Я. Информационные технологии: теоретические основы: Учебное пособие / Б.Я. Советов, В.В. Цехановский. - СПб.: Лань, 2016. – 448 c.