- •Содержание
- •Введение
- •Основные понятия теории моделирования систем
- •5) Планирование модельных экспериментов;
- •2. Классификация видов моделирования систем
- •3. Имитационные модели информационных процессов
- •4. Математические методы моделирования
- •5. Планирование модельных экспериментов
- •6. Компьютерное моделирование и вычислительный эксперимент
- •7. Статистическое моделирование
- •Контрольные вопросы
- •8. Метод Монте-Карло
- •Метод середины квадрата
- •9. Построение моделирующих алгоритмов
- •10. Компьютерное моделирование при обработке опытных данных
- •Интерполирование функций
- •11. Управление модельным временем
- •12. Инструментальные средства моделирования. Основные понятия языка gpss.
- •Блоки генерации и удаления транзактов
- •Блоки занятия и освобождения приборов
- •Пример 1
- •Блоки занятия и освобождения очереди
- •Пример 2
- •Подготовка и выполнение моделирования в gpss
- •13. Моделирование параллельных процессов.
- •14. Сети Петри
- •15. Оценка точности и достоверности результатов
- •16. Анализ и интерпретация результатов моделирования на эвм
- •17. Имитационное моделирование информационных сетей
- •18. Лабораторные работы
- •18.1. Лабораторная работа №1. Имитационное моделирование простых информационных процессов
- •Методические указания Краткие сведения о gpss
- •Пример моделирования на языке gpss
- •Задания на лабораторную работу
- •Содержание отчета по лабораторной работе
- •18.2. Лабораторная работа №2. Имитационное моделирование информационных процессов на языке высокого уровня. Модель с постоянным шагом.
- •Методические указания
- •Задание на лпбораторную работу
- •Содержание отчета по лабораторной работе
- •18.3. Лабораторная работа №3. Имитационное моделирование информационных процессов на языке высокого уровня. Модель через список будущих событий.
- •Методические указания
- •Задание на лабораторную работу
- •Содержание отчета по лабораторной работе
- •18.4. Лабораторная работа №4. Построение и исследование имитационной модели массового обслуживания на основе сетей Петри.
- •Методические указания
- •Задание на лабораторную работу
- •Содержание отчета по лабораторной работе
- •19. Курсовое проектирование Методика курсового проектирования
- •Примерные темы курсового проектирования
- •3. Моделирование работы кафе.
- •4. Моделирование работы обрабатывающего цеха.
- •5. Моделирование работы обрабатывающего цеха.
- •6. Моделирование работы обрабатывающего цеха.
- •7. Моделирование работы смо
- •8. Моделирование работы смо
- •9. Моделирование системы автоматизации проектирования
- •10. Моделирование работы транспортного цеха
- •Заключение
- •Библиографический список
Содержание отчета по лабораторной работе
1. Титульный лист.
2. Тема лабораторной работы.
3. Цель лабораторной работы.
4. Отражение хода лабораторной работы.
5. Вывод.
18.3. Лабораторная работа №3. Имитационное моделирование информационных процессов на языке высокого уровня. Модель через список будущих событий.
Цель работы: исследование возможностей и приобретение навыков использования имитационных моделей, реализованных с помощью языка С++ на основе модели через список будущих событий.
Методические указания
Рассмотрим процесс моделирования системы на языке С++. Пусть генерируются заявки каждые 5+-2 секунды, которые попадают в очередь. После этого транзакты поступают в ЭВМ и обрабатываются там втечении 8+-3 сек. Далее после обработки они удаляются из системы. Данный процесс показан на рисунке 18.3.
EVM
Рис. 18.3. Q-схема прохождения заявки
В этой задаче необходимо найти:
1. Количество поступивших заявок.
2. Обработанное количество заявок.
3. Текущее количество заявок в очереди.
4. Текущее количество заявок на обработке.
Форма приложения представлена на рисунке 18.4.
Рис. 18.4. Форма приложения
На ней показаны параметры модели, которые можно регулировать, кнопки запуска, выхода, а также результаты моделирования.
Заголовочный файл программы имеет вид:
model2.h
//-----------------------------------------------
#ifndef model2H
#define model2H
//-----------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//-----------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TLabel *Label1;
TEdit *Edit1;
TEdit *Edit2;
TLabel *Label2;
TLabel *Label3;
TEdit *Edit3;
TLabel *Label4;
TEdit *Edit4;
TLabel *Label5;
TEdit *Edit5;
TButton *Button1;
TGroupBox *GroupBox2;
TLabel *Label6;
TEdit *Edit6;
TLabel *Label7;
TEdit *Edit7;
TButton *Button2;
TLabel *Label8;
TEdit *Edit8;
TLabel *Label9;
TEdit *Edit9;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//определяем класс Очередь
class IM_Queue{
public:
String Name;//название
int Number;//номер
int Disciplina;//дисциплина обслуживания
int QueueSize;//длина очереди
void __fastcall Queue();//занесение транзакта в очередь
void __fastcall Depart();//удаление транзакта из очереди
};
//определяем класс Устройство
class IM_Device{
public:
String Name;//название
int Number;//номер
boolean Free;//true-свободно, false-занято
void __fastcall Seize();//занятие устройства
void __fastcall Release();//удаление транзакта из устройства
};
//определяем класс Событие
class IM_Event{
public:
String Name;//название события
int Type;//тип события
float Time;//время наступления события
};
//определяем класс Система
class IM_System{
public:
float Sim_Time;//модельное время
int Tranzakt_Value;//количество транзактов, попавших в систему
int Tranzakt_Process;//количество обработанных транзактов
IM_Event Events[2];//список будущих событий
IM_Queue q1;
IM_Device d1;
float tgen1,tgen2;//время генерация заявок
float tend;//время окончания моделирования
float t1evm1,t2evm1;//время обработки на ЭВМ1;
int num_events;//число событий в системе
int next_event_type;//следующий тип события
void __fastcall Init();//инициализация системы
void __fastcall Synhronize();//синхронизация событий
int __fastcall Generate_Interval(int time1,int time2);//планирование интервала time1+-time2
void __fastcall GoIn();//событие поступления заявки
void __fastcall GoOut();//событие ухода заявки
void __fastcall Report();//получение статистических данных
};
//-----------------------------------------------
extern PACKAGE TForm1 *Form1;
//-----------------------------------------------
#endif
Листинг формы представлен следующим образом:
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 образован от словосочетания “Имитационное Моделирование”. Программа сначала считывает исходные данные для моделирования и инициализирует состояние системы. Затем в цикле происходит выборка событий из списка будущих событий. Цикл продолжается до тех пор, пока не истечен заданный период имитации.
