Міністерство освіти, науки, молоді і спорту України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Звіт
до лабораторної роботи №2
з дисципліни «Планування експериментів»
на тему:
«Дослідження замкнутих стохастичних аналітичних моделей обчислювальних систем»
Мета роботи - вивчення методу розрахунку замкнутих стохастичних аналітичних моделей обчислювальних систем (ОС), основаних на представленні обчислювального процесу (ОП) марківським випадковим процесом.
ОСНОВНІ ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
Характерна особливість замкнутих стохастичних аналітичних моделей ОС на відміну від розімкнутих - наявність в ОС постійного числа активних ОП [4] (рис. 1).
Рис.1. Замкнута стохастична модель ОС:
Прі – процесор, ПВВі – пристрій вводу/виводу, КВВі –канал вводу/виводу.
Такими моделями описуються, як правило, ОС, які працюють в інтерактивному (діалоговому) режимі, коли число користувачів фіксоване, і кожен з них не ініціює нового запиту до системи поки не отримає відповіді на попередній запит. В цьому випадку кількість заявок, які циркулюють в мережі, визначається коефіцієнтом мультипрограмування М. Для однозначного опису параметрів замкнутих і розімкнутих мереж виділимо систему S0 в замкнутій мережі як фіктивне джерело заявок, при чому його інтенсивність [4] – це інтенсивність заявок, яка відповідає завершеним роботам. Інтенсивність визначає продуктивність системи. Ця величина не залежить від будь яких зовнішніх причин, а визначається конфігурацією мережі і її параметрами.
Замкнуті мережі визначаються тими самими параметрами, що і розімкнуті [4], за винятком параметра . Замість нього задається коефіцієнт мультипрограмування М, а визначається на основі розрахунку мережі.
Згідно рис.1 матриця ймовірностей передач P виглядає наступним чином:
(2.1)
В замкнутих мережах на відміну від розімкнутих стаціонарний режим завжди існує, оскільки кількість заявок, які циркулюють в мережі, постійна і визначається М. Розподіли М заявок по системах мережі визначають стани мережі. Стан М1,М2,...,МN , визначає, що в системі S1 перебуває М1 заявок, в S2 – М2 заявок і т.д.
Позначимо множину всіх можливих станів . Оскільки для замкнутої мережі , то кількість різноманітних розподілів М заявок по N системам скінчено і дорівнює кількості сполучень
, (2.2)
де - потужність множини .
Для замкнутої мережі система рівнянь, яка визначає інтенсивності [4], має безмежну кількість роз’язків. Однак з неї можно визначити співвідношення інтенсивностей потоків і , тобто коефіцієнти передач [4], які визначаються розв’язком системи, в яку підставляються значення . В цьому випадку корені системи –го порядку чисельно визначають значення .
Для визначення ймовірностей станів замкнутої мережі використовується той самий підхід, що і для визначення ймовірностей станів розімкнутої мережі [4]. У випадку замкнутих мереж вводиться додатковий нормуючий множник, який враховує той факт, що сума ймовірностей всіх станів мережі дорвнює одиниці.
Ймовірність стану замкнутої мережі визначається наступним чином
, (2.3)
де - ймовірність того, що в системі Sj знаходиться Мj заявок [4]; символ сумування по всім станам множини .
Величина
(2.4)
називається нормуючою константою.
Підставляючи значення [4] в (2.3), отримаємо
. (2.5)
На основі (2.5) обчислюємо всі необхідні характеристики.
Розглянемо алгоритм обчислення величини G(M) для мережі з одноканальними СМО.
Введемо допоміжну функцію
, (2.6)
де , при чому
. (2.7)
Для r>0 і i>0
, (2.8)
де символи і - сумування по всім станам множини , для яких і >0 відповідно:
;
. (2.9)
Таким чином, рекурентне співвідношення (2.8) разом з початковими умовами (2.9) дає правило знаходження нормуючої константи (2.4). Для зручності обчислень використаємо таблицю 1. Спочатку в першу стрічку таблиці 1 заносяться величини . Потім обчислюються значення , що утворюють перший стовпчик. Всі інші величини визначаються як сума величини , що стоїть зліва в даній стрічці, та добутка величини , яка стоїть вище в даному стовпчику, на відповідне даному стовпчику значення . Кінцевим результатом є величина .
Знайдемо основні характеристики функціонування замкнутої мережі, використовуючи введену функцію .
Обчислимо ймовірність того, що в системі перебуває кількість заявок, більша за l або рівна l:
Таблиця 2.1
Розрахунок нормуючої константи
Стрічки
Стовпці
1
...
i
...
N
0
...
...
1
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
. (2.10)
Тоді маргінальний розподіл числа заявок в системі визначається як різниця між і :
(2.11)
Коефіцієнт завантаження системи :
(2.12)
де .
Середнє число заявок, що перебуває в системі :
(2.13)
Інтенсивність вхідного потоку в систему :
, (2.14)
На основі формули Літла
, . (2.15)
Звідки середнє число заявок, що очікують обслуговування в системі :
, (2.16)
Середній час очікування і перебування заявки в системі визначаються відповідно (2.17) і (2.18):
, (2.17)
, (2.18)
Аналогічні характеристики для мережі в цілому визначаються за формуламии (2.19) - (2.22).
, (2.19)
, (2.20)
, (2.21)
. (2.22)
ПОРЯДОК ВИКОНАННЯ РОБОТИ
Номер варіанту: III – 5
Вхідні дані
Рис.1. Розімкнута стохастична модель ОС.
Результати розрахунку програм
Рис.1 Результати роботи програми при M = 3.
Рис.2 Результати роботи програми при M = 6.
Графіки залежностей характеристик мереж m, l, w, u від коефіцієнту мультипрограмування M.
Код програми
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace lab_1wf
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.Items.Add("1");
comboBox1.Items.Add("2");
comboBox1.Items.Add("3");
comboBox1.Items.Add("4");
comboBox1.Items.Add("5");
comboBox1.Items.Add("6");
comboBox1.SelectedIndex = 0;
dataGridView2.Rows.Clear();
dataGridView1.Rows.Add(1);
dataGridView1.Rows[0].SetValues("1", "1", "1", "1", "1", "1");
dataGridView2.Rows.Clear();
dataGridView2.Rows.Add(1);
dataGridView2.Rows[0].SetValues("0.4", "0.3", "0.3", "0.1", "0.1", "0.1");
dataGridView3.Rows.Clear();
dataGridView3.Rows.Add(7);
dataGridView3.Rows[0].SetValues("0", "0", "0", "0", "0", "0", "1");
dataGridView3.Rows[1].SetValues("0", "0", "0", "0", "0", "0", "1");
dataGridView3.Rows[2].SetValues("0", "0", "0", "0", "0", "1", "0");
dataGridView3.Rows[3].SetValues("0", "0", "0", "0", "0", "1", "0");
dataGridView3.Rows[4].SetValues("0", "1", "0", "0", "0", "0", "0");
dataGridView3.Rows[5].SetValues("0", "0", "0", "0", "0", "0", "1");
dataGridView3.Rows[6].SetValues("0.1", "0", "0.3", "0.2", "0.4", "0", "0");
}
private void button1_Click(object sender, EventArgs e)
{
double[] niu = {0.4, 0.3, 0.3, 0.1, 0.1, 0.1}; // середній час обслуговування каналами систем мережі
double[] lamda = new double[7]; // знаходимо інтенсивності вхідних потоків
lamda[0] = 1;
lamda[6] = lamda[0] / 0.1;
lamda[1] = 0.4 * lamda[6];
lamda[2] = 0.3 * lamda[6];
lamda[3] = 0.2 * lamda[6];
lamda[4] = 0.4 * lamda[6];
lamda[5] = 0.5 * lamda[6];
double[] alfa = new double[7]; // обчислюємо коефіцієнти передачі
for (int i = 1; i < 7; i++)
alfa[i] = lamda[i] / lamda[0];
double[] t = new double[7];
for (int i = 1; i < 7; i++)
t[i] = alfa[i] * niu[i - 1];
double[,] g = new double[7, 7];
for (int i = 1; i < 7; i++)
{
g[0, i] = 1;
}
for (int i = 1; i < 7; i++)
g[i, 1] = Math.Pow(t[1], i);
for (int r = 1; r < 7; r++)
for (int i = 2; i < 7; i++)
g[r, i] = g[r, i - 1] + t[i] * g[r - 1, i];
double[] ro1 = new double[7];
double[] ro2 = new double[7];
double[] ro3 = new double[7];
double[] ro4 = new double[7];
double[] ro5 = new double[7];
double[] ro6 = new double[7];
for (int i = 1; i < 7; i++)
{
ro1[i] = (t[i] * g[0, 6]) / g[1, 6];
ro2[i] = (t[i] * g[1, 6]) / g[2, 6];
ro3[i] = (t[i] * g[2, 6]) / g[3, 6];
ro4[i] = (t[i] * g[3, 6]) / g[4, 6];
ro5[i] = (t[i] * g[4, 6]) / g[5, 6];
ro6[i] = (t[i] * g[5, 6]) / g[6, 6];
}
double[] m1 = new double[7];
double[] m2 = new double[7];
double[] m3 = new double[7];
double[] m4 = new double[7];
double[] m5 = new double[7];
double[] m6 = new double[7];
for (int i = 1; i < 7; i++)
{
m1[i] = (Math.Pow(t[i], 1) * g[0, 6]) / g[1, 6];
m2[i] = (Math.Pow(t[i], 1) * g[1, 6] + Math.Pow(t[i], 2) * g[0, 6]) / g[2, 6];
m3[i] = (Math.Pow(t[i], 1) * g[2, 6] + Math.Pow(t[i], 2) * g[1, 6] + Math.Pow(t[i], 3) * g[0, 6]) / g[3, 6];
m4[i] = (Math.Pow(t[i], 1) * g[3, 6] + Math.Pow(t[i], 2) * g[2, 6] + Math.Pow(t[i], 3) * g[1, 6] + Math.Pow(t[i], 4) * g[0, 6]) / g[4, 6];
m5[i] = (Math.Pow(t[i], 1) * g[4, 6] + Math.Pow(t[i], 2) * g[3, 6] + Math.Pow(t[i], 3) * g[2, 6] + Math.Pow(t[i], 4) * g[1, 6] + Math.Pow(t[i], 5) * g[0, 6]) / g[5, 6];
m6[i] = (Math.Pow(t[i], 1) * g[5, 6] + Math.Pow(t[i], 2) * g[4, 6] + Math.Pow(t[i], 3) * g[3, 6] + Math.Pow(t[i], 4) * g[2, 6] + Math.Pow(t[i], 5) * g[1, 6] + Math.Pow(t[i], 6) * g[0, 6]) / g[6, 6];
}
double[] l1 = new double[7];
double[] l2 = new double[7];
double[] l3 = new double[7];
double[] l4 = new double[7];
double[] l5 = new double[7];
double[] l6 = new double[7];
for (int i = 1; i < 7; i++)
{
l1[i] = m1[i] - ro1[i];
l2[i] = m2[i] - ro2[i];
l3[i] = m3[i] - ro3[i];
l4[i] = m4[i] - ro4[i];
l5[i] = m5[i] - ro5[i];
l6[i] = m6[i] - ro6[i];
}
double[] lamda2_1 = new double[7];
double[] lamda2_2 = new double[7];
double[] lamda2_3 = new double[7];
double[] lamda2_4 = new double[7];
double[] lamda2_5 = new double[7];
double[] lamda2_6 = new double[7];
for (int i = 1; i < 7; i++)
{
lamda2_1[i] = ro1[i] / niu[i - 1];
lamda2_2[i] = ro2[i] / niu[i - 1];
lamda2_3[i] = ro3[i] / niu[i - 1];
lamda2_4[i] = ro4[i] / niu[i - 1];
lamda2_5[i] = ro5[i] / niu[i - 1];
lamda2_6[i] = ro6[i] / niu[i - 1];
}
double[] w1 = new double[7];
double[] w2 = new double[7];
double[] w3 = new double[7];
double[] w4 = new double[7];
double[] w5 = new double[7];
double[] w6 = new double[7];
for (int i = 1; i < 7; i++)
{
w1[i] = l1[i] / lamda2_1[i];
w2[i] = l2[i] / lamda2_2[i];
w3[i] = l3[i] / lamda2_3[i];
w4[i] = l4[i] / lamda2_4[i];
w5[i] = l5[i] / lamda2_5[i];
w6[i] = l6[i] / lamda2_6[i];
}
double[] u1 = new double[7];
double[] u2 = new double[7];
double[] u3 = new double[7];
double[] u4 = new double[7];
double[] u5 = new double[7];
double[] u6 = new double[7];
for (int i = 1; i < 7; i++)
{
u1[i] = m1[i] / lamda2_1[i];
u2[i] = m2[i] / lamda2_2[i];
u3[i] = m3[i] / lamda2_3[i];
u4[i] = m4[i] / lamda2_4[i];
u5[i] = m5[i] / lamda2_5[i];
u6[i] = m6[i] / lamda2_6[i];
}
double[] suma_l = { 0, 0, 0, 0, 0, 0 };
double[] suma_m = { 0, 0, 0, 0, 0, 0 };
double[] suma_w = { 0, 0, 0, 0, 0, 0 };
double[] suma_u = { 0, 0, 0, 0, 0, 0 };
for (int i = 1; i < 7; i++)
{
suma_l[0] += l1[i]; suma_l[1] += l2[i]; suma_l[2] += l3[i]; suma_l[3] += l4[i]; suma_l[4] += l5[i]; suma_l[5] += l6[i];
suma_m[0] += m1[i]; suma_m[1] += m2[i]; suma_m[2] += m3[i]; suma_m[3] += m4[i]; suma_m[4] += m5[i]; suma_m[5] += m6[i];
suma_w[0] += w1[i] * alfa[i]; suma_w[1] += w2[i] * alfa[i]; suma_w[2] += w3[i] * alfa[i]; suma_w[3] += w4[i] * alfa[i]; suma_w[4] += w5[i] * alfa[i]; suma_w[5] += w6[i] * alfa[i];
suma_u[0] += u1[i] * alfa[i]; suma_u[1] += u2[i] * alfa[i]; suma_u[2] += u3[i] * alfa[i]; suma_u[3] += u4[i] * alfa[i]; suma_u[4] += u5[i] * alfa[i]; suma_u[5] += u6[i] * alfa[i];
}
dataGridView5.Rows.Clear();
dataGridView5.Rows.Add(1);
dataGridView5.Rows[0].SetValues(alfa[1], alfa[2], alfa[3], alfa[4], alfa[5], alfa[6]);
dataGridView11.Rows.Clear();
dataGridView11.Rows.Add(comboBox1.SelectedIndex + 2);
for (int i = 0; i < comboBox1.SelectedIndex + 2; i ++)
dataGridView11.Rows[i].SetValues(i ,g[i, 1], g[i, 2], g[i, 3], g[i, 4], g[i, 5], g[i, 6]);
dataGridView6.Rows.Clear();
dataGridView7.Rows.Clear();
dataGridView8.Rows.Clear();
dataGridView9.Rows.Clear();
dataGridView10.Rows.Clear();
dataGridView6.Rows.Add(1);
dataGridView7.Rows.Add(1);
dataGridView8.Rows.Add(1);
dataGridView9.Rows.Add(1);
dataGridView10.Rows.Add(1);
label19.Text = "";
label20.Text = "";
label21.Text = "";
label22.Text = "";
dataGridView4.Rows.Clear();
dataGridView4.Rows.Add(1);
if (comboBox1.SelectedIndex == 0)
{
dataGridView6.Rows[0].SetValues(ro1[1], ro1[2], ro1[3], ro1[4], ro1[5], ro1[6]);
dataGridView8.Rows[0].SetValues(m1[1], m1[2], m1[3], m1[4], m1[5], m1[6]);
dataGridView7.Rows[0].SetValues(l1[1], l1[2], l1[3], l1[4], l1[5], l1[6]);
dataGridView9.Rows[0].SetValues(w1[1], w1[2], w1[3], w1[4], w1[5], w1[6]);
dataGridView10.Rows[0].SetValues(u1[1], u1[2], u1[3], u1[4], u1[5], u1[6]);
dataGridView4.Rows[0].SetValues(lamda2_1[1], lamda2_1[2], lamda2_1[3], lamda2_1[4], lamda2_1[5], lamda2_1[6]);
}
if (comboBox1.SelectedIndex == 1)
{
dataGridView6.Rows[0].SetValues(ro2[1], ro2[2], ro2[3], ro2[4], ro2[5], ro2[6]);
dataGridView8.Rows[0].SetValues(m2[1], m2[2], m2[3], m2[4], m2[5], m2[6]);
dataGridView7.Rows[0].SetValues(l2[1], l2[2], l2[3], l2[4], l2[5], l2[6]);
dataGridView9.Rows[0].SetValues(w2[1], w2[2], w2[3], w2[4], w2[5], w2[6]);
dataGridView10.Rows[0].SetValues(u2[1], u2[2], u2[3], u2[4], u2[5], u2[6]);
dataGridView4.Rows[0].SetValues(lamda2_2[1], lamda2_2[2], lamda2_2[3], lamda2_2[4], lamda2_2[5], lamda2_2[6]);
}
if (comboBox1.SelectedIndex == 2)
{
dataGridView6.Rows[0].SetValues(ro3[1], ro3[2], ro3[3], ro3[4], ro3[5], ro3[6]);
dataGridView8.Rows[0].SetValues(m3[1], m3[2], m3[3], m3[4], m3[5], m3[6]);
dataGridView7.Rows[0].SetValues(l3[1], l3[2], l3[3], l3[4], l3[5], l3[6]);
dataGridView9.Rows[0].SetValues(w3[1], w3[2], w3[3], w3[4], w3[5], w3[6]);
dataGridView10.Rows[0].SetValues(u3[1], u3[2], u3[3], u3[4], u3[5], u3[6]);
dataGridView4.Rows[0].SetValues(lamda2_3[1], lamda2_3[2], lamda2_3[3], lamda2_3[4], lamda2_3[5], lamda2_3[6]);
}
if (comboBox1.SelectedIndex == 3)
{
dataGridView6.Rows[0].SetValues(ro4[1], ro4[2], ro4[3], ro4[4], ro4[5], ro4[6]);
dataGridView8.Rows[0].SetValues(m4[1], m4[2], m4[3], m4[4], m4[5], m4[6]);
dataGridView7.Rows[0].SetValues(l4[1], l4[2], l4[3], l4[4], l4[5], l4[6]);
dataGridView9.Rows[0].SetValues(w4[1], w4[2], w4[3], w4[4], w4[5], w4[6]);
dataGridView10.Rows[0].SetValues(u4[1], u4[2], u4[3], u4[4], u4[5], u4[6]);
dataGridView4.Rows[0].SetValues(lamda2_4[1], lamda2_4[2], lamda2_4[3], lamda2_4[4], lamda2_4[5], lamda2_4[6]);
}
if (comboBox1.SelectedIndex == 4)
{
dataGridView6.Rows[0].SetValues(ro5[1], ro5[2], ro5[3], ro5[4], ro5[5], ro5[6]);
dataGridView8.Rows[0].SetValues(m5[1], m5[2], m5[3], m5[4], m5[5], m5[6]);
dataGridView7.Rows[0].SetValues(l5[1], l5[2], l5[3], l5[4], l5[5], l5[6]);
dataGridView9.Rows[0].SetValues(w5[1], w5[2], w5[3], w5[4], w5[5], w5[6]);
dataGridView10.Rows[0].SetValues(u5[1], u5[2], u5[3], u5[4], u5[5], u5[6]);
dataGridView4.Rows[0].SetValues(lamda2_5[1], lamda2_5[2], lamda2_5[3], lamda2_5[4], lamda2_5[5], lamda2_5[6]);
}
if (comboBox1.SelectedIndex == 5)
{
dataGridView6.Rows[0].SetValues(ro6[1], ro6[2], ro6[3], ro6[4], ro6[5], ro6[6]);
dataGridView8.Rows[0].SetValues(m6[1], m6[2], m6[3], m6[4], m6[5], m6[6]);
dataGridView7.Rows[0].SetValues(l6[1], l6[2], l6[3], l6[4], l6[5], l6[6]);
dataGridView9.Rows[0].SetValues(w6[1], w6[2], w6[3], w6[4], w6[5], w6[6]);
dataGridView10.Rows[0].SetValues(u6[1], u6[2], u6[3], u6[4], u6[5], u6[6]);
dataGridView4.Rows[0].SetValues(lamda2_6[1], lamda2_6[2], lamda2_6[3], lamda2_6[4], lamda2_6[5], lamda2_6[6]);
}
label19.Text = suma_m[comboBox1.SelectedIndex].ToString();
label20.Text = suma_l[comboBox1.SelectedIndex].ToString();
label21.Text = suma_w[comboBox1.SelectedIndex].ToString();
label22.Text = suma_u[comboBox1.SelectedIndex].ToString();
string[] xval1 = new string[6];
for (int i = 0; i < 6; i++)
xval1[i] = (i + 1).ToString();
chart1.ChartAreas["ChartArea1"].AxisX.IsLabelAutoFit = true; // Задаєм параметри гістограми
chart1.ChartAreas["ChartArea1"].AxisX.Interval = 1;
chart1.ChartAreas["ChartArea1"].AxisX.LabelAutoFitMinFontSize = 8;
this.chart1.Series.Clear(); // Будуємо гістограму
this.chart1.Series.Add("M");
chart1.Series["M"].Points.DataBindXY(xval1, suma_m);
chart2.ChartAreas["ChartArea1"].AxisX.IsLabelAutoFit = true; // Задаєм параметри гістограми
chart2.ChartAreas["ChartArea1"].AxisX.Interval = 1;
chart2.ChartAreas["ChartArea1"].AxisX.LabelAutoFitMinFontSize = 8;
this.chart2.Series.Clear(); // Будуємо гістограму
this.chart2.Series.Add("L");
chart2.Series["L"].Points.DataBindXY(xval1, suma_l);
chart3.ChartAreas["ChartArea1"].AxisX.IsLabelAutoFit = true; // Задаєм параметри гістограми
chart3.ChartAreas["ChartArea1"].AxisX.Interval = 1;
chart3.ChartAreas["ChartArea1"].AxisX.LabelAutoFitMinFontSize = 8;
this.chart3.Series.Clear();