You are on page 1of 6

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

Національний авіаційний університет


Факультет кібербезпеки, комп’ютерної та програмної інженерії
Кафедра комп’ютерних систем та мереж

ЗВІТ
лабораторної роботи №2
з дисципліни: «Моделювання комп’ютерних систем»
На тему: «Універсальний інструментарій для дослідження комп’ютерних
систем, мереж та компонентів: планування активних експериментів,
модель ПЕРТ»

Роботу виконав:
студент групи КС-431
Зайцев М.Р.
Роботу перевірив:
Печурін М.К.

Київ 2023
Мета роботи: оволодіння основними навичками процедур дослідження
комп’ютерних систем, мереж та їх компонентів. Необхідно проаналізувати
інструментарій ПЕРТ (МПУ) на предмет можливості та доцільності
застосування при плануванні активних експериментів.

Об’єктом дослідження є технологія мережевого планування та


проведення експериментів на основі моделі ПЕТР, а також алгоритм
розстановки поміток для її аналізу.

Постановка задачі
Описати та застосувати модель мережевого планування, а також
алгоритм розстановки поміток (Дейкстра) для розрахунку найскорішого
терміну виконання комплексу взаємопов’язаних робіт різної середньої
тривалості, що інформацію про них представлено таблицею 2. Елемент k (i, j)
таблиці пов’язаний із значенням середньої тривалості t (i, j) роботи (i, j) так:

Наприклад, якщо по індивідуальному варіанту h2 = 1, то середня


тривалість t (1,3) роботи (1,3) суть 1,25 тижня.
Початкова подія – А1, кінцева – А8.
Нульове значення елементу таблиці 2 означає, що відповідного зв’язку
між подіями не існує.
Також при цьому слід навести структурну блок-схему алгоритму
розрахунку найскорішого терміну виконання комплексу взаємопов’язаних
робіт.

Опис алгоритму Дейкстри:


Алгоритм Дейкстри – це алгоритм оптимізації на графах, який дозволяє
знайти найкоротшу відстань від однієї вершини графа до всіх решта. Кожній
вершині ставиться у відповідність мітка - це мінімальна відома відстань від
початкової вершини до поточної. Процес продовжується доти поки не будуть
переглянуті всі вершини. Алгоритм складається з наступних кроків:
1. Мітка початкової вершини покладається рівно нулю, мітки решти
вершин нескінченності.
2. Всі вершини позначаються як не відвідані.
3. З не відвіданих вершин обирається вершина Ui сусідня до
поточної вершини і така, яка має мінімальну мітку.
4. Розглядаються всі можливі маршрути в яких вершина Ui є
передостаннім пунктом.
5. Для кожного сусіда вершини Ui крім відмічених як відвідані,
розглядається нова довжина шляху, яка дорівнює сумі значень поточної
мітки Ui та довжини дуги, що з’єднує Ui з цим сусідом.
6. Якщо отримане значення довжини шляху менше значення мітки,
то це значення заміняється на довжину шляху, якщо ні залишається
попереднім.
7. Якщо всі сусіди вершини Ui розглянуті, то вершина відмічається
як відвідана.
8. Обчислення продовжуються доки всі вершини не будуть
відвідані.

Структурна схема алгоритму Дейкстри:


Хід виконання роботи
Визначення варіанту:
Для визначення варіанту розраховуємо значення бітів, для цього
спочатку перекладаємо прізвище англійською. Прізвище Зайцев англійською
мовою (великими літерами) записується наступним чином – ZAYTSEV, після
чого перші три букви кодуються ASCII-кодом:
BA(16)A1(16)B9(16).
Тепер на основі отриманого коду формуємо допоміжний код прізвища,
виписуючи друге, четверте та шосте число:
A, 1, 9.
Отримані числа переводимо в десяткову систему числення:
A = 10, 1 = 1, 9 = 9.
Після цього переводимо отримані числа в двійкову систему числення (4
розряди з молодшим розрядом справа):
10 = 1010, 1 = 0001, 9 = 1001.
Праві десять бітів переписаного коду утворюють код варіанту:
10{1000011001}(2).
Код варіанту породжує значення допоміжних змінних: перший зліва
двійковий розряд коду варіанту породжує значення допоміжної змінної h10,
другий – змінної h9 тощо.
H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
1 0 0 0 0 1 1 0 0 1
Для зручності випишемо змінні, чиє значення = 1: h10, h5, h4, h1.

Початкова таблиця:
№ 1 2 3 4 5 6 7 8
вуз.
1 * 0.2+h10*0.2 0.4+h2*0.4 0.2+h9*0.3 0.3+h7*0.4 0.2+h6*0.3 0.5+h8*0.4 0.3+h7*0.4
2 0 * 0.2+h1*0.3 0.1+h6*0.3 0.1+h6*0.3 0.4+h5*0.1 0.2+h9*0.3 0.2+h6*0.3
3 0 0 * 0.4+h5*0.1 0.3+h7*0.4 0.2+h3*0.3 0.3+h7*0.4 0.4+h5*0.1
4 0 0 0 * 0.1+h6*0.3 0.4+h2*0.4 0.1+h6*0.3 0.5+h4*0.4
5 0 0 0 0 * 0.2+h1*0.3 0.4+h5*0.1 0.2+h3*0.3
6 0 0 0 0 0 * 0.2+h9*0.3 0.4+h2*0.4
7 0 0 0 0 0 0 * 0.2+h1*0.3
8 0 0 0 0 0 0 0 *

Заповнена таблиця згідно варіанту:


№ 1 2 3 4 5 6 7 8
вуз.
1 * 0.4 0.4 0.2 0.3 0.2 0.5 0.3
2 0 * 0.5 0,1 0,1 0.5 0,2 0,2
3 0 0 * 0.5 0.3 0.2 0.3 0.5
4 0 0 0 * 0.1 0.4 0.1 0.9
5 0 0 0 0 * 0.5 0.5 0,2
6 0 0 0 0 0 * 0,2 0,4
7 0 0 0 0 0 0 * 0.5
8 0 0 0 0 0 0 0 *
Відобразимо отримані дані на наступному графі:

Тепер ми можемо використати алгоритм Дейкстри для пошуку


найскорішого терміну виконання комплексу взаємопов’язаних робіт. Для
цього я використаю просту реалізацію алгоритму на мові C++.

Лістинг програми:
#include <iostream>
#include <limits>

#define V 8
using namespace std;

float minDistance(float dist[], bool sptSet[]) {


float min = numeric_limits<float>::max();
int min_index = 0;
for (int v = 0; v < V; v++)
if (sptSet[v] == false && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
void printSolution(float dist[]) {
cout << "Вершина: \tВiдстань вiд A:" << endl;
for (int i = 0; i < V; i++)
cout << char(i + 'A') << "\t\t" << dist[i] << endl;
}

void dijkstra(float graph[V][V], int src) {


float dist[V];
bool sptSet[V];
for (int i = 0; i < V; i++)
dist[i] = numeric_limits<float>::max(), sptSet[i] = false;
dist[src] = 0;
for (int count = 0; count < V - 1; count++) {
int u = minDistance(dist, sptSet);
sptSet[u] = true;
for (int v = 0; v < V; v++)
if (!sptSet[v] && graph[u][v] && dist[u] !=
numeric_limits<float>::max() && dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
printSolution(dist);
}

int main() {
setlocale(LC_ALL, "");
float graph[V][V] = { { 0, 0.4, 0.4, 0.2, 0.3, 0.2, 0.5, 0.3 },
{ 0, 0, 0.5, 0.1, 0.1, 0.5, 0.2, 0.2 },
{ 0, 0, 0, 0.5, 0.3, 0.2, 0.3, 0.5 },
{ 0, 0, 0, 0, 0.1, 0.4, 0.1, 0.9 },
{ 0, 0, 0, 0, 0, 0.5, 0.5, 0.2 },
{ 0, 0, 0, 0, 0, 0, 0.2, 0.4 },
{ 0, 0, 0, 0, 0, 0, 0, 0.5 },
{ 0, 0, 0, 0, 0, 0, 0, 0 } };
dijkstra(graph, 0);
return 0;
}

Результат компіляції програми:

Висновок
В ході виконання даної лабораторної роботи я оволодів основними
навичками процедур дослідження комп’ютерних систем, мереж та їх
компонентів.

You might also like