- •Исправление ошибок в коде «Lab16.Gps»
- •Удаление лишних участков кода
- •Исправление опечаток в коде
- •Изменение числовых значений согласно варианту
- •Исправление ошибок, связанных с масштабом времени
- •Проблемы с целесообразностью проведения экспериментов
- •Реализация гипотез
- •Модификация кода для реализации гипотезы a
- •Модификация кода для реализации гипотезы b
- •Модификация кода для реализации гипотезы c
Исправление ошибок, связанных с масштабом времени
Согласно таблице 2.8, допустимое время изготовления деталей каждого из типов (до того, как деталь будет оштрафована), указанное в функции DTIM, также приведено в минутах, в то время, как единица модельного времени – 0,1 мин. Значит, нужно исправить данную функцию, умножая все её возвращаемые значения на 10:
** Функция допустимого времени пребывания на участке ** ** для каждого типа деталей ** DTIM FUNCTION P1,D4 1,1890/2,1600/3,2300/4,1400 |
** Функция допустимого времени пребывания на участке ** ** для каждого типа деталей ** DTIM FUNCTION P1,D4 1,18900/2,16000/3,23000/4,14000 |
Таким же образом исправляем правую границу первого интервала для четырёх таблиц, куда будут собираться данные о времени пребывания деталей каждого типа в модели:
** Сбор данных о времени пребывания по типам деталей BAD1 TABLE M1,1890,24000,2 BAD2 TABLE M1,1600,24000,2 BAD3 TABLE M1,2300,24000,2 BAD4 TABLE M1,1400,24000,2 |
** Сбор данных о времени пребывания по типам деталей BAD1 TABLE M1,18900,24000,2 BAD2 TABLE M1,16000,24000,2 BAD3 TABLE M1,23000,24000,2 BAD4 TABLE M1,14000,24000,2 |
Проблемы с целесообразностью проведения экспериментов
После устранения упомянутых выше несоответствий между написанным в методичке условием и кодом из файла «Lab16.gps» можно столкнуться со следующей проблемой: экспериментировать с гипотезами A и B попросту не имеет смысла, так как из-за слишком медленного поступления деталей станки успевают обрабатывать их вовремя, и как ускорение, так и увеличение количества станков пойдут только в убыток. Гипотеза C (назначение приоритетов деталям в зависимости от близости дедлайна и величины штрафа) может разве что увеличить число изготовленных деталей на момент окончания моделирования, но к глобальным изменениям в работе модели не приведёт, так как ни одна деталь всё равно не будет штрафоваться.
Поэтому, как вариант, можно не выполнять действий, описанных в п.1.4, и не умножать на 10 среднее время появления деталей, как было предложено в п.1.3. Вероятно, это и «подразумевалось» автором задания, поскольку при таких значениях применение гипотез A, B или C может иметь смысл с точки зрения увеличения суммарного дохода.
Реализация гипотез
Модификация кода для реализации гипотезы a
Гипотеза A подразумевает ускорение обработки деталей на некоторых станках за счёт дохода, который эти детали будут приносить. Будем управлять этой гипотезой с помощью четырёх величин (в будущем их можно будет задавать в файле экспериментов), каждая из которых обозначает, сколько станков данного типа ускоряется по этой гипотезе:
ACCEL1 EQU 0 ; количество ACCEL2 EQU 0 ; ускоренных ACCEL3 EQU 0 ; по гипотезе А ACCEL4 EQU 0 ; станков каждого типа |
Например, ACCEL3 обозначает, сколько фрезерных станков ускоряется по гипотезе A.
Значения этих величин должны лежать в диапазоне [0, Sj+Rj], где Sj+Rj – вместимость МКУ, объявленная с помощью оператора STORAGE (количество станков данного типа).
Для того, чтобы значения этих величин были доступны по номеру типа станка, добавим в код следующую функцию:
;; Функция, возвращающая кол-во станков типа P4, ускоренных по гипотезе А ACCEL FUNCTION P4,D4 1,ACCEL1/2,ACCEL2/3,ACCEL3/4,ACCEL4 |
Эта функция принимает на вход 4-ый параметр транзакта, поскольку именно в параметре 4, согласно рассматриваемому коду «Lab16.gps», хранится номер типа станка, на котором деталь обслуживается в данный момент.
Также нам понадобится функция, возвращающая, сколько времени будет сэкономлено при обработке детали на текущем станке. Эта функция работает таким же образом, как функция TIME, принимая на вход текущий этап обработки детали, сохраняемый в параметре транзакта 3. Возвращает она 20% от времени, возвращаемого функцией TIME:
;; Функция времени ускорения станка типа P3 (20% от времени обработки) ACCELTIME FUNCTION P3,D19 1,17.6/2,24/3,24/4,26/5,21/6,23 7,40/8,28/9,29/10,32 11,35.2/12,38/13,28/14,23.2/15,60 16,38/17,33.6/18,26/19,38 |
Последняя функция, которую нужно добавить в код для реализации гипотезы A, – это функция, возвращающая процент от стоимости детали, который будет утерян из-за ускорения станков (таблица 2.9 методички «method_lab_tomash.doc»). Её код:
;; Функция, возвращающая, сколько % от прибыли деталь, ;; обработка которой была ускорена, потеряет ALOSS FUNCTION P9,D16 1,1.5/2,1.2/3,2.8/4,2.0 5,2.5/6,1.5/7,3.0/8,2.8 9,3.0/10,2.0/11,3.5/12,3.2 13,3.5/14,2.8/15,3.8/16,3.6 |
Каким образом мы будем получать из этой функции нужные нам значения в зависимости от типа обрабатываемой детали (столбцы таблицы 2.9) и количества ускоренных станков того или иного типа (строки этой таблицы), будет рассмотрено ниже.
Теперь перейдём к участку кода, где инициализируются параметры транзактов. Допишем после строки « ASSIGN 6,FN$DTIM ;допустимое время» следущие строки:
ASSIGN 7,0 ; время ускорения обработки детали ASSIGN 8,0 ; сумма, потерянная при ускорении обработки детали (отнимается от дохода) ASSIGN 9,0 ; входной параметр функции ALOSS |
Добавленный параметр транзакта 7 будет хранить значение времени, которое будет отниматься от параметра 5 (время обработки детали на станке). Параметр 8 будет накапливать суммарные потери от обработки данной детали на всех ускоренных станках, через которые она пройдёт. Параметр 9 носит вспомогательный характер: в него будет записываться аргумент для функции ALOSS, вычисляемый по формуле:
|
(2.1) |
где
– количество ускоренных станков того
типа, на котором обрабатывается текущая
деталь (получается посредством вызова
функции ACCEL);
– тип обрабатываемой детали
(хранится в параметре транзакта 1).
Таким образом, если всего был
ускорен один станок того типа, на станке
которого обрабатывается текущая деталь,
а эта деталь имеет тип 2, то
примет значение
и функция ALOSS
возвратит значение
(см. таблицу 2.9 из методички). Если,
например, было ускорено три станка
нужного типа и сама деталь имеет тип 4,
то
примет значение
и функция ALOSS
будет возвращать значение
(третья строка, четвёртый столбец таблицы
2.9).
Всё готово, чтобы реализовать нужный нам функционал. Модифицируем участок кода между блоками «DEPART» и «LEAVE» следующим образом:
ENTER P4 ;занятие станка DEPART P4 ;выход из очереди ADVANCE P5 ;обработка на станке LEAVE P4 ;освобождение станка
|
ENTER P4 ;занятие станка DEPART P4 ;выход из очереди
TEST LE S*4,FN$ACCEL,l_skipA ; сначала занимать ускоренные станки этого типа, ;а если таких не осталось - неускоренные ;TEST L R*4,FN$ACCEL,l_skipA ; сначала занимать неускоренные станки этого типа, ; а если таких не осталось - ускоренные ASSIGN 7,FN$ACCELTIME ; сохранить время ускорения ASSIGN 9,((FN$ACCEL-1)#4+P1) ; параметр для функции ALOSS ASSIGN 8+,(FN$MDOH#FN$ALOSS/100) ; определить убытки от ускорения l_skipA ADVANCE (P5-P7) ;обработка на станке
LEAVE P4 ;освобождение станка
|
При занятии МКУ, соответствующего
множеству станков нужного типа, транзакты
попадают в блок TEST,
где распределяются по ускоренным и
неускоренным станкам в зависимости от
количества занятых мест в МКУ и общего
числа ускоренных станков данного типа.
Сначала занимаются ускоренные станки,
а если таковых не осталось – неускоренные
(альтернативный вариант закомментирован,
так как эксперименты показывают, что в
итоге он приводит к получению меньшей
прибыли). Если текущее значение содержимого
многоканального устройства (СЧА МКУ
),
на которое ссылается параметр 4 текущего
транзакта, не больше числа ускоренных
станков этого типа, то транзакт проходит
далее на блок ASSIGN
и обрабатывается как деталь, поступившая
на ускоренный станок. В противном случае
все ускоренные станки, если такие есть,
уже были заняты и деталь обрабатывается
на неускоренном станке – транзакт
переходит сразу на блок ADVANCE,
когда в его параметрах 7 (время ускорения)
и 8 (потери из-за ускорения станка)
по-прежнему хранятся нулевые значения.
Перед блоком «ADVANCE (P5-P7)» над транзактом, моделирующим обрабатываемую на ускоренном станке деталь, выполняются следующие действия. В параметр 7 записывается время ускорения обработки детали, полученное из функции ACCELTIME. В параметр 9 записывается аргумент для функции ALOSS, определяемый согласно (2.1). После чего к параметру 8 прибавляется значение убытков, определяемых гипотезой A (эти убытки суммируются по всем ускоренным станкам, через которые пройдёт деталь), которое вычисляется по следующей формуле:
|
(2.2) |
где
– доход, приносимый одной изготовленной
деталью типа
;
– процент дохода, определяющий потери
от ускорения обработки детали на текущем
станке, взятый из приведённой в методичке
таблицы 2.9 и возвращаемый функцией
ALOSS.
Последнее, что осталось для возможности корректного проведения экспериментов с гипотезой A, – это учёт связанных с этой гипотезой изменений дохода, приносимого текущей деталью. Для реализации этого учёта внесём следующее изменение в код:
TEST L P6,M1,DDD ;штрафовать? Нет - DDD SAVEVALUE SHTRAF+,FN$MSHT ;штраф SAVEVALUE DOHOD-,FN$MSHT ;определение дохода DDD SAVEVALUE DOHOD+,FN$MDOH ;определение дохода SAVEVALUE DOHOD-,FN$CEB ;определение дохода SAVEVALUE CEBECT+,FN$CEB ;определение * себестоимости TERMINATE |
TEST L P6,M1,DDD ;штрафовать? Нет - DDD SAVEVALUE SHTRAF+,FN$MSHT ;штраф SAVEVALUE DOHOD-,FN$MSHT ;определение дохода DDD SAVEVALUE DOHOD+,(FN$MDOH-P8) ;определение дохода SAVEVALUE DOHOD-,FN$CEB ;определение дохода SAVEVALUE CEBECT+,FN$CEB ;определение * себестоимости TERMINATE |
Теперь всё готово для проведения экспериментов, связанных с ускорением станков по гипотезе A, посредством изменения величин ACCEL1, ACCEL2, ACCEL3, ACCEL4.

,
,