Скачиваний:
57
Добавлен:
06.02.2016
Размер:
524.8 Кб
Скачать

1.3. Модель бизнес-процесса «эффективность предприятия»

Перед выполнением упражнения 1.3 внимательно прочитайте § 8.6 в книге Емельянов А.А., Власова Е.А., Дума Р.В. Имитационное моделирование экономических процессов: Учеб. Пособие. М.: Финансы и статистика, 2004. – 368с.

В модели экономических процессов можно включить движение денежных средств по бухгалтерским счетам - финансовые потоки. При этом часто возникает необходимость моделировать проводки с одного и того же счета-источника, связанные с разными хозяйственными операциями. Проблема заключается в том, что в модели не может существовать несколько узлов типа "Send" с одним и тем же номером, соответствующим счету-источнику проводки.

     В данном примере также демонстрируется моделирование параллельных и порожденных процессов. Процессы называются параллельными, если они протекают одновременно. Процесс называется порожденным, если его началом является какое-либо событие в ходе другого процесса, начавшегося ранее.

Описание моделируемого процесса

     Моделируется бизнес-процесс фирмы, которая производит некоторую продукцию на заказ. Стартового капитала фирма не имеет. После получения каждого заказа фирма берет в банке кредит и одновременно начинает производство заказанной партии товара. До тех пор, пока взятый кредит не будет возвращен, новый кредит банком не выдается. Проценты по кредиту фирма не платит. Кредит возвращается после производства партии товара по полученному фирмой заказу. Оплата заказа производится заказчиком после получения партии. Для производства продукции по каждому заказу фирма покупает сырье, за которое вносит плату поставщику.

Структурная схема процесса (см. рис. 1-3)

Описание работы модели

     Как уже было сказано выше, данная модель имеет две особенности. Первая заключается в порождении нового процесса, который далее будет работать параллельно с "родительским".

     Основным процессом в структурной схеме считается процесс, детализируемый элементарными процессами 1-2-3. Процесс называется элементарным, если он не подлежит дальнейшей детализации в ходе структурного анализа. Процессы 4, 5 и 6 в этом случае являются порожденными соответственно процессами 1, 3 и 3.

     Для порождения нового процесса в соответствующем точке его возникновения узле модели необходимо создать дополнительный транзакт. Этот транзакт пойдет по цепочке узлов, моделирующей порожденный процесс, в то время как исходный "родительский" транзакт продолжит свое движение по "родительской" цепочке узлов. Дополнительный транзакт создается узлом "creat". Для одновременного порождения двух вспомогательных транзактов (процессы 5 и 6) используется два подряд стоящих узла "creat".

     Таким образом, точкой начала процесса в модели является генератор - или обычный "ag" (стартовые процессы), или транзактно-упраляемый "creat" (порожденные процессы). Точкой завершения процесса является терминатор. Осуществителем процесса является транзакт, идущий по цепочке узлов. Обратите внимание, что в данном примере ни один из подпроцессов 5 и 6 не считается входящим в основной процесс - он заканчивается, как только произведена очередная партия товара (блок 3). Если бы в ходе структурного анализа за окончание основного процесса было бы принято окончание какого-либо из подпроцессов 5 и 6, в модели было бы на один терминатор и на один управляемый генератор меньше.

     Вторая особенность модели состоит в моделировании бухгалтерских проводок с одного счета-источника, но в разных точках модели. В этом случае различные цепочки узлов требуют обращения транзакта в один и тот же узел "send". В нашем примере это проводки "фирма - поставщик" при оплате сырья и "фирма - банк" при возврате кредита. Узел "send", моделирующий проводки с расчетного счета фирмы, является точкой пересечения двух цепочек узлов. Одна цепочка моделирует основной процесс, другая - процесс получения кредита. Узел "direct", общий для всех проводок, является точкой пересечения всех 4-х цепочек модели.

     Таким образом, необходимо обеспечить возврат транзакта из узла "direct" в нужный узел модели. Для этого используется целочисленный пользовательский параметр транзакта. Перед отправкой транзакта в "общие" узлы (в "send" или сразу в "direct") в этот параметр заносится номер узла, в который транзакт должен вернуться. Если транзакт идет в общий "send", в его параметры заносится также номер счета-приемника (целочисленный параметр) и сумма проводки (параметр с плавающей точкой). Эти параметры транзакта используются в описании общих узлов "send" и "direct" в качестве входных параметров узла.

     В тексте модели используемые параметры транзакта имеют символические имена, присвоенные с помощью команды #define. Присваивание значений параметрам транзакта производится в узле, предшествующем узлу возврата. В тех местах модели, где должен был бы стоять "общий" узел "send" (проводка со счета фирмы), вставлен фиктивный ключ (который не работает как ключ). В этих ключах производится настройка параметров транзакта для осуществления проводки. Ключ выбран потому, что у него меньше всего входных параметров - он как бы самый "маленький" узел системы PILGRIM. Аналогичные по "размерам" узлы "direct" и "manage" используются только в паре с узлами "send" и "attach".

#include <Pilgrim.h>

forward

{

float T_cust = 7 ; /* Интервал поступления заказов */

float T_work = 14 ; /* Время выполнения заказа */

float S_bank = 10000.00 ; /* Сумма кредита в банке */

float S_supp = 10000.00 ; /* Сумма платы поставщику */

float The_price = 90.00 ; /* Цена за единицу продукции */

float Mod_time = 730 ; /* Время моделирования 2 года */

int N_work = 2 ; /* Производств. мощность фирмы */

int Max = 1200 ; /* Объем выпус. партии продукции*/

modbeg("Бизнес-процесс",23,Mod_time,(long)1234567890,none,

20,none,18,none);

ag("Заказы",1,none,norm,T_work,0,zero,2);

ag("Клиенты",14,none,norm,T_cust,T_cust/3,zero,15);

assign ( 19,add,10000000.00); /* Назначили фонд банка */

assign ( 20,add, 0.00); /* Начальный фонд фирмы */

assign ( 21,add,10000000.00); /* Назначили фонд клиента */

network( dummy, dummy)

{

/****************************************************************/

/* */

/* Слой № 1: Схема основного бизнес-процесса */

/* */

/****************************************************************/

top( 2):creat("Развилка 1",0,1,none,3,7);

place;

top( 3):queue("Ждём кредит !",none,4);

place;

top( 4):key("Разреш. кредита",5);

place;

top( 5):pay("Перевод кредита",20,S_bank,19,none,19,6);

place; /* На слой № 2: в банк */

top( 6):term("Запрет выдачи");

hold(4);

place;

top( 7):pay("Плата поставщ.",22,S_supp,20,none,20,8);

place; /* На слой № 2: на расчетный счет */

top( 8):queue("Очередь заказов",none,9);

place;

top( 9):serv("Выполн. заказа",N_work,none,norm,T_work,

zero,zero,10);

place;

top(10):creat("Развилка 2",0,1,none,11,13);

place;

top(11):pay("Возврат кредита",19,S_bank,20,none,20,12);

place; /* На слой № 2: на расчетный счет */

top(12):term("Разреш. выдачи");

rels(4);

place;

top(13):term("Заказ выполнен");

clcode

supply(15,none,Max);

place;

/****************************************************************/

/* */

/* Слой № 1 (продолжение): Процесс реализации продукции */

/* */

/****************************************************************/

top(15):t->powr=rundum()*100; /*Число единиц товара */

t->summ=t->powr*The_price; /*Стоимость этой партии*/

attach("Склад гот.прод.",t->powr,prty,16);

place;

top(16):manage("Отпускаем товар",17);

place;

top(17):pay("Оплата покупки",20,t->summ,21,none,21,18);

place; /* На слой № 2: на счет покупателя*/

top(18):term("Товар оплачен");

place;

/****************************************************************/

/* */

/* Слой № 2: Работа бухгалтерии */

/* */

/****************************************************************/

top(19):send("Банк: 90", t->k1,t->summ,t->dpr,23);

place;

top(20):send("Расч.счет: 51",t->k1,t->summ,t->dpr,23);

place;

top(21):send("Клиент: 61", t->k1,t->summ,t->dpr,23);

place;

top(22):send("Поставщик: 60",t->k1,t->summ,t->dpr,23);

place;

top(23):direct("Бухгалтерия", t->updown);

place; /* Возврат на верхний слой */

/****************************************************************/

/* */

/* Конец двухслойной структурной схемы */

/* */

/****************************************************************/

fault(123);

}

modend( "Results.doc", 1, 30, page );

return 0;

}

Соседние файлы в папке Лабораторные_занятия