Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги / 514.pdf
Скачиваний:
1
Добавлен:
07.06.2023
Размер:
4 Mб
Скачать

2.6 Сбор статистики

AnyLogicTMпозволяетпроизводить сборсложнойстатистики. Дляэтогонужно лишьвключитьуобъектарежимсборастатистики,посколькупоумолчани юон отключендляповышенияскоростивыполнениямодели.

Включитесборстатистики

1Щелкнитепо объекту ATM

2Включите

сборстатистики

4Чтобывключитьсборстатистикидляобъекта,выберитеtrue

всвойствеstatsEnabled.

Выможетепросмотреть собраннуюстатистикуспомощьюдиаграммиграфиков, или выводя

30

числовые значения на анимацию. Мы

же покажем статистику

занятостибанкоматаспомощьюиндикатора.

 

31

Добавьтеиндикаторна анимацию

1Щелкнитепо кн оп ке

Ст

олб

цов

ый

инд

ика

тор

омес

тите

инд

икат

орщ

елчк

ом мыши по диаграмме

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

Соседние файлы в папке книги