Для разработки
модели системы будем использовать классы,
экземпляры класса, методы и поля:
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;
//освобождение ЭВМ
if ((next_event_type == 1) && (EVM1.Free == false))