Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Model2.cpp






//-----------------------------------------------

#include < vcl.h>

#pragma hdrstop

#include " model2.h"

//-----------------------------------------------

#pragma package(smart_init)

#pragma resource " *.dfm"

TForm1 *Form1;

//-----------------------------------------------

void __fastcall IM_System:: Init(){

//инициализация модельного времени и состояния системы

Sim_Time=0.0;

Tranzakt_Value=0;

Tranzakt_Process=0;

q1.Name=" Очередь 1";

q1.Number=1;

q1.QueueSize=0; //очередь пуста

d1.Name=" Устройство 1";

d1.Number=1;

d1.Free=True; //устройство свободно

//считывание данных с формы

tgen1=StrToInt(Form1-> Edit1-> Text);

tgen2=StrToInt(Form1-> Edit2-> Text);

tend=StrToInt(Form1-> Edit3-> Text);

t1evm1=StrToInt(Form1-> Edit4-> Text);

t2evm1=StrToInt(Form1-> Edit5-> Text);

num_events=2; //определяем число событий

//планирование первого события

Events[0].Name=" Генерация заявки";

Events[0].Type=0;

Events[0].Time=Sim_Time+Generate_Interval(tgen1, tgen2);

Events[1].Name=" Окончание обслуживания заявки";

Events[1].Type=1;

Events[1].Time=1.0e+30; //событие произойдет во времени 10 в 30

}

void __fastcall IM_System:: Synhronize(){

float min_time_next_event=1.0e+29; //берем для сравнения большое число

next_event_type=-1; //предполагаем, что событий нет

//открываем цикл, в котором определяем событие с наименьшим временем

for (int i=0; i< num_events; i++){

if (Events[i].Time< min_time_next_event){

min_time_next_event=Events[i].Time;

next_event_type=i; //отыскиваем тип события

}

}

//если событий нет, то завершаем моделирование

if (next_event_type==-1){

ShowMessage(" Список событий пуст");

exit(1);

}

//переводим модельные часы на ближайшее событие

Sim_Time=min_time_next_event;

}

int __fastcall IM_System:: Generate_Interval(int time1, int time2){

Randomize();

return (time1-time2)+random(2*time2+1);

}

void __fastcall IM_System:: GoIn(){

Tranzakt_Value++; //увеличиваем число поступивших транзактов

//планируем время поступления следующей заявки Events[0].Time=Sim_Time+Generate_Interval(tgen1, tgen2);

//если устройство свободно, то занимаем его для текущей заявки

if (d1.Free){

d1.Seize();

//планируем время обработки в устройстве

Events[1].Time=Sim_Time+Generate_Interval(t1evm1, t2evm1);

}

//иначе заносим транзакт в очередь

else{

q1.Queue();

}

}

void __fastcall IM_System:: GoOut(){

Tranzakt_Process++; //увеличиваем число обработанных транзактов

//если очередь свободна, то делаем устройство незанятым

if (q1.QueueSize==0){

d1.Release();

//исключаем следующее событие обработки заявки

Events[1].Time=1.0e+30;

}

//иначе выбираем из очереди следующий элемент

else{

q1.Depart();

//планируем время обработки следующей заявки

Events[1].Time=Sim_Time+Generate_Interval(t1evm1, t2evm1);

}

}

 

void __fastcall IM_System:: Report(){

Form1-> Edit6-> Text=IntToStr(Tranzakt_Value);

Form1-> Edit7-> Text=IntToStr(Tranzakt_Process);

Form1-> Edit8-> Text=IntToStr(q1.QueueSize);

if (d1.Free)//если устройство свободно

Form1-> Edit9-> Text=" 0";

else

Form1-> Edit9-> Text=" 1";

 

}

//-----------------------------------------------

void __fastcall IM_Queue:: Queue(){

QueueSize++; //увеличиваем длину очереди

}

void __fastcall IM_Queue:: Depart(){

QueueSize--; //уменьшаем длину очереди

}

//-----------------------------------------------

void __fastcall IM_Device:: Seize(){

Free=False; //устройство занято

}

void __fastcall IM_Device:: Release(){

Free=True; //устройство свободно

}

//-----------------------------------------------

void __fastcall TForm1:: Button1Click(TObject *Sender)

{

IM_System System1; //объявление новой системы моделирования

System1.Init();

System1.Synhronize(); //синхронизируем события

//открываем цикл до тех пор, пока не наступит заданное время моделирования

while (System1.Sim_Time< =System1.tend)

{

//выбираем тип события

switch (System1.next_event_type){

case 0:

System1.GoIn(); //поступление заявки

break;

case 1:

System1.GoOut(); //удаление заявки

break;

}

System1.Synhronize(); //синхронизируем события

}

System1.Report();

}

//-----------------------------------------------

void __fastcall TForm1:: Button2Click(TObject *Sender)

{

exit(1);

}

//-----------------------------------------------

 

В заголовочном файле model2.h описываются классы: IM_Queue – Очередь, IM_Device – Устройство, IM_Event – Событие, IM_System - Система. Префикс IM образован от словосочетания “Имитационное Моделирование”. Программа сначала считывает исходные данные для моделирования и инициализирует состояние системы. Затем в цикле происходит выборка событий из списка будущих событий. Цикл продолжается до тех пор, пока не истечен заданный период имитации.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.