

2.6 Сбор статистики
AnyLogicTMпозволяетпроизводить сборсложнойстатистики. Дляэтогонужно лишьвключитьуобъектарежимсборастатистики,посколькупоумолчани юон отключендляповышенияскоростивыполнениямодели.
►Включитесборстатистики
1Щелкнитепо объекту ATM
2Включите
сборстатистики
4Чтобывключитьсборстатистикидляобъекта,выберитеtrue
всвойствеstatsEnabled.
Выможетепросмотреть собраннуюстатистикуспомощьюдиаграммиграфиков, или выводя
30
числовые значения на анимацию. Мы |
же покажем статистику |
занятостибанкоматаспомощьюиндикатора. |
|
31

►Добавьтеиндикаторна анимацию
1Щелкнитепо кн оп ке
Ст
олб
цов
ый
инд
ика
тор
2П
омес
тите
инд
икат
орщ
елчк
ом мыши по диаграмме
3Добавьте текстовуюметку
4Поместите индикатор длиныочеред
и
2 Изменитенекоторыесвойства
индикатора:
а
М
и
н
и
м
а
л
ь
н
о
е
о
т
о
б
р
а
ж
а
е
м
о
е
значение
б
М
а
к
с
и
м
а
л
ь
н
о
е
о
т
о
б
р
а
ж
а
е
м
о
е
значение
в
В
ы
р
а
ж
33
е
н
и
е
,
з
а
д
а
ю
щ
е
е
о
т
о
б
р
а
ж
а
е
м
о
е
значение
вЗадайтеследующее выражение:
ATM.getStatsUtilization().mean()
ATM–этоимясозданногонами объектаDelay.Функция
getStatsUtilization()объекта
Delayвозвращает статистикузанятостиобъекта,афункцияmean()
возвращает |
среднееиз |
|
измеренных |
|
значений.Выможетеиспользоватьи |
другие |
|||
методы, например, |
min()и max(), для |
|||
получения минимального |
и |
максимального |
||
измеренных |
значений |
|
|
|
34

соответственно.Список методовсмотритев Справочнике классов,на страницеDataSet.
Подробную информациюо методахобъектаDelay, предназначенныхдлясборастатистики,Выможетенайти в
Справочном руководстве поEnterpriseLibrary.
3Добавьтетекстовуюметку,щелкнувмышьюпокнопкепанели инструментовТекст ,изатемщелкнувподиаграммепод индикатором.
аВведите текст, который будет отображ ен на анимации
4Добавьтеиндикатортекущей длиныочереди.
аОтображаемое значение
бМаксим альное отобража емое значение
35
аФункция size() объекта Queue возвращает текущее количество людей в очереди.
бПоскольку максимальная длина очереди равна 15, то мы устанавливаеммаксимальноезначениетакже равным15.
36

►Запуститемодель
1Для ускорения
рабо
тым
одел
и,
пере
клю
чите
сьвр
ежи
м
вирт
уаль
ного
врем
ени
1
Врежимевиртуальноговременимодельбудетв ыполнятьсяс максимально возможной скоростью.
>Текущаяконтрольнаямодель:Examples\EnterpriseLibraryTutorial
Models\
BankDepartment4-
Utilizationstatistics.alp.
37
Вынаучились |
основам |
создания |
моделейвEnterpriseLibrary.ТеперьВыготовык
созданиюболеесложноймодели.
2.7
Моделированиебанковскихкасс
иров
Теперь мы усложним нашу модель, добавив в нее служащих – банковских кассиров.Мымоглибыпромоделироватькассиров,какибанкомат,спо мощью объектовDelay.Нокудаболееудобнымпредставляетсямоделирование кассировс помощьюресурсов.Ресурс–этоспециальный объектEnterpriseLibrary,который можетпотребоватьсязаявкедлявыполнениякакойтозадачи.Внашемпримере посетителямбанковского отделения(заявкам)необходимо получитьпомощьу банковскихслужащих(ресурсов).
38

►Изменитеблок-схему
1Добавьте объект SelectOutput
2Добавьте объект ProcessQ
3Добавьте объект Resource
1Объект SelectOutputявляется блоком принятия решения. В зависимостиотзаданногоВамиусловия,заявка,посту пившаяв объект,будетпоступать на один из двухвыходов объекта.
Задайте следующие свойстваобъекта:
аОставьтепринятоепо умолчанию условие
аОставьтеусловиеuniform()<0.5.Вэтомслучаекка ссирам и банкомату будет приходитьпримерноравноеколичество клиентов.
2 Объект ProcessQмоделирует занятие заявкой
ресурса на определенноевремя. С помощью этого объекта мы промоделируемобслуживаниеклиентакассиром.
39
Задайте следующие свойстваобъекта:
40

аНазовитеобъект
tellerLines
бУкажите, чтов очередикк ассирам может находитьс ядо
20 человек
вЗадайтевремя обслуживания
вМыполагаем,чтовремяобслуживанияимееттреугольное распределениесминимальнымзначениемравным2.5,сре дним - 6, и максимальным11минутам.
3Объект Resourceзадает ресурсы определенного типа.
Он
долженбытьподсоединенкобъектам,моделирующимзан ятие и освобождение ресурсов (в нашем случае это объект
P r o c e s s Q ).
Задайте следующие свойстваобъекта:
аНазовитеобъект
tellers

бЗадайтечисло кассиров
Запуститемодельи изучитеееповедение.
>Текущаяконтрольнаямодель:Examples\EnterpriseLibraryTutorialModels\ Bank Department5-Tellerlines.alp.
Отображениекассировна анимации
Посколькумодельизменилась,мыдолжныизменитьи ееанимацию.
►Изменитеанимациюмодели
1Нарисуйте
очередьклиентов
2Нарисуйте
стойкикассиров
3Нарисуйте
кассира
4Задайте местонахождение кассиров
5Добавьте индикатор занятостикассиров
1Пользуясь инструментом Ломаная , нарисуйте очередь клиентов, ожидающихобслуживания.
42
2Пользуясь инструментом Скругленныйпрямоугольник , нарисуйте стойки кассиров. Выберите подходящий цвет заливки(прямоугольник нарисункеимеетцвет заливки с компонентами204, 255, 255).Добавьтеметку Teller lines.
3НарисуйтеЛоманую ,чтобыуказатьнаанимацииместа,в которыхбудутнаходитьсябанковские служащие.
43

аТочкиломан ойлинии будутсоответс твовать местоположе нию
служащих наанимации
Назовите ломаную линию tellerLocations.
4 Мы нарисуем кассиров внутри прямоугольника. С
помощью разныхизображениймы покажем, обслуживаетликассир в данныймоменткакогонибудьклиентаилинет.Чтобысоздать
изображение,щелкнитепокнопкеИзображение изатем щелкните подиаграмме.
Нарисуйте кассира с помощью динамически создаваемой группы фигур:
аСоздайтеИзображение
идобавьтеизо
бражения
занятогои
свободного
кассиров
бСоздайтеГруппуфигур
44
идобавьтев
неесозданное
изображение
аИзображениедолжносодержатьрисункиработающегои отдыхающегокассира. Убедитесь,чтоизображениеназвано image.
45

Добавьте
изображение
отдыхающего
кассирас помощьюкнопкиДобавить…
Добавьте изображение занятогокассира
Убедитесь,чтоустановлен флажок Исходный размер
Убедитесь,чтоиндекс
изображениянезадан
Изображениеможет содержатьнесколькорисунков,показывая один из нихв зависимости от значениязаданного выражения.
>ВыможетеиспользоватьфайлыизображенийExamples\
EnterpriseLibraryTutorialModels\images\TellerIdle.pngи
TellerBus y.png.
Если опция Исходныйразмерне будет выбрана, то размер изображения можнобудетизменять.
Выражение Индекс |
изображения |
определяет, |
|
какое |
изображениеизспискаотображать.Оставьтеполе |
Индекс изображения пустым.
46

бЩелкнитемышьюпокнопкеГруппафигур
,а
потомпо диаграмме.
Назовитегруппу фигур
ShapeTeller
Сделайте ее динамической
Динамическиегруппы фигур создаютсяи добавляются на анимациювовремя работымодели.
Чтобыдобавитьфигуру вгруппуфигур,щелкнитеправой кнопкой мышипозначкугруппыфигур ивыберите
Добавить/удалитьфигурыиз контекстногоменю.
Затемщелкнитемышьюпоизображениюдля того,
чтобы |
добавитьегокэтой |
группефигур.Изображениебудет |
подсвечена. |
Чтобывыйтиизрежимадобавления/удаления, щелкните мышью поанимационнойдиаграмме.
47

5 Поместите |
на |
диаграмму |
столбцовый |
индикатор, |
|
показывающийто, какуючастьсвоего рабочего |
|
||||
времени кассир тратит |
на |
|
|
||
обслуживание |
клиентов. Задайте |
следующие |
|||
свойстваиндикатора: |
|
|
|
|
аИзмерьте занятостькассиров
бЗадайте минима льные имаксим альные
отображаемыезначения
аЧтобыизмерить занятостьресурса,мывоспользуемся функциейgetStatsUtilization()объектаResou rce.Затем мы получим среднее значениес помощью функцииmean().
Теперь мы создадим новый класс сообщения, чтобы задать ресурсы модели. Сообщенияэтогоклассабудутпредставлятьв нашеймоделикассиров.
►СоздайтекласссообщенийTeller
1Создайте класс сообщения
2Выберите базовыйкласс Entity
3 Напишите код анимации
49

1 Чтобысоздатьновыйкласссообщения,щелкнитемышьюпо кнопке Новыйкласссообщения .
Назовитекласс Teller.
2
аВведи теимяб азового классад лясозда нного
сообщения
3
а
С
о
з
д
а
й
т
е
а
н
и
м
а
ц
и
ю
|
ресурса |
|
бПроинициализируй |
вНапишит |
те анимациюресурса |
екоддля |
|
изменения |
|
анимациив |
|
о время |
|
работымод |
|
ели |
|
50
аЧтобы создатьанимациюэтогоресурса(экземпляр динамическойгруппы фигурShapeTeller),напишите следующий код в полеДополнительныйкодкласса:
Model._Group.ShapeTeller
shape =
((Model)Engine.getRoot()).
animation.new
ShapeTeller();
бЧтобы добавить созданную группу фигур на анимацию, напишитеследующий код в поле
Кодинициализации:
shape.set
up();
setAnimat
ion(
shape );
>В следующей моделиAnyLogicTMанимационный
подходбудет упрощен.
вЧтобыизменитьвнешнийвиданимациивовремяраб оты модели,напишитеследующую функцию:
void setBusy( boolean b
) {
shape.image.setIndex(
b ? 1 : 0 );
}
51

Теперьмы зададиманимационныесвойствадляобъектовблок-схемы.
1Задайтесвойства объекта
2Задайтесвойства объекта
1Задайте следующие свойстваобъекта:
аВыберитефигуру анимации
бВыберите стиль анимацииQ UEUE (очередь)
52

2Задайте следующие свойстваобъекта:
аПризанятиии освобождении ресурса, меняйтеотобр ажающиеся изображения занятого/своб одного
кассира
бРесур самиб удут сообщ енияк ласса
Teller
г
В
к
л
ю
ч
и
т
е
р
е
ж
и
м
с
б
о
р
53

вЗадайтеположение кассировна анимации, выбрав |
стильSET |
ломануюлинию tellerLocationsи |
|
ЗапуститемодельщелчкоммышипокнопкеЗапустить .Спомощью созданной анимацииВысможетепроследить, сколькокассироввданныймоментвремени занятообслуживаниемклиентов.
Выможетеизменитьскоростьвыполнения моделиспомощьюкнопокпанели инструментовУменьшитьскорость и Увеличитьскорость
.
>Текущаяконтрольнаямодель:Examples\EnterpriseLibraryTutorialModels\
Bank Department6-
Tellersanimation.alp.
54

2.9 Изменениеколичествакассиров
Теперьмыдобавимспециальныйэлементуправления,чтобыиметьвозможность
изменятьколичествокассироввовремяработымодели.
1Создайте параметр классаModel
2Задайте количество кассиров
1Добавьтепараметр numberOfTellers,задающийколичество кассиров:
2
аЗадайтеколич ество кассировпарам етром
55

►Добавьтеэлементуправлениядляизменениячислакассиров
1Добавьте
Бегзунок
2Добавьте метки диапазонабегунка
1 Задайте следующие свойства:
аВыберитеп араметр, значениеко торого будет изменятьсяс помощью
этого элемента
бЗадайтеминимальноеи максимальноезначения
2
Добавьтетекстовыеметки,отображающиеграницыдиапазон
а
значен
ийбегу
нка.
56
ЗапуститемодельщелчкоммышипокнопкеЗапустить
.Теперь,изменяя
количествокассироввовремяработымодели,Выможетесделатьвыводо
том,
сколькослужащихнеобходимодлянормальнойработыбанковскогоотд еления призаданнойинтенсивностиприходаклиентов.
>Текущаяконтрольнаямодель:Examples\EnterpriseLibraryTutorialModels\
Bank Department7-Changing number of tellers.alp.
57

2.10 Сборстатистикиовремени обслуживанияклиента
Мыхотимзнать,скольковремениклиентпроводитвбанковскомотделении и скольковременионтеряет,ожидаясвоейочереди.Мысоберемэтустатистикус помощьюнаборовданныхAnyLogicTM.
1Создайте перечисление
StateTypes
2Создайте набор
данных serviceTime
3Создайте набор
данных waitTime
1СоздайтеперечислениеStateTypesщелчкоммышипокнопке Новоеперечисление . Создайте следующие элементы перечисления:
2СоздайтенаборданныхserviceTimeдляподсчетавремени
обслуживания клиента, щелкнув мышью по кнопке Новый наборданных .Оставьтепринятыепоумолчаниюсвойства
58

аУб еди тесь ,что наб орд анн ыхн
е
являетсявременным
3Аналогично создайте набор данных waitTime.
ТеперьмысоздадимкласссообщенияCustomer.Сообщения этогоклассабудут представлять клиентов банковского отделения. Написав для этого класса специальнуюфункцию,мысможемпроводитьсборстатистикио том,сколько времениклиентпровелв нашембанке.
►Создайтекласссообщения
1Создайте класссообщения
Customer
2Выберите базовыйкласс
3Добавьте параметры
4Напишитекод
59

2
аВыберитеEntity
60

3Добавьтепараметрыдляхраненияинформацииопроведенном
времени:
Значения параметров будут обновляться по мере того, как будут обслуживаться клиенты.
4 Напишитеследующий код в поле Дополнительныйкодкласса:
double tupdate = Engine.getTime();
double Update( EnumItem type ) {
double dt = Engine.getTime() - tupdate;
if( type == StateTypes.WAITING ) waitTime+=dt;
else
serviceTime+=dt;
tupdate = Engine.getTime();
returndt;
}
Функция Update()производит сбор временной статистики. Онавызываетсяпосле того,какбудетпроведенакакая-то операция,идобавляетвремя,затраченное клиентомнаэту операциюксоответствующемунабору данных.
61

Теперьмыможемвычислитьвремя,котороетратитсяперсоналом банкана обслуживание клиентов,ивремя,котороеклиентытратятнаожиданиесвоей очереди.
►Вычислитевремяобслуживанияи времяожиданияклиента
1Source
2ProcessQ
3Queue
4Delay
5Sink
1Задайте следующие свойстваобъекта:
аВыберите
классCustomer
2 Задайте следующие свойстваобъекта:
62

аНапишите следующийкод
3Задайте следующие свойстваобъекта:
аНапишите следующийкод
4Задайте следующие свойстваобъекта:
аНапишите следующийкод
5Задайте следующие свойстваобъекта:
аНапишите следующийкод
63
аНапишитеследующий код, чтобысохранитьвнаборахданных
64

данныео клиенте, покидающембанковскоеотделение:
serviceTime.add(((Customer)entity
).serviceTime);
waitTime.add(((Customer)entity).w
aitTime);
Мы хотимотобразитьсобраннуюстатистикунаанимации.
►Добавьтена анимациюиндикаторы
1Добавьте индикатор времени обслуживания клиента
2Добавьте индикатор времени ожидания
клиента
3Добавьте кнопку сброса статистики
1 Задайте следующие свойства индикатора:
65

66

2Задайте следующие свойства индикатора:
3Мы добавим кнопку, чтобы при изменении числа кассиров сбрасыватьстатистику,собраннуюдлястарогозначения.
ЩелкнитемышьюпокнопкеКнопка ,азатемщелкнитепо
анимационной диаграмме. Задайте следующие свойства
кнопки:
аВведитеReset(сброс)в качестве метки
бНапишитеко д, производящи йсброс статистикизан ятости
банкоматаи кассиров
вНапишитекод, производящий сброс временной статистики
Статистикасбрасывается с помощью специальных функций:
бФункция объекта Delay resetStats()
сбрасывает статистику, собраннуюэтим объектом. вФункция набора данных reset()сбрасывает статистику,
67
собраннуюнаборомданных.
Запуститемодель.Теперьв нашеймоделипроисходитсборвременной
статистики.СброситьстатистикуможнощелкнувпосозданнойнамикнопкеReset.
68

>Выможетепроизводитьсбросстатистикивзаданныймоментвремениилип
о
происхождению какого-тособытияспомощьютаймеров(подробную информациюо таймерахВыможетенайтивРуководствепользователя).
>Текущаяконтрольнаямодель:Examples\EnterpriseLibraryTutorialModels\
Bank Department8-Customerwaitand
servicetime.alp.
2.11 Оценказатратопераций
Никогдаещемоделированиеианализбизнес-процессов небылотакимпростым,
каквAnyLogicTM.EnterpriseLibraryпредоставляетинструментыдля проведенияв Вашей системеоценкизатрат операций.Методоценки затратопераций(activity-based costing,ABCметод)оцениваетпроцессиэффективность операций,определяет стоимостьобслуживания/производства иуказываетвозможностидля усовершенствования продуктивностииэффективностипроцесса.Спомощью этогометодапроизводитсяколичественная оценкастоимостии производительности операций,эффективностииспользованияресурсови стоимостиобъектов.
Мыпроведемучетзатратопераций
внашемпримере,чтобыпонять,воскольков
среднемобходитсяобслуживание
одногоклиента,икакиенакладныерасходы
связанысобслуживаниемклиентов,ожидающихсвоейочереди.
69
Вначалемынапишемвспомогательную функциюдляпересчетапочасовой зарплатывпоминутную.
70

►Напишитефункциюпересчетазарплаты
1Создайте математическую
функцию
2Напишите выражение функции
1Щелкните мышью по кнопке панели инструментов
Новая
математическаяфункция . Назовите функцию toMinute.
2На странице свойств задайте тип, аргументы и выражение функции:
аТипво звраща емого значен иядолж енбыть
real
бД
об
ав
ьт
71

еа
рг
ум
ен тp
er
Ho
ur
ти
па
re
al
вНапишите выражениефункции
г
Сдела
йтеф
ункц
ию
стати
ческо
й
72

вНапишите |
следующее |
выражение: |
|
per |
|
Hou |
|
r / |
|
60 |
|
г
Мысделаемфункциюстатической,посколькуэтафункция не использует значений, специфичных для
конкретного |
экземпляраклассаModel.Функция |
|||
связаналишьссамим |
классомModel, |
и мы |
будем |
|
вызыватьее |
так: |
Model.toMinute().В |
||
противномслучаенампришлосьбы |
вызывать |
еесо |
||
ссылкой на конкретныйэкземпляр классаModel. |
|
Теперьмыизменимкласссообщений,чтобысобиралисьи данныеозатратах.
►ИзменитекласссообщенияCustomer
1Добавьте параметры
2Добавьте код
73
1Добавьтепараметры,хранящиеинформацию о затратах:
74

Параметр serviceCostбудетхранитьинформациюотом,во сколькокомпанииобходитсяобслуживаниеэтогоклиента. Заметим,чтобанкнесетиздержки,связанныес обслуживанием клиентов, ожидающихсвоей очереди. Параметр existenceCostPerHour задает, во
сколько обходитсякомпаниипребываниеклиента вбанке.
4ОткройтеокноклассаCustomerдвойнымщелчкоммышипо элементу Customerв деревемодели, и измените функцию
Update() в полеДополнительный кодкласса:
void Update( EnumItem type ) {
double dt = Engine.getTime() - tupdate;
if( type == StateTypes.WAITING ){ waitTime += dt;
waitCost += dt*existenceCostPerHour;
}
else if( type == StateTypes.SERVICE ){ serviceTime += dt;
serviceCost += dt*(existenceCostPerHour + Model.busyCostRate);
}
else if( type == StateTypes.SERVICE_ATM ){ serviceTime += dt;
serviceCost += dt*(existenceCostPerHour + Model.ATMCostPerUse);
75
}
tupdate = Engine.getTime();
}
Функциябудетобновлятьстатистикузатратнаобслуживание и ожиданиеклиента.
76

Теперьмыдобавимвмодельвспомогательныеэлементы,собирающие статистику
затраткомпании.
1Добавьте параметры классаModel
2Добавьте переменные
3Создайте наборыданных
4Создайте алгоритмическую функцию
1Создайте параметры, задающие заработную плату
кассиров.
Задайте параметрыследующим образом:
Мы |
платим кассиру $6.5 в час, если |
он |
был |
занят обслуживаниемклиентов и $4.0, еслион |
|
был свободен. |
|
77
Создайтепараметр,задающийрасходы,связанныесра ботой банкомата:
78

Однаоперация банкоматаобходитсякомпании в $0.30.
2Создайте переменную timeUpdateCosts, щелкнув мышью по кнопкепанелиинструментовПеременная ,азатемщелкнув по структурной диаграмме. Создайте еще несколько переменных и назовитеих так:
-tellersIdleTime
-tellersBusyTime
-tellersIdleCost
-tellersBusyCost
Этипеременныебудутхранитьинформациюо том,сколько временикассирыбыли занятыобслуживаниемклиентов,и сколькоим требуетсявыплатить за работу.
3Создайтедва набораданныхи назовите их так:
-waitCost
-serviceCost
Убедитесь,чтонаборыданныхнеявляютсявременными;то естьу обоихнаборовданныхфлажокВременнойсброшен.Эти наборыданныхбудутхранитьстатистикузатраткомпаниина обслуживаниеклиентов.
4 Создайтеалгоритмическуюфункцию,котораябудет |
обновлять |
|
статистику. |
Дляэтогощелкнитемышьюпокнопкепанели |
|
инструментовНовая |
алгоритмическаяфункция |
.Назовитеее |
UpdateCosts. ИзменитеТипфункциина void.
double dt = getTime() - timeUpdateCosts; tellersIdleTime += tellers.size()*dt; tellersBusyTime += (tellers.capacity-
tellers.size())*dt;
tellersIdleCost += tellersIdleTime*idleCostRate; tellersBusyCost += tellersBusyTime*busyCostRate;
79

timeUpdateCosts = getTime();
►Сосчитайтезатратына обслуживаниеклиента
1Измените свойстваобъекта
2Измените свойстваобъекта
1 Задайте следующие свойства:
аДобавьтекод
бДобавьтекод
аДобавьтекод,выделенныйжирным шрифтом:
((Teller)unit).setBusy(true); UpdateCosts();
бДобавьтекод,выделенныйжирным шрифтом:
80
((Teller)unit).setBusy(true); UpdateCosts();
81

2Задайте следующие свойстваобъекта:
аДобавьтекод
аДобавьте строки, выделенные жирным шрифтом, чтобы учестьзатратына обслуживаниеклиента:
serviceTime.add(((Customer)entity).s
erviceTime);
waitTime.add(((Customer)entity).wait
Time);
serviceCost.add(((Customer)entity).s
erviceCost);
waitCost.add(((Customer)entity).wait
Cost);
►Добавьтена анимациюиндикаторызатрат
1Добавьте
инд
ика
тор
ыза
тра
т
нао
бсл
ужи
ван
ие
клиентов
2Добавьте индикатор выплаткассирам
3Добавьте код
83

1 Задайте следующие свойства индикатора стоимости
обслуживания
клиента:
Задайтеследующиесвойстваиндикаторазатрат,связанн ыхс обслуживаниемклиентов,ожидающих своейочереди:
84

2Добавьтеиндикатор,показывающийто,насколькоэффективно используются кассиры. Задайте следующие
свойства индикатора:
3Добавьтеследующие строки кода:
ЗапуститемодельщелчкоммышипокнопкеЗапустить . ТеперьВыможете сделатьвыводотом,откуданакапливается итоговаястоимость,исделать соответствующие выводы,какулучшитьэффективностьработы,втожевремя предоставляялучшийсервис.
85