![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
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 образован от словосочетания “Имитационное Моделирование”. Программа сначала считывает исходные данные для моделирования и инициализирует состояние системы. Затем в цикле происходит выборка событий из списка будущих событий. Цикл продолжается до тех пор, пока не истечен заданный период имитации.
|