Система массового обслуживания
Курсовая работа, 18 Декабря 2014, автор: пользователь скрыл имя
Описание работы
Процессы функционирования различных систем и сетей связи могут быть представлены той или иной совокупностью систем массового обслуживания (СМО) - стохастических, динамических, дискретно-непрерывных математических моделей. Исследование характеристик таких моделей может проводиться либо аналитическими методами, либо путем имитационного моделирования.
Файлы: 1 файл
ПЗ.docx
— 190.17 Кб (Скачать файл)Для разработки модели системы будем использовать классы, экземпляры класса, методы и поля:
IM_Queue – класс для очередей канала предварительного обслуживания и трех миниЭВМ;
queueK1, queueEVM1, queueEVM2, queueEVM3 – экзепляры класса IM_Queue: очередь канала предварительного обслуживания, очередь миниЭВМ1, очередь миниЭВМ2, очередь миниЭВМ3;
Queue() – метод занесения сигнала в очередь;
Depart() – метод удаления сигнала из очереди;
Name – название очереди;
Number – номер очереди;
QueueSize – длина очереди;
IM_Device – класс для канала предварительного обслуживания и трех миниЭВМ;
K1, EVM1, EVM2, EVM3 – экземпляры класса IM_Device: канал предварительного обслуживания, миниЭВМ1, миниЭВМ2, миниЭВМ3;
Seize() – метод занятие устройства;
Release() – метод освобождения устройства;
Name – название устройства;
Number – номер устройства;
Free – занятость устройства;
IM_Event – класс для событий прихода и ухода сигнала;
IM_Event1 – класс, производный от класса IM_Event, для события поступления сигнала.
IM_Event2 – класс, производный от класса IM_Event, для события ухода сигнала из первой миниЭВМ;
IM_Event3 – класс, производный от класса IM_Event, для события ухода сигнала из второй миниЭВМ;
IM_Event4 – класс, производный от класса IM_Event, для события ухода сигнала из третьей миниЭВМ;
Name – имя события;
Type – тип события;
Time – время события;
IM_System – класс для реализации работы системы;
Init() – метод инициализации системы;
Synhronise() – метод синхронизации системы;
Generate_Interval_tgen(int time1, int time2) – метод планирования интервала time1+-time2 для генерации заявки;
Generate_Interval_tevm1(int time1, int time2) – метод планирования интервала time1+-time2 для обработки сигнала в канале предварительного обслуживания;
TestQueueK1() – метод для проверки сигналов в очереди канала предварительного обслуживания;
GoIn() – метод события поступления сигнала;
GoOut() – метод события ухода сигнала;
В проект включены следующие переменные:
tend – количество входных сигналов.
kol_Otkasov – количество потерянных сигналов.
Sim_Time – модельное время.
Tranzakt_Value – количество сигналов, попавших в систему.
Tranzakt_Process – количество обработанных сигналов.
timeReliaseK1 – время освобождения канала предварительного обслуживания.
tgen1, tgen2 – время генерации сигналов.
t1K1, t2K1 – время обработки в канале предварительного обслуживания.
t2EVM123 – время обработки в любой системе.
num_events – число событий в системе.
next_event_type – следующий тип события.
TimeObrVK1 – время обработки в канале предварительного обслуживания.
Текст программы разработанной модели системы:
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;
using System.Collections;
namespace _Курсовой_проект_по_Моделированию
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//определяем класс Очередь
class IM_Queue
{
public string Name; //название
public int Number; //номер
public int QueueSize; //длина очереди
public void Queue() //занесение транзакта в буфер
{
QueueSize++; //увеличиваем длину очереди
}
public void Depart() //удаление транзакта из буфера
{
QueueSize--; //уменьшаем длину очереди
}
}
//определяем класс Устройство
class IM_Device
{
public string Name; //название
public int Number; //номер
public bool Free; //true - свободно, false - занято
public void Seize() //занятие устройства
{
Free = false;//устройство занято
}
public void Release()//удаление транзакта из устройства
{
Free = true;//устройство свободно
}
}
//определяем класс Событие
class IM_Event
{
public string Name; //название события
public int Type; //тип события
public float Time; //время наступления события
public IM_Event(string Name, int Type, float Time)
{
this.Name = Name;
this.Type = Type;
this.Time = Time;
}
}
class IM_Event1 : IM_Event//события для поступившей заявки
{
public IM_Event1(string Name, int Type, float Time)
: base(Name, Type, Time)
{ }
}
class IM_Event2 : IM_Event//событие для ухода заявки из первой миниЭВМ
{
public IM_Event2(string Name, int Type, float Time)
: base(Name, Type, Time)
{ }
}
class IM_Event3 : IM_Event//событие для ухода заявки из второй миниЭВМ
{
public IM_Event3(string Name, int Type, float Time)
: base(Name, Type, Time)
{
}
}
class IM_Event4 : IM_Event//событие для ухода заявки из третьей миниЭВМ
{
public IM_Event4(string Name, int Type, float Time)
: base(Name, Type, Time)
{
}
}
//определяем класс Система
class IM_System
{
int kol_Otkasov;
public IM_Event[] EventsArray = new IM_Event[4];
public float Sim_Time; //модельное время
public int Tranzakt_Value; //количество транзактов, попавших в систему
public int Tranzakt_Process; //количество обработанных транзактов
public float timeReleaseK1; //время освобождения канала
public int tgen1, tgen2; //время генерации заявок
public int tend; //количество входных заявок
public int t1K1, t2K1; //время обработки в канале предварительного обслуживания
public int t2EVM123; //время обработки в любой миниЭВМ
public int num_events; //число событий в системе
public int next_event_type; //следующий тип события
public int TimeObrVK1; //время обработки в канале
Random random = new Random();
IM_Queue queueK1 = new IM_Queue { Name = "Очередь 1", Number = 1, QueueSize = 0 };
IM_Queue queueEVM1 = new IM_Queue { Name = "Очередь EVM1", Number = 1, QueueSize = 0};
IM_Queue queueEVM2 = new IM_Queue { Name = "Очередь EVM2", Number = 2, QueueSize = 0};
IM_Queue queueEVM3 = new IM_Queue { Name = "Очередь EVM3", Number = 3, QueueSize = 0};
IM_Device K1 = new IM_Device { Name = "Канал предварительного обслуживания", Number = 1, Free = true };//устройство свободно
IM_Device EVM1 = new IM_Device { Name = "EVM1", Number = 1, Free = true};
IM_Device EVM2 = new IM_Device { Name = "EVM2", Number = 2, Free = true};
IM_Device EVM3 = new IM_Device { Name = "EVM3", Number = 3, Free = true};
public void Init() //инициализация системы
{
//инициализация модельного времени
и состояния системы
Sim_Time = 0.0f;
Tranzakt_Value = 0;
Tranzakt_Process = 0;
num_events = 4;
//планирование первого события
EventsArray[0] = new IM_Event1("Генерация заявки", 0, Sim_Time + Generate_Interval_tgen(tgen1, tgen2));
EventsArray[1] = new IM_Event2("Окончание обслуживания заявки в EVM1", 1, 1.0e+30f);//событие произойдет во времени 10 в 30
EventsArray[2] = new IM_Event3("Окончание обслуживания заявки в EVM2", 2, 1.0e+30f);
EventsArray[3] = new IM_Event3("Окончание обслуживания заявки в EVM3", 3, 1.0e+30f);
}
public void Synhronise() //синхронизация событий
{
float min_time_next_event = 1.0e+29f;//берем для сравнения большое число
next_event_type = -1;//предполагаем, что событий нет
//открываем цикл, в котором определяем событие с наименьшим временем
for (int i = 0; i < num_events; i++)
{
if (EventsArray[i].Time < min_time_next_event)
{
min_time_next_event = EventsArray[i].Time;
next_event_type = i;//отыскиваем тип события
}
}
//если событий нет, то завершаем моделирование
if (next_event_type == -1)
{
MessageBox.Show("Список событий пуст");
Environment.Exit(0);
}
//переводим модельные часы на ближайшее событие
Sim_Time = min_time_next_event;
}
public int Generate_Interval_tgen(int time1, int time2)//планирование интервала time1 +-time2 для генерации заявки
{
int result = random.Next(11)+5;
return result;
}
public int Generate_Interval_tevm1(int time1, int time2)//планирование интервала time1 +-time2 для обработки заявки
{
int result = random.Next(7)+7;// то есть интервал 7-13 или 10+-3
TimeObrVK1 = result;
return result;
}
public void TestQueueK1()//проверка: есть ли заявки в очереди канала
{
if (queueK1.QueueSize> 0)
{
K1.Free = false;
queueK1.Depart();
timeReleaseK1 = Sim_Time + random.Next(7) + 7;
}
}
public void GoIn() //событие поступления заявки
{
Tranzakt_Value++;//увеличиваем число поступивших транзактов (количество заявок всех типов)
//если устройство свободно, то
занимаем его для текущей заявки
queueK1.Queue();
if ((K1.Free == true) && (queueK1.QueueSize > 0))
{
queueK1.Depart();
K1.Seize();
//планируем время обработки в устройстве
timeReleaseK1 = Sim_Time + Generate_Interval_tevm1(t1K1, t2K1);
}
//планируем время поступления следующей заявки
EventsArray[0].Time = Sim_Time + Generate_Interval_tgen(tgen1, tgen2);
//проверка: если заявка обработана в канале пред обслуж, то она передается одной из миниЭВМ
if ((timeReleaseK1 < EventsArray[0].Time) && (K1.Free == false))
{
K1.Release();//освобождаем канал
if ((queueEVM1.QueueSize == 10) && (queueEVM2.QueueSize == 10) && (queueEVM3.QueueSize == 10))
{
kol_Otkasov++;
//dataGridView2[u, 1].Value = takt_Mod_Vremeni;
//u++;
TestQueueK1();
}
else
//проверка на меньшую очередь
if ((queueEVM1.QueueSize <= queueEVM2.QueueSize) && (queueEVM1.QueueSize <= queueEVM3.QueueSize))
{
queueEVM1.Queue();
if (EVM1.Free == true)
{
EVM1.Seize();
queueEVM1.Depart();
EventsArray[1].Time = Sim_Time + t2EVM123;
}
TestQueueK1();
}
else
if ((queueEVM2.QueueSize<=queueEVM1.QueueSize) && (queueEVM2.QueueSize<=queueEVM3.QueueSize))
{
queueEVM2.Queue();
if(EVM2.Free == true)
{
EVM2.Seize();
queueEVM2.Depart();
EventsArray[2].Time = Sim_Time + t2EVM123;
}
TestQueueK1();
}
else
if ((queueEVM3.QueueSize<=queueEVM1.QueueSize) &&(queueEVM3.QueueSize<=queueEVM2.QueueSize))
{
queueEVM3.Queue();
if(EVM3.Free == true)
{
EVM3.Seize();
queueEVM3.Depart();
EventsArray[3].Time = Sim_Time + t2EVM123;
}
TestQueueK1();
}
}
}
public void GoOut() //событие ухода заявки
{
Tranzakt_Process++;//увеличиваем число обработанных
транзактов
EventsArray[next_event_type].Time = 1.0e+30f;