Разработка библиотеки имитационного моделирования. Система массового обслуживания. Модель комиссионного магазина
Создание библиотеки классов имитационного моделирования и реализация алгоритма имитационного моделирования системы массового обслуживания "Модель комиссионного магазина". Использование для разработки среды программирования C++. Словарь предметной области.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.01.2013 |
Размер файла | 581,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Таблица 2
№ |
Название абстракции |
Характеристика абстракции |
|
1 |
Структурный элемент Q-схемы |
Входит в структуру Q-схемы Имеет какие-либо связи (характер связей не определен) |
|
2 |
Обработчик заявок |
Входит в структуру Q-схемы Обрабатывает заявки Имеет информационные связи (входные или выходные, или входные и выходные одновременно) |
|
3 |
Контроллер группы клапанов |
Входит в структуру Q-схемы Не обрабатывает заявок Имеет управляющие связи (характер связей неизвестен) Не имеет информационных связей |
|
4 |
Передатчик |
Входит в структуру Q-схемы Обрабатывает заявки Имеет выходные информационные связи Выдает заявки (с задержкой либо без нее) |
|
5 |
Приемник |
Входит в структуру Q-схемы Обрабатывает заявки Имеет входные информационные связи Принимает заявки |
|
6 |
Передатчик с задержкой |
Входит в структуру Q-схемы Обрабатывает заявки Имеет выходные информационные связи Выдает заявки Задерживает заявки (по времени в соответствии с заданным законом распределения) |
|
7 |
Объект управления |
Входит в структуру Q-схемы Обрабатывает заявки Имеет входные управляющие связи Характеризуется функцией управления |
5.1.2 Определение отношений между абстракциями
Иерархия классов получается из табл.1 и табл.2 путем последовательного установления отношения "общее - частное" для всех абстракций, а также определения отношения использования и ассоциации. Иерархия показана на рис.1. Прямоугольниками отображены основные элементы Q-схем (которые непосредственно изображаются на схеме), а овалами показаны дополнительные абстракции. Сплошными стрелками изображено отношение открытого наследования, которое представляет в иерархии отношение "общее - частное", а пунктиром показаны ассоциации и отношение использования между абстракциями.
Каждая из абстракций иерархии рис.1 далее представляется в виде сущности одного из трех видов: класса (структуры), шаблонного класса или функции на языке С++. Переход от абстракций к сущностям на С++ осуществляется в следующем разделе. Ниже в табл.3 записано соответствие сущностей С++ выделенным абстракциям и даны имена (идентификаторы) сущностей.
Таблица 3
Наименование абстракции |
Вид сущности |
Идентификатор сущности |
|
Структурный элемент Q-схемы |
класс |
CGenericElement |
|
Обработчик заявок |
класс |
CReqAwareElement |
|
Объект управления |
класс |
CObjectOfControl |
|
Приемник |
класс |
CReceiver |
|
Передатчик |
класс |
CTransmitter |
|
Передатчик с задержкой |
шаблон |
CDelayedTransmitter |
|
Неуправляемый генератор заявок |
шаблон |
CReqGenerator |
|
Управляемый генератор заявок |
CControlledReqGenerator |
||
Канал |
шаблон |
CDevice |
|
Клапан |
класс |
CGate |
|
Абстрактная очередь |
шаблон |
CQueue |
|
Бесконечная очередь |
шаблон |
CUnlimitedQueue |
|
Конечная очередь |
шаблон |
CLimitedQueue |
|
Контроллер группы клапанов |
класс |
CMassGateController |
|
Простой случайный контроллер |
класс |
CRndGateController |
|
Адаптивный случайный контроллер |
класс |
CSmartRndGateController |
|
Обобщенный массовый контроллер |
класс |
CCustomMassGateController |
|
Q-схема |
класс (с единственным объектом) |
CQChart |
|
Заявка |
класс |
CReq |
|
Структура Q-схемы |
набор структур |
- |
|
Генератор случайных чисел |
шаблон |
Определяется пользователем |
|
Дисциплина обслуживания |
шаблон |
Определяется пользователем |
|
Функция управления |
callback-функция |
Определяется пользователем |
|
Менеджер статистики |
класс (с единственным объектом) |
CStatManager |
|
Менеджер ошибок |
класс (с единственным объектом) |
CErrorManager |
6. Разработка библиотеки классов иммитационного моделирования
6.1 Разработка структуры библиотеки
Структура библиотеки должна обеспечивать удобство ее использования при построении проектов пользователем. При этом она должна предоставлять возможность внедрения кода пользователя в контекст сущностей библиотеки с целью обеспечения открытости и гибкости. Так, необходима возможность добавления определенных пользователем классов генераторов случайных чисел для реализации специальных законов распределения генераторов заявок и каналов, введения новых функций управления клапанами и дисциплин обслуживания в очередях. Это же касается и обобщенных массовых контроллеров, которые по определению должны включать код пользователя, представляющий закон управления клапанами.
Состав модулей и заголовочных файлов библиотеки вместе с описанием их назначения представлены в табл.4.
Таблица 4
№№ |
Имя модуля |
Назначение модуля |
|
1 |
qchartelements. h qchartelements. cpp |
Содержит определения и реализации классов основных элементов Q-схемы |
|
2 |
qchart. h qchart. cpp |
Включает определение и реализацию классов CQChart и CStatManager, а также дополнительных классов для поддержки цикла моделирования |
|
3 |
qchartexcept. h qchartexcept. cpp |
Содержит определение и реализацию класса CErrorManager и иерархию классов исключительных ситуаций для представления ошибок |
|
4 |
qchartgatectrl. h qchartgatectrl. cpp |
Определяет ряд стандартных функций для управления клапанами и управляемыми генераторами (например, И, ИЛИ, И-НЕ, ИЛИ-НЕ) |
|
5 |
qchartstdhdr. h |
Стандартный заголовочный файл, обеспечивающий компоновку проектов и содержащий макросы для упрощения интерфейса библиотеки |
|
6 |
qchartcommon. h |
Описывает общеиспользуемые типы библиотеки |
|
7 |
qchartrndgen. h |
Содержит определения шаблонных классов типовых генераторов случайных чисел (фиксированный, равномерный закон, экспоненциальный) |
|
8 |
qchartqdisc. h |
Определяет классы для реализации стандартных дисциплин обслуживания (FIFO, LIFO) |
Рисунок 2. Структура библиотеки
Структура библиотеки представлена диаграммой на рис.2
Листинги модулей библиотеки представлены в приложении 2.
Заключение
Созданная библиотека классов позволила разработать на её основе программу, моделирующую СМО. Разработанная в ходе выполнения курсового проекта имитационная модель системы массового обслуживания "Гараж" является актуальной на сегодняшний день, так как предоставляет большие возможности для анализа работы системы и принятия решений в различных ситуациях на практике.
Моделируя реальные процессы, пользователь может проследить весь цикл работы системы. На основе полученных данных подобрать наиболее оптимальные параметры, повышая эффективность системы и снижая затраты на ее обслуживание.
В ходе разработки данного проекта были приобретены практические навыки системного исследования реальной динамической сложной системы на основе построения ее имитационной модели.
Также были решены задачи, поставленные в начале работы. Мной были разработаны собственные алгоритмы для решения этих задач. Разработанная программа устойчиво выполняет все свои функции, но теперь стоит задача сделать ее более совершенной и более расширенной.
Библиографический список
1. Акоф Р., Сасиени М. Основы исследования операций. Пер. с англ. М.: Мир, 1971.
2. Антони Синтес. Освой самостоятельно объектно-ориентированное программирование за 21 день - М.: "Вильямс", 2002.
3. Балашевич В.А., Андронов А.М. Экономико-математическое моделирование производственных систем.: Учеб. Пособие для вузов. Мн.: Унiверсiтэцкае, 1995.
4. Гаранин М.В., Журавлев В.И., Кунегин С.В. Системы и сети передачи информации. - М.: Радио и связь, 2001.
5. Иан Грэхем Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. - 3-е изд. - М.: "Вильямс", 2004.
6. Павловская Т.А. Программирование на языке высокого уровня. С - Пб.: Питер, 2004.
7. Экономико-математические методы и модели. / Уч. пос. для вузов Под ред. Кузнецова. Мн.: БГЭУ, 1999.
8. Советов Б.Я. Моделирование систем [Текст]: учебник для студ. вузов. - 3-е изд., переаб. и доп. - М.: Высшая школа, 2001. - 343 с.: ил.
9. Шелухин О.И. Моделирвоание информационных систем: учеб. пособие для студ. вузов. - М.: САЙНС - ПРЕСС, 2005. - 367с.
10. Молчанов А.А. Моделирование и проектирование сложных систем: учеб. пособие для студ. вузов. - Киев: Вища школа, 1988. - 360 с.
11. Бусленко Н.П. Моделирование сложных систем.2-е изд., пераб. - М.: Наука, 1978. - 400 с.
12. Лифшиц А.Л. Статистическое моделирование СМО, М., 1978.
13. Томашевский В., Жданова E. Имитационное моделирование в среде GPSS. - М.: Бестселлер, 2003. - 416 c.
Приложения
Приложение №1
Q-схема:
Приложение №2
Листинг программы.
class QShema; // предварительное объявление Q-схемы
// глобально уникальный идентификатор заявок
extern unsigned __int64 req_enumerator;
class structelem
{public:
// конструктор и деструктор
explicit __fastcall structelem(const std::string & name):
_psvyazi(0), __name(name), __id(0)
{
;
}
virtual ~structelem() = 0;
// общая информация об элементе (для класса CQChart::CStatManager)
const std::string & GetName() const { return __name; }
int GetID() const { return __id; }
protected:
SxemaElem_t * _psvyazi;
// указатель на элемент структуры Q-схемы с описанием связей
private:
std::string __name; // символическое имя элемента
int __id; // числовой идентификатор элемента
};
class obyavZayav: virtual public structelem
{ public: public:
// конструктор и деструктор
explicit __fastcall obyavZayav(const std::string & name):
structelem(name)
virtual ~obyavZayav() { }
// установка признака пометки обработанных заявок
void SetMarksObrZayav() { _marksObrZayav = true; }
// получение состояния
virtual state_t GetState() const = 0;
protected:
class Zayavka { // класс "заявка"
//моделирует ассоциацию элементов с заявками методов вложения
public:
// конструктор
explicit __fastcall Zayavka {
__VremPoyav = __TekVrem = 0;
__obrabot = false;
__psoderg = NULL;
__cntrazmer = 0;
}
Zayavka() {
if ( __psoderg ) free( __psoderg );
}
// информация
size_t TekVrem() const { // время пребывания заявки в системе
return __TekVrem;
}
size_t GetVremPoyav() const { // время появления заявки в системе
return __VremPoyav;
}
bool GetObrabot() const { // признак обработки заявки
return __obrabot;
}
// счет времени пребывания заявки в системе
void __fastcall SetTekVrem(size_t vrem) { __TekVrem = vrem; }
void __fastcall SetVremPoyav(size_t vrem) { __VremPoyav = vrem; }
// пометка обработанной заявки
void SetObrabot() { __Obrabot = true; }
// получение идентификатора текущей заявки
unsigned __int64 GetID() const { return __id; }
// задание идентификатора текущей заявки генератором
void SetID(unsigned __int64 id) { __id = id; }
// получение содержимого заявки
void GetSoderg(void * psoderg, size_t & cntrazmer);
// изменение содержимого заявки
void SetSoderg(const void * psoderg, size_t cntrazmer);
private:
//уникальный идентификатор данной заявки
unsigned __int64 __id;
size_t __VremPoyav; // время появления заявки в системе
size_t __TekVrem; // текущая временная метка
// используется для подсчета времени пребывания заявки в системе
void * __psoderg; // указатель на определенное пользователем
//содержимое заявки
size_t __cntrazmer; // размер содержимого в байтах
};
bool _marksObrZayav; // признак пометки обработанных заявок
private:
// избыточные функции
obyavZayav(const obyavZayav &);
obyavZayav & operator = (const obyavZayav &);
template <class uprfunction> class objectupr: virtual public structelem
{ public:
// конструктор и деструктор
explicit __fastcall objectupr
(const std::string & name, ctrlfunc_t pctrlfunc): structelem(name)
{
try {
_UprElemmap = new IDUprElemmap_t();
}
_pfuncupr = pfuncupr;
_ctrlcount = 0;
}
~objectupr() { delete _uprelemmap; }
protected:
// разрешающие управляющие сигналы
IDUprElemmap_t * _UprElemmap;
// первая компонента map - идентификатор управляющего элемента
// вторая - указатель на управляющий элемент + разрешающее состояние этого элемента
// функция формирования общего сигнала управления
funcupr_t * _pfuncupr;
// число элементов, управляющих элементом
size_t _KolichUprElem;
// индикация состояния объекта управления (разрешенное или запрещенное)
bool _Razresh() const;
private:
// добавление разрешающего сигнала
void __DobavRazreshSignal(structelem *, state_t, float,
structelem *, state_t);
// удаление разрешающего сигнала
void __fastcall __UdalitRazreshSignal(structelem * pcontroller);}
class priemnik: virtual public obrabotzayavok
{ public:
// конструктор и деструктор
explicit __fastcall priemnik(const std::string & name):
structelem(name), obyavZayav(name)
{
;
}
~priemnik() { }
protected:
virtual void __fastcall _Priem(Zayavka *) = 0; // прием заявки
virtual bool _GotovKPriem() const = 0; // готовность к приему заявки
private:
};
class peredatchik: virtual public obrabotzayavok
{ public:
// конструктор и деструктор
explicit __fastcall peredatchik(const std::string & name):
structelem(name), obyavZayav(name)
{
;
}
~ peredatchik() { }
protected:
virtual Zayavka * __fastcall _Peredacha(Zayavka * req = 0) = 0; // выдача заявки
// информация
virtual bool _GotovKPeredache() const = 0; // готовность к выдаче заявки
private:
};
template <class randomgenerator> class peredatchikszader: public peredatchik
{ public:
// конструктор и деструктор
explicit __fastcall peredatchikszader(const std::string & name):
structelem(name), obyavZayav(name), peredatchik(name),
_ObrZayav(0), _VremyaVidachi(0), _OprVremyaVidachi(false)
{
;
}
~peredatchikszader()
// информация
virtual state_t GetState() const { // проверка состояния
return _ObrZayav == 0 ? pusto : zanyat;
}
protected:
// поведение
virtual void _VremyaSozdZayav() = 0; // время выхода заявки
Zayavka * _ObrZayav; // заявка, находящаяся на обработке
size_t _VremyaVidachi; // время выдачи заявки
bool _OprVremyaVidachi; // признак определенности времени выдачи
private:
};
template <class randomgenerator>
class GeneratorZayavok: public peredatchikszader {
// генератор заявок (элемент, который выдает заявки через случайное время)
// конструктор и деструктор
explicit __fastcall GeneratorZayavok(const std::string & name):
structelem(name), obyavZayav(name), peredatchikszader(name)
{
;
}
~GeneratorZayavok() { }
protected:
// поведение
virtual Zayavka * __fastcall _Peredacha(Zayavka *) { // выдача (генерация) заявки
_OprVremyaVidachi = false;
Zayavka * tmObrZayav = _ObrZayav; _ObrZayav = 0;
// задание момента появления заявки
tmObrZayav->SetVremPoyav;
tmObrZayav->SetTekVrem;
}
return tmObrZayav;
}
virtual void _GenerateVremyaVidachi() { // время выхода заявки
try {
_VremyaVidachi = randomgenerator::GetValue();
}
if (_VremyaVidachi < 1) _VremyaVidachi = 1;
_OprVremyaVidachi = true;
try {
__VidachaZayavki();
}
// информация
virtual bool _GotovKPeredache() const { // готовность к выдаче заявки
return _OprVremyaVidachi && _VremyaVidachi == 0;
}
private:
void __VidachaZayavki() throw(std::bad_alloc);
// избыточные функции
virtual state_t GetState() const { // получение состояния
return zanyat;
}
};
template <class randomgenerator>
class kanal: public obrabotzayavok
// "канал (устройство)" (принимает, обрабатывает и выдает заявки
// через время, определяемое заданным законом распределения)
public:
// конструктор и деструктор
explicit __fastcall kanal(const std::string & name):
structelem(name), obyavZayav(name), obrabotzayavok(name)
{
__DlinObslujZayav= 0;
}
~kanal() { }
protected:
// поведение
virtual void _GenerateVremyaVidachi() { // время выхода заявки
if(_ObrZayavka != 0) {
try { // контроль средств пользователя
__DlinObslujZayav= _VremyaVidachi = randomgenerator::Poluchznach();
}
}
virtual Zayavka * __fastcall _Peredacha(Zayavka *) { // выдача обслуженной заявки
Zayavka* tmpObrZayavka = _ObrZayavka;
_ObrZayavka = 0;
if (tmpObrZayavka != NULL && this->_marksObrZayav)
tmpObrZayavka->SetObrabot(); // заявка обработана
return tmpObrZayavka;
}
virtual void __fastcall _Priemnik(Zayavka * req) { // прием заявки
_OprVremyaVidachi = false;
if (_ObrZayavka != 0)
_ObrZayavka = req;
}
private:
size_t __DlinObslujZayav; // хранит длительность обслуживания заявки
// для расчета загрузки канала
};
template <class uprfunction> class klapan: public peredatchik, public priemnik, public objectupr <uprfunction>
{ public:
// конструктор и деструктор
explicit __fastcall klapan(const std::string & name, funcupr_t pfuncupr NachFuncUpr):
structelem(name), objectupr(name, pfuncupr), obyavZayav(name),
priemnik(name), peredatchik(name)
{
__tmpObrZayav = 0;
}
~klapan() { }
protected:
// поведение
virtual void __fastcall _Priem(Zayavka * ObrZayavka) //принять заявку
{__tmpObrZayav = ObrZayav;
}
virtual Zayavka * __fastcall _Peredacha(Zayavka *)//передать заявку
{ Zayavka * tmObrZayav = __tmObrZayav; __tmpObrZayav = 0;
if (this->_marksObrZayav) tmObrZayav->SetObrabot();
// клапаны тоже могут помечать заявки как обработанные
return tmObrZayav;
}
// информация
virtual bool _GotovKPriem() const { // готовность к приему заявки
return _Razresh();
}
virtual bool _GotovKPeredache() const { // готовность к выдаче заявки
return __tmObrZayav != 0;
}
Zayavka * __tmObrZayav; // заявка хранится один такт, пока клапан не выдаст её дальше
private:
virtual state_t GetState() const { // получение состояния
return pusto; // клапан никогда не содержит заявок
};
typedef struct ListZayav_t {
obrabotzayavok::Zayav * ObrZayav; // указатель на заявку
ListZayav_t * SledZayav; // указатель на следующую заявку
ListZayav_t * PredZayav; // указатель на предыдущую заявку
} ListZayav_tag;
class ochered: public peredatchik, public priemnik
{ public:
// конструктор
explicit __fastcall ochered(const std::string & name):
structelem(name), obyavZayav(name), priemnik(name), peredatchik(name)
{
_dlina = 0; _NachaloListZayav = 0; _KonetsListZayav = 0;
}
// деструктор
~ochered() { ; }
// получение состояния
virtual state_t GetState() const {
return _length != 0 ? zanyat : pusto;
}
// получение текущей длины
size_t GetDlina() const { return _dlina; }
// выдача времени генерации наиболее старой хранимой заявки
bool __fastcall GetMinTekVrem(size_t & TekVrem) const;
protected:
// информация
virtual bool _GotovKPeredache() const { // готовность к выдаче заявки
return _dlina > 0;
}
// готовность к приему зависит от наличия ограничения для длину очереди
size_t _dlina; // текущая длина очереди заявок
ListZayav_t * _NachaloListZayav; // указатель на голову списка заявок
ListZayav_t * _KonetsListZayav; // указатель на хвост списка заявок
private:
};
template <class obsdiscipl>
class discochered: public ochered {
// абстрактный накопитель заявок с дисциплиной обслуживания
public:
// конструктор
explicit __fastcall discochered(const std::string & name):
structelem(name), obyavZayav(name), ochered(name)
{
;
}
// деструктор
~discochered() { }
protected:
// поведение
// ------------------------------------------------ прием заявки
virtual void __fastcall _Priem(Zayavka * req) {
ListZayav_t * SohrListZayav = _KonetsListZayav;
// создание элемента списка под заявку
try {
_KonetsListZayav = new ListZayav_t;
}
catch (std::bad_alloc &)
THROW_ERROR(ERegisterError, REG_ERROR_ID,
"Description: queue cell object creation failed",
std::string("Details: out of memory while adding a cell to queue ") +
this->GetName())
_KonetsListZayav -> ObrZayav = req;
_KonetsListZayav -> SledZayav = 0;
_dlina++;
if(SohrListZayav == 0) {
// очередь пуста
_KonetsListZayav -> PredZayav = 0;
__NachaloListZayav = _KonetsListZayav;
return;
}
// очередь не пуста
_KonetsListZayav -> PredZayav = SohrListZayav;
ohrListZayav -> SledZayav = _KonetsListZayav;
}
// ------------------------- выдача заявки согласно заданной дисциплине
virtual Zayavka * __fastcall _Peredacha(Zayavka *) {
const ListZayav_t * preqentry;
try { // контроль средств пользователя
preqentry =
obsdiscipl::GetSledZayav(__NachaloListZayav, _KonetsListZayav);
}
Zayavka * preadreq = preqentry -> ObrZayav;
__UdalitElement ( &___NachaloListZayav, &_KonetsListZayav,
const_cast<ListZayav_t*>(preqentry) );
--_dlina;
if (this->_marksObrZayav)
preadreq->SetObrabot(); // заявка считается обработанной
return preadreq;
}
private:
// --------------------------------- удаление элемента очереди
void __fastcall __UdalitElem(ListZayav_t ** NachaloListZayav,
ListZayav_t ** KonetsListZayav, ListZayav_t * udalitzayav)
{
ListZayav_t * tmpliszayav;
if (udalitzayav == *NachaloListZayav) // удаление головы
{
tmpliszayav = *NachaloListZayav;
(*NachaloListZayav) = (*pNachaloListZayav) -> SledZayav;
(*KonetsListZayav) = (*NachaloListZayav) == 0 ? 0 : (*KonetsListZayav);
if (*NachaloListZayav != 0) (*NachaloListZayav) -> PredZayav = 0;
}
else
if (udalitzayav == *KonetsListZayav) // удаление хвоста
{
tmpliszayav = *KonetsListZayav;
(*KonetsListZayav) = (*KonetsListZayav) -> PredZayav;
(*NachaloListZayav) = (*KonetsListZayav) == 0 ? 0 : (*NachaloListZayav);
if (*KonetsListZayav != 0) (*preqKonetsListZayav) -> SledZayav = 0;
}
else
{ // удаление из "середины" очереди
tmpliszayav = udalitzayav;
udalitzayav -> SledZayav -> PredZayav = udalitzayav -> PredZayav;
udalitzayav -> PredZayav -> SledZayav = udalitzayav -> SledZayav;
}
delete tmpliszayav;
}
};
template <class obsdiscipl> class bezkonochered: public ochered <obsdiscipl>
{ public:
// бесконечный накопитель заявок
explicit __fastcall bezkonochered(const std::string & name):
structelem(name), obyavZayav(name), ochered(name),
peredatchik (name), priemnik(name)
;
}
~bezkonochered() { }
virtual bool _GotovKPriem() const { // готовность к приему заявки
return true;
}
private:
};
template <class obsdiscipl> class konochered: public ochered <obsdiscipl>
{ public:
// ограниченный накопитель заявок
explicit __fastcall konochered(const std::string & name, size_t maxDlina):
structelem(name), obyavZayav(name), ochered(name),
peredatchik (name), priemnik(name)
_maxDlina(maxDlina > 0 ? maxDlina : 1)
{
;
}
~konochered() { }
// получение состояния
virtual state_t GetState() const {
return _Dlina != 0 ? (_maxDlina > _Dlina ? busy : full) : empty;
}
// максимальная длина
size_t GetMaxDlina() const { return _maxDlina; }
virtual bool _GotovKPriem() const { // aioiaiinou e i?eaio cayaee
return _maxDlina > _Dlina;
}
const size_t _maxDlina; // максимальная длина очереди
private:
};
class masskontrol: virtual public structelem {
protected:
// карта дескрипторов управляемых клапанов
typedef
map <int, pair< pair<float,int>, pair<structelem *, state_t> > >
klapandescriptormap_t;
{ public:
// конструктор
explicit __fastcall masskontrol(const std::string & name):
structelem(name)
{
__KolichKlapan = 0;
try {
__pklapandescriptormap = new klapandescriptormap_t();
}
// деструктор
~masskontrol() { delete __pklapandescriptormap; }
protected:
size_t __KolichKlapan; // число управляемых клапанов в группе
klapandescriptormap_t * __pklapandescriptormap;
// добавление клапана для случайного управления
virtual void _DobavKlapan(int klapanid, float reserved) { ++__KolichKlapan; }
// удаление управляемого клапана
// (вызывается только из qchart::UnregisterElement/Link)
void __fastcall _UdalitKlapan(const structelem * pklapan);
// определение состояния заданного управляемого клапана
int __fastcall _GetSostUpr(int klapanid) const {
return (__pklapandescriptormap -> operator [] (klapanid)).first.second;
}
// вычисление состояний клапанов в текущем такте
virtual void _VichislSostUprKlapana() = 0;
private:
};
class prostrandomcontrol: public masskontrol {
// элемент случайного управления клапанами
public:
// конструктор
explicit __fastcall prostrandomcontrol(const std::string & name):
masskontrol(name)
{
;
}
// деструктор
~prostrandomcontrol() { }
protected:
// карта текущего состояния управляемых клапанов наследуется
// добавление клапана для случайного управления (переопределение)
virtual void _DobavKlapan(int klapanid, float veroyatnost);
// вычисление состояний клапанов в текущем такте (реализация)
virtual void _VichislSostUprKlapana();
private:
static const float __proberror; // погрешность расчета вероятностей
// суммирование вероятностей и контроль равенства суммы единице
bool __SummirVeroyat() const;
};
class adaptcontrol: public prostrandomcontrol {
// элемент случайного управления клапанами, позволяющий динамически
// исключать заблокированные клапаны с соответствующим пересчетом
// вероятностей открытия клапанов
public:
// конструктор
explicit __fastcall adaptcontrol (const std::string & name):
prostrandomcontrol (name)
{
try {
__pustanklapandescriptormap = new klapandescriptormap_t();
}
__srcprobmapsaved = false;
}
// деструктор
~adaptcontrol () { delete __pustanklapandescriptormap; }
protected:
// карта текущего состояния управляемых клапанов наследуется
// добавление ассоциированного элемента для управляемого клапана
void __fastcall
_DobavKlapanAssocCtrl(int klapanid, structelem * passocelem, state_t assocelemstate);
// пересчет вероятностей открытия клапанов
virtual void _PereschetVeroyat();
private:
// исходная карта дескрипторов управляемых клапанов
Klapandescriptormap_t * __pustanklapandescriptormap;
// карта из prostrandomcontrol динамически изменяется и используется для
// расчета состояний клапанов, а эта карта хранит исходные вероятности и
// не пересчитывается
// признак сохранения исходной карты вероятностей
bool __srcprobmapsaved;
// фиксация исходной карты дескрипторов
// вызывается после регистрации всех управляемых клапанов
void __SaveSrcProbMap() {
*__pustanklapandescriptormap = *__pklapandescriptormap;
__srcprobmapsaved = true;
}
// восстановление исходной карты дескрипторов клапанов
void __VosstVeroyatKlapanov() {
*__pklapandescriptormap = *__pustanklapandescriptormap;
}
class Polzovatcontrol: public masskontrol{
public:
// вектор ассоциированных контроллеров
typedef vector < const structelem * > assoccontr_t;
// карта состояний управляемых клапанов
typedef map < int, int > klapanstatemap_t;
// компонента 1 - уникальный идентификатор клапана;
// компонента 2 - вычисленное состояние клапана
protected:
// ZakonUpr-функция для реализации пользовательского закона управления
typedef
void (* pcustomfuncupr_t)
(const assoccontr_t & assoccontr, klapanstatemap_t & klapanstatemap);
/*
assoccontr - вектор указателей на ассоциированные контроллеры,
состояние которых можно учитывать при формировании сигналов управления
клапанами;
klapanstatemap - карта состояний (0 или 1) управляемых клапанов,
вычисляемая callback-функцией (ее размер определяется размером вектора)
*/
public:
// конструктор
__fastcall obobmasscontrol(
const std::string & name,
const assoccontr_t & assoccontr,
pcustomfuncupr_t pcustomfuncupr
);
// деструктор
~Polzovatcontrol() { }
protected:
// добавление клапана для случайного управления (реализация)
virtual void _DobavKlapan(int klapanid, float reserved);
// вычисление состояний клапанов в текущем такте
virtual void _VichislSostUprKlapana();
private:
// связь с ассоциированными контроллерами
assoccontr_t __assoccontr;
// указатель на функцию управления пользователя
pcustomfuncupr_t __pcustomfuncupr;};
template<class randomgenerator>class uprgeneratorzayavok: public generatorzayavok<randomgenerator>, public objectupr
{
public:
// конструктор и деструктор
explicit __fastcall uprgeneratorzayavok
(const std::string & name, funcupr_t pfuncupr = NachFuncUpr):
structelem(name), obyavZayav(name),
generatorzayavok<randomgenerator>(name), objectupr(name, pfuncupr)
{
;
}
~uprgeneratorzayavok() { }
protected:
// поведение
// готовность к выдаче заявки
virtual bool _GotovKPeredache() const {
if (!_Razresh())
const_cast< generatorzayavok<randomgenerator> * >(this)->__OprVremyaVidachi = false;
return
__OprVremyaVidachi && this->generatorzayavok<randomgenerator>::_GotovKPeredache();
}
private:
};
template <class RandomGenerator>
class KanalSPrerObslug: public kanal<RandomGenerator>, public ObjectOfControl
{
// управляемый канал (элемент, который обслуживает заявки случайное время
public:
// конструктор и деструктор
explicit __fastcall KanalSPrerObslug
(const std::string & name, funcupr_t pfuncupr = NachFunсUpr):
structelem(name), ObyavZayav(name),
kanal<RandomGenerator>(name), ObjectOfControl(name, pfuncupr)
~KanalSPrerObslug() { }
protected:
// готовность к выдаче заявки
virtual bool _GotovKPeredache() const {
// при запрещающем управляющем сигнале заявка выдается сразу
if (!_Razresh()) return _ObrZayavka != NULL;
return this-> kanal<RandomGenerator>::_GotovKPeredache();
}
private:
};
class razvetvitel: public peredatchik, public priemnik, public objectupr <uprfunction>
public: explicit __fastcall razvetvitel(const std::string & name):
structelem(name), objectupr(name, pfuncupr), obyavZayav(name),
priemnik(name), peredatchik(name) {}
~razvetvitel() {}
private:
};
};
Размещено на Allbest.ru
Подобные документы
Разработка решения задачи имитационного моделирования системы массового обслуживания (СМО), на примере склада продукции. Построение концептуальной модели системы. Сравнение результатов имитационного моделирования и аналитического расчета характеристик.
курсовая работа [75,5 K], добавлен 26.06.2011Характеристика функций имитационного моделирования. Знакомство с особенностями имитационного моделирования агрегированной системы массового обслуживания. Анализ программы GPSSWorld: рассмотрение возможностей, способы составления имитационной модели.
курсовая работа [1,6 M], добавлен 27.05.2013Обзор средств компьютерного имитационного моделирования по созданию веб-приложения для визуализации имитационных моделей. Система имитационного моделирования AnyLogic, Arena, SimuLab. Серверная, клиентская часть. Модель работы отдела банка и участка цеха.
дипломная работа [3,3 M], добавлен 25.05.2015Методика системного исследования реальной динамической сложной системы посредством разработки ее имитационной модели. Разработка программы реализации алгоритма имитационного моделирования системы массового обслуживания "Интернет-провайдерская фирма".
курсовая работа [2,0 M], добавлен 20.01.2010Концептуальная модель процесса обслуживания покупателей в магазине. Описание системы моделирования GPSS. Разработка моделирующей программы на специализированном языке имитационного моделирования в среде AnyLogic. Результаты вычислительных экспериментов.
курсовая работа [906,9 K], добавлен 12.07.2012Особенности систем массового обслуживания и сущность имитационного моделирования с использованием GPSS. Структурная схема модели системы и временная диаграмма. Сравнение результатов имитационного моделирования и аналитического расчета характеристик.
курсовая работа [214,2 K], добавлен 23.06.2011Сфера применения имитационного моделирования. Исследование и специфика моделирования системы массового обслуживания с расчетом стационарных значений системы и контролем погрешности получаемых значений. Реализация ее в GPSS и на языке высокого уровня Java.
курсовая работа [818,7 K], добавлен 23.05.2013Программные средства имитационного моделирования систем массового обслуживания. Программная среда Matlab, ее структура и основные компоненты, функциональные особенности, а также назначение. Разработка подсистем моделирования. Инструкция пользователя.
дипломная работа [3,3 M], добавлен 10.07.2017Основы технологии моделирования Arena. Построение простой имитационной модели. Моделирование работы системы обслуживания покупателей на кассе супермаркета. Построение модели IDEF3. Анализ результатов имитационного моделирования и аналитического решения.
курсовая работа [659,1 K], добавлен 24.03.2012Математическое описание имитационной модели. Описание блок-схемы алгоритма. Анализ полученных результатов имитационного моделирования. Сопоставление полученных результатов для разработанных моделей. Математическое описание аналитического моделирования.
курсовая работа [306,5 K], добавлен 25.03.2015