Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР Моделирование.docx
Скачиваний:
23
Добавлен:
03.09.2019
Размер:
176.21 Кб
Скачать

2. Методы моделирования смо

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

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

Численные методы моделирования – преобразование модели к уравнениям, решение которых возможно методами вычислительной математики. Класс задач значительно шире. Однако численные методы не дают точных решений, но позволяют задать точность решения.

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

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

3. Исследование СМО аналитическими методами

3.1 Размеченный граф состояний

Тип исследуемой системы – многоканальная система без потерь с источником конечного числа требований.

Рис. 1 – Граф состояний системы

Здесь:

μ – интенсивность потока обслуживания;

λ – интенсивность входного потока;

N – число каналов обслуживания (N=2);

m – максимальное число заявок в СМО (m=6).

3.2 Определение вероятностей состояний

Количество каналов обслуживания:

Интенсивность потока обслуживания:

Интенсивность входного потока:

Максимальное число заявок в СМО:

3.2 Расчет основных показателей эффективности

Вероятность простоя системы:

Вероятность загрузки системы:

Вероятность отказа:

Среднее число требований в очереди:

Среднее число занятых каналов:

Среднее число заявок в системе:

Среднее время ожидания в очереди:

Среднее время пребывания

требования в системе:

4. Имитационное моделирование системы массового обслуживания

4.1 Блок–схема алгоритма имитации

Рис. 2 – Блок-схема алгоритма имитации

4.2 Листинг программы имитации СМО

Файл Model.cpp

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Windows.Forms;

using System.Collections;

namespace ModelingKR

{

public class Model

{

public static Random rnd;

int Nfree; //количество свободных каналов

SortedList<double, Event> server = new SortedList<double, Event>(2);//обрабатываемые задания

Queue<Event> waitqueue = new Queue<Event>(4); //очередь на выполнение

double ModelingTime; //время завершения моделирования (в часах)

double CurrentTime; //текущее время моделирования

double LastTime; //время на предыдущем такте

public static double LastEventTime; //время поступления предыдущего задания

int EventCount; //счетчик количества событий

double AvgWaitingTime; //среднее время ожидания в очереди

public double[] PP; //вероятности нахождения системы в состоянии PP[i], i=0..6

public Model()

{

rnd = new Random(DateTime.Now.Millisecond);

ModelingTime = 10;

Nfree = 2;

CurrentTime = LastTime = LastEventTime = 0;

EventCount = 0;

PP = new double[7];

for (int i = 0; i < 7; i++) PP[i] = 0;

}

public Model(double hours)

{

rnd = new Random(DateTime.Now.Millisecond);

ModelingTime = hours;

Nfree = 2;

CurrentTime = LastTime = LastEventTime = 0;

EventCount = 0;

PP = new double[7];

for (int i = 0; i < 7; i++) PP[i] = 0;

}

public class Event

{

public double Tin; //время поступления задания

public double Tidle; //время простоя

public double Twait; //время ожидания

public double Tbeginsrv; //время начала обработки задания

public double Tendsrv; //время завершения обработки задания

public double Tsrv; //интервал обработки задания

public double Treceipt; //интервал поступления заданий

public Event()

{

Treceipt = -300 * Math.Log(rnd.NextDouble(),Math.E);

Tin = Model.LastEventTime + Treceipt;

Tsrv = -90 * Math.Log(rnd.NextDouble(), Math.E);

Twait = Tbeginsrv = Tendsrv = Tidle = 0;

}

}

public double AverangeTaskCount()

{

double n0 = 0;

for (int i = 2; i < 7; i++)

{

n0 += i * PP[i];

}

return n0;

}

public double BusyThreadsCount()

{

return PP[1] + 2 * PP[2];

}

public double AverangeTaskTime()

{

return CurrentTime / EventCount;

}

public double AverangeWaitingTime()

{

return AvgWaitingTime / EventCount;

}

public void StartModeling()

{

Event Task = new Event();

int k = 0;

while (CurrentTime < HoursToMilliseconds(ModelingTime))

{

if (k < 6)

{

Task = new Event();

EventCount++;

CurrentTime += Task.Treceipt;

PP[k] += Task.Treceipt;

k++;

}

else

{

CurrentTime += (server.ElementAt(0).Key-LastTime);

PP[k] += (server.ElementAt(0).Key-LastTime);

}

for (int i = 2; i > 0; i--)

{

//если завершена обработка задания

if (server.Count!=0 && server.ElementAt(0).Key <= CurrentTime)

{

//если очередь на выполнение пуста

if (waitqueue.Count == 0)

{

server.RemoveAt(0); k--;

Nfree++;

}

else

{

Event tmp = waitqueue.Dequeue();

tmp.Tbeginsrv = server.First().Value.Tendsrv + 1;

tmp.Tendsrv = tmp.Tbeginsrv + tmp.Tsrv;

tmp.Twait = tmp.Tbeginsrv - tmp.Tin;

AvgWaitingTime += CurrentTime - tmp.Tin; //время ожидания в очереди

server.RemoveAt(0); k--; //Nfree++;

server.Add(tmp.Tendsrv, tmp); //Nfree--;

}

}

}

if (Nfree > 0)

{

Task.Tbeginsrv = Task.Tin;

Task.Tendsrv = Task.Tbeginsrv + Task.Tsrv;

server.Add(Task.Tendsrv, Task); Nfree--;

}

else //если нет свободных каналов, помещаем в очередь

if (Nfree == 0 && waitqueue.Count<=4)

{

if (waitqueue.Count < 4) waitqueue.Enqueue(Task);

}

LastEventTime = Task.Tin;

LastTime = CurrentTime;

}

for (int j = 0; j < 7; j++)

{

PP[j] = PP[j] / CurrentTime;

}

}

public static double HoursToMilliseconds(double hours)

{

return hours * 3600 * 1000;

}

}

}

Файл Form1.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Collections;

using System.IO;

namespace ModelingKR

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

this.button1.Enabled = false;

Model m = new Model(Convert.ToDouble(textBox1.Text), vector);

m.StartModeling();

List<ListViewItem> output = new List<ListViewItem>();

output.Add(new ListViewItem(new string[] { "Вероятность отказа системы", "0" }));

output.Add(new ListViewItem(new string[] { "Вероятность загрузки системы", Math.Round(1 - m.PP[0], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Вероятность простоя системы", Math.Round(m.PP[0], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Вероятность выполнения 1 задания", Math.Round(m.PP[1], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Вероятность выполнения 2 заданий", Math.Round(m.PP[2], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Вероятность выполнения 3 заданий", Math.Round(m.PP[3], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Вероятность выполнения 4 заданий", Math.Round(m.PP[4], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Вероятность выполнения 5 заданий", Math.Round(m.PP[5], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Вероятность выполнения 6 заданий", Math.Round(m.PP[6], 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Среднее число требований в очереди", Math.Round(m.AverangeTaskCount(), 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Среднее число занятых каналов", Math.Round(m.BusyThreadsCount(), 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Среднее число заявок в системе", Math.Round(m.BusyThreadsCount() + m.AverangeTaskCount(), 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Cреднее время пребывания требования в системе", Math.Round(m.AverangeTaskTime(), 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Cреднее время ожидания в очереди", Math.Round(m.AverangeWaitingTime(), 4).ToString() }));

output.Add(new ListViewItem(new string[] { "Полнота группы событий", Math.Round(m.PP[0] + m.PP[1] + m.PP[2] + m.PP[3] + m.PP[4] + m.PP[5] + m.PP[6], 2).ToString() }));

listView1.Items.Clear();

for (int i = 0; i < output.Count; i++) this.listView1.Items.Add(output[i]);

this.button1.Enabled = true;

}

private void textBox1_TextChanged(object sender, EventArgs e)

{

if (textBox1.Text.Length > 0)

{

textBox1.Text = textBox1.Text.Replace('.', ',');

textBox1.SelectionStart = textBox1.Text.Length;

try

{

Convert.ToDouble(textBox1.Text);

}

catch

{

MessageBox.Show("Введите числовое значение!", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

textBox1.Text = "10";

textBox1.SelectAll();

}

}

}

}

}