Атрибуты, очереди, приоритеты 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Атрибуты, очереди, приоритеты



 

Модуль Assign обеспечивает присвоение значений переменным модели и атрибутам транзакта, проходящего через модуль. Может выполнять сразу несколько присвоений.

Обозначение:

 

 

Модуль можно использовать для разных целей:

- задать какое-то свойство транзакта, от которого будет зависеть дальнейшая обработка этого транзакта;

- «пометить» транзакт, например, показав, что он прошел какую-то стадию обработки;

- поменять тип транзакта или его картинку;

- работать с переменными, например, собирая различную статистику;

и т.д.

Например, имеется переменная «Баланс» и транзакты-документы. Приходные документы увеличивают баланс, расходные уменьшают. Переменные также могут задавать какие-то условия работы модели, например, если на предприятие происходит плановая профилактика, некоторые процессы можно приостановить. Еще один популярный способ использования модуля – задание атрибутов приоритета, которые работают вместе с очередью.

Пример параметров модуля Assign показан на рисунке.

 

 

Модуль может содержать несколько назначений. В данном случае, мы устанавливаем для проходящего транзакта атрибут mass, присваивая ему значение 5 тонн. А также меняем для транзакта картинку, изменив специальный атрибут Entity Picture.

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

На рисунке показано присвоение значения атрибуту транзакта с именем mass:

 

 

Можно использовать выражение, например, указать, новое значение случайным образом. На следующем рисунке атрибут получит случайное значение, от 1 до 10, закон распределения - равномерный.

 

 

В модуле Assign значение может присваиваться:

- переменной (Variable):

- элементу двумерного или одномерного массива (Variable Array):

- атрибуту транзакта (Attribute);

- типу транзакта (Entity Type);

- картинке транзакта (Entity Picture);

- произвольному объекту системы (Other).

 

Рассмотрим пример модели.

 

Пример 7. Построить модель обработки документов (счёт - фактур и выписок банка) бухгалтерией предприятия (3 бухгалтера) в программе «1С:Бухгалтерия». Параметры процесса, представлены в таблице. Обработка выписки банка имеет приоритет перед обработкой счета-фактуры.

В результатах моделирования будет получена следующая информация:

- число документов (счёт - фактур и выписок банка по отдельности), поступивших в бухгалтерию в течение контрольного периода времени;

- число обработанных документов (счёт - фактур и выписок банка по отдельности);

- число необработанных документов (счёт - фактур и выписок банка отдельности);

- среднее время ожидания обработки счёт - фактур и выписок банка;

- процент загрузки бухгалтерии.

 

Величина Закон распределения Параметры
Интервал прихода выписки банка равномерный мат. ожидание: 20 минут
ср. кв. отклонение: 4 минут
Интервал прихода счёт - фактуры нормальный мат. ожидание: 10 минут
ср. кв. отклонение: 2 минут
Время обработки бухгалтером счёт - фактуры экспоненциальный мат. ожидание: 20 минут
Время обработки бухгалтером выписки банка экспоненциальный мат. ожидание: 15 минут

 

 

Решим задачу с помощью одного модуля Process и двух модулей Assign[16]. Имеется два транзакта: счет-фактура и выписка банка и один ресурс – бухгалтер с мощностью 3.

 

 

Граф модели показан на рисунке:

 

 

Таким образом, в модели два генератора транзактов для каждого из типа документов, а также два модуля Assign, которые призваны указать атрибуты для приходящих документов.

Будем использовать два атрибута:

 

Название Назначение Значение для выписки Значение для счет-фактуры
pri Значение приоритета    
tmean Среднее время обработки документа    

 

 

Присвоение атрибутов с помощью модуля Assign показано на рисунке:

 

 

Модуль Process использует значение атрибута tmean при расчете времени обработки транзакта – задано выражение expo(tmean). Теперь счет-фактура будет обрабатывать в среднем за 20 минут, а выписка банка – за 15.

 

 

Теперь обратимся к свойствам очереди ProcessDoc.Queue. Это можно сделать с помощью невизуального модуля Queue:

Мы видим, что установлен тип очереди «По наименьшему значению атрибута» и указано имя атрибута pri. Поскольку для выписок банка значение атрибута pri меньше, в очереди эти документы будут пропускаться вперед. Если в очереди есть только счета-фактуры, новая выписка будет помещена в начало очереди. Если имеются документы обоих типов – новая выписка попадет в позицию после последней имеющейся выписки и перед первой счет-фактурой.

На рисунке выписки банка показаны в виде картинки факса, а счет-фактуры – в виде бумажного документа.

 

Работа с очередями с использованием модулей Assign может использоваться и для задач, в которых приоритет отдается по какому-то содержательному признаку транзакта. Например, нужно пропустить больного с более тяжелым состоянием; оплатить сначала счета с меньшей суммой; отгрузить в первую очередь более массивные контейнеры и т.д.

К сожалению, существующие модули системы Arena не предусматривают реализацию «абсолютного приоритета», когда вновь прибывший транзакт может прервать обслуживание транзакта с более низким значением приоритета. Например, пришедший телефонный звонок может заставить работника приостановить работу над документом; поступление экстренного больного может приостановить осмотр врачом планового пациента; случившаяся неполадка компьютера приостанавливает выполнение работ и т.д.

Для решения подобных задач требуется обращаться непосредственно к языку моделирования SIMAN и к его блокам. Визуальные представления блоков содержаться в шаблоне Blocks [17]. В отличие от модуля, блок точно соответствует одной команде языка SIMAN.

В данном случае нам потребуются два блока: PREEMPT, который приостанавливает обслуживание транзакта с помощью некоторого ресурса и переключает этот ресурс на проходящий транзакт. А также блок RELEASE, освобождающий ресурс (в принципе можно было бы использовать и модуль Release).

Пример 8. На станции технического обслуживания автомобилей работает один специалист по ремонту. Раз в два часа (закон распределения экспоненциальный) прибывает очередная машина. Раз в 4 часа (закон распределения экспоненциальный) прибывает полицейский автомобиль. В этом случае работник приостанавливает обслуживание обычного автомобиля и приступает к работе с полицейской машиной. Затем он возвращается к прерванной работе и дообслуживает транзакт (обычную машину). Ремонт любой машины, как обычной, так и полицейской требует 1-2 часа (закон распределения равномерный).

 

Граф модели изображен на рисунке.

Верхний сегмент не требует пояснений, он отвечает за обработку обычных машин.

 

Нижний сегмент отвечает за обработку поступающих полицейских машин.

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

 

 

Далее следует обычный модуль Delay из шаблона Advanced Process, описывающий ремонт полицейской машины.

 

 

После этого, блок RELEASE отпускает ресурс ServiceMan. Теперь, если ранее работник прервал ремонт обычной машины, он сможет вернуться к этой работе и закончить ее.

Блок PREEMPT автоматически формирует очередь (если вслед за первой приходит вторая полицейская машина, ей приходится ожидать, пока будет закончен ремонт первой полицейской машины). Чтобы отразить эту очередь визуально, чтобы собирать по ней статистику при моделировании на Arena на уровне блоков необходимо явно помещать транзакт в очередь блоком QUEUE. Если транзакт сможет пройти в следующий после блока QUEUE блок, то он не попадет в очередь. Иначе – будет задержан в этой очереди до тех пор, пока не сможет последовать в следующий блок (когда обслуживание предыдущей полицейской машины будет окончено).

Вариант примера дополненный блоком QUEUE:

Саму очередь следует создать вручную в невизуальном компоненте QUEUE. Очередь для полицейских машин получила название PCQUEUE.

Далее потребовалось вручную разместить очередь с помощью соответствующего элемента анимации:

 

Затем в блоке QUEUE указываем идентификатор очереди PCQUEUE:

 

Теперь ожидающие ремонта полицейские машины помещаются в созданную очередь PCQUEUE, что позволяет отслеживать их визуально и собирать статистику.

 

 

 

 

Пример 9. Вернемся теперь к примеру с парикмахерской (Пример 1, Пример 6). Будем рассчитывать выручку заведения с учетом следующих расценок:

- мужская стрижка – 250 рублей;

- женская стрижка - 400 рублей;

- маникюр – 500 рублей.

Оценим выручку предприятия за период времени.

 

Для накопления информации о выручке заведем переменную Income. Для этого используем невизуальный модуль Variables, где введем имя переменной и зададим начальное значение – 0.

 

В граф модели поместим три модуля Assign, позволяющие учесть выручку от мужской стрижки, женской стрижки и маникюра. Например, в модуле с именем ManPay значение переменной Income увеличивается на 250.

 

 

Разместим графический элемент «переменная» и укажем в его поле expression имя переменной Income. Теперь по мере моделирования отображается получаемая выручка.

 

 

Пример 10. Усложним пример с парикмахерской (Пример 1, Пример 6, Пример 9). Будем считать, что женские прически в отличие от мужских могут быть нескольких видов, они будут отличаться по цене и по времени.

Типы причесок:

- «обычная», занимает 30+-10 минут, стоит 400 рублей;

- «сложная», занимает 60+-10 минут, стоит 700 рублей;

- «эксклюзивная», занимает 90+-10 минут, стоит 1200 рублей.

Будем считать, что женщины заказывают обычную прическу с вероятностью 50 %, сложную – 30%, эксклюзивную – 20%.

 

Заведем две переменных, точнее одномерных массива: price для цены и tmean для среднего времени стрижки.

 

Теперь нужно случайным образом выбрать для каждого поступающего транзакта-женщины тип желаемой прически. Будем хранить результат выбора в атрибуте tip.

Выбор типа можно сделать двумя способами. Первый способ - с помощью модуля Decide и трех модулей Assign.

 

 

Второй вариант менее нагляден, но позволяет сэкономить число блоков модели. Воспользуемся функцией дискретного распределения. Заведем один модуль Assign, где атрибуту tip присвоим значение:

 

DISC(0.5, 1, 0.8, 2, 1.0, 3)

 

Эта функция требует указать для каждого возможного варианта накопленную вероятность и соответствующее значение.

 

Исправленный граф модели:

 

 

Обратим внимание на изменения в модели. Теперь за стрижку мужчин и женщин отвечают разные модули Process, хотя при этом и задействованы одни и те же ресурсы-парикмахеры.

После генератора транзактов-женщин добавлен модуль типа Assign для выбора типа стрижки:

 

 

Новый модуль процесса HairCutWoman теперь использует значения массива для определения времени необходимого на стрижку. Подставляется то значение времени стрижки из массива tmean, которое соответствует типу стрижки, которую желает женщина.

 

 

Будет исправлен и модуль типа Assign, где учитывается стоимость стрижки - WomanPay. Теперь цена зависит от типа стрижки (используется массив price из которого выбирается элемент с номером, соответсвующим типом стрижки – по атрибуту tip):

 

 

Пример 11. После обработки детали на станке с вероятностью 15% возникает брак, который может быть устранен повторной обработкой на том же станке. Однако если после повторной обработки деталь снова окажется бракованной, этот брак считается неустранимым и деталь отправляется в утиль.

 

Чтобы организовать подобную модель введем специальный атрибут again, означающий, что деталь пошла на второй круг. В граф модели добавим модуль Assign, в котором мы пометим деталь, установив этот атрибут и модуль Decide, где значение атрибута будет проверяться.

 

Граф представлен на рисунке.

 

 

После модуля процесса ProcessDetail следует проверка с помощью модуля Decide с именем isOk, является ли деталь качественной. Выбран тип модуля «по вероятности».

 

 

Если деталь бракованная, осуществляется переход ко второму модулю Decide. Здесь установлен тип модуля «по условию». Выполняется проверка, не прошла уже деталь повторную обработку - если атрибут again равен единице. Этот атрибут играет роль метки. Если деталь прошла повторную обработку и по-прежнему является бракованной, то она направляется в утиль (модуль Dispose).

 

 

Если же бракованная деталь не помечена, то ее нужно направить на повторную обработку, но сначала на ней ставится метка с помощью модуля Assign. Атрибут again устанавливается в единицу. Далее деталь отправляется обратно в модуль ProcessDetail.

 

 

Обратим внимание, что атрибуты не нуждаются в предварительном объявлении. Инициация атрибута происходит в модуле assign при присвоении. Если значение атрибута не присвоено, то значением по умолчанию является 0. Проверка again==1 даст результат false.

Рассмотренную в примере модель можно организовать и по-другому. Можно добавить для повторной обработки деталей соответствующий процесс и новый модуль контроля. Более того, подобная организация более корректна, ведь сейчас мы делаем два неявных предположения: повторная обработка бракованной детали занимает столько же времени, что и обработка новой детали; вероятность того, что деталь окажется бракованной, одинакова как после первичной обработки, так и после повторной обработки бракованной детали.

В модулях processDetail и processAgain можно использовать один и тот же ресурс.

 

 

Контрольные вопросы

1) В чем отличие модуля и блока?

2) Как в Arena можно реализовать абсолютный приоритет?

3) Что делает модуль Assign?

4) Чем является Entity type?

5) Как можно поменять изображение транзакта в ходе моделирования?

6) Можно ли в модуле Assign использовать случайные величины?

7) Как можно реализовать относительный приоритет?

8) Каким образом можно зафиксировать факт прохождения транзактом какой-то обработки?

9) Транзакты соответствуют документам на получение сумм денег. Как можно отразить факт наличия разных сумм у разных документов?

10) Как рассчитать общую сумму, полученную по всем документам?

11) Как можно совместно использовать модули Decide и Assign?

12) Если время обработки транзакта зависит от некоторого свойства этого транзакта (например, длина пакет данных или вес привезенного груза), как это нужно отразить в модуле Process?

 



Поделиться:


Последнее изменение этой страницы: 2016-06-29; просмотров: 740; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.116.183 (0.075 с.)