Проблемы с целесообразностью проведения экспериментов

Содержание

1  ИСПРАВЛЕНИЕ ОШИБОК В КОДЕ «Lab16.gps». 2

1.1    Удаление лишних участков кода. 2

1.2    Исправление опечаток в коде. 3

1.3    Изменение числовых значений согласно варианту. 4

1.4    Исправление ошибок, связанных с масштабом времени. 5

1.5    Проблемы с целесообразностью проведения экспериментов. 5

2  РЕАЛИЗАЦИЯ ГИПОТЕЗ. 6

2.1    Модификация кода для реализации гипотезы A.. 6

2.1    Модификация кода для реализации гипотезы B. 9

2.1    Модификация кода для реализации гипотезы C. 10

 

 


 

ИСПРАВЛЕНИЕ ОШИБОК В КОДЕ «Lab16.gps»

Удаление лишних участков кода

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

...

KNV EQU 5

...

KNV STORAGE 200    ; вместительность конвейера

...

** Функция времени движения деталей по участку

GO           FUNCTION P3,D19

1,16/2,23/3,23/4,23/5,55/6,38/7,35

8,38/9,29/10,23/11,16/12,40/13,55

14,55/15,33/16,55/17,38/18,23/19,38

** Функция времени для выхода детали из участка

EXIT_        FUNCTION P1,D4

1,68/2,33/3,16/4,16

...

ENTER  KNV    ;поступление на конвейер

...

ASSIGN       7,FN$GO ;время движения к станку

ADVANCE      P7     ;время движения по конвейеру

...

ASSIGN       7,FN$EXIT_ ;время выхода из участка

ADVANCE      P7     ;выход из участка

LEAVE  KNV    ;выход из конвейера

...

 

Также из начала кода удаляем строчки

ROUTE        EQU 5

TIME EQU 6

просто потому, что они не нужны: далее ROUTE и TIME переопределяются как функции и вызываются непосредственно по именам FN $ ROUTE и FN $ TIME.


 

Исправление опечаток в коде

Исправляем опечатку: в функции

** Функция времени наработки для каждого этапа TIME         FUNCTION P3,D19 1,88/2,120/3,120/4,130/5,105/6,92 7,200/8,140/9,145/10,160 11,176/12,190/13,140/14,116/15,300 16,190/17,168/18,130/19,190

выделенное число «92», согласно таблице 2.7 из методички «method_lab_tomash.doc», следует заменить на 115 (единица модельного времени – десятая доля минуты):

** Функция времени наработки для каждого этапа TIME         FUNCTION P3,D19 1,88/2,120/3,120/4,130/5,105/6,115 7,200/8,140/9,145/10,160 11,176/12,190/13,140/14,116/15,300 16,190/17,168/18,130/19,190

 


 

Изменение числовых значений согласно варианту

Игнорируем в начале условия лабораторной работы абзац

«Час надходження деталей на дільницю має розподіл Пуассона із середнім зна­ченням 24 деталі за 8 годин роботи дільниці. Поява будь-якого типу роботи рівноймовірна та не залежить від робіт інших типів. »,

поскольку он противоречит условию этой лабораторной, сформулированному далее: среднее время поступления деталей и вероятности появления деталей каждого из типов приводятся для каждого из вариантов ниже в таблице 2.11 (ориентируемся на методичку «method_lab_tomash.doc»). В соответствии с этой таблицей нужно изменить операнд A блока GENERATE

GENERATE 210,FN$EXPDIS

на число, приведённое в таблице для нужного варианта, умноженное на 10 (не забываем о том, что единица модельного времени – 0,1 минуты, а не 1 минута). Так, для варианта 1 данная строчка кода будет иметь вид

GENERATE 1800,FN$EXPDIS

               

           Также по таблице 2.11 меняем в соответствии с вариантом вероятности появления деталей в функции

** Функция типов деталей

TYP          FUNCTION RN1,D4

.25,1/.40,2/.75,3/1,4

           Например, для варианта 1 (вероятности 30%, 15%, 40%, 15% для деталей типа 1, 2, 3 и 4 соответственно) функция примет вид

** Функция типов деталей

TYP          FUNCTION RN1,D4

.30,1/.45,2/.85,3/1,4

 

           Примечание:

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


 

Исправление ошибок, связанных с масштабом времени

           Согласно таблице 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

 

 

Проблемы с целесообразностью проведения экспериментов

После устранения упомянутых выше несоответствий между написанным в методичке условием и кодом из файла «Lab 16. gps» можно столкнуться со следующей проблемой: экспериментировать с гипотезами A и B попросту не имеет смысла, так как из-за слишком медленного поступления деталей станки успевают обрабатывать их вовремя, и как ускорение, так и увеличение количества станков пойдут только в убыток. Гипотеза C (назначение приоритетов деталям в зависимости от близости дедлайна и величины штрафа) может разве что увеличить число изготовленных деталей на момент окончания моделирования, но к глобальным изменениям в работе модели не приведёт, так как ни одна деталь всё равно не будет штрафоваться.

Поэтому, как вариант, можно не выполнять действий, описанных в п.1.4, и не умножать на 10 среднее время появления деталей, как было предложено в п.1.3. Вероятно, это и «подразумевалось» автором задания, поскольку при таких значениях применение гипотез A, B или C может иметь смысл с точки зрения увеличения суммарного дохода.


 

РЕАЛИЗАЦИЯ ГИПОТЕЗ

2.1Модификация кода для реализации гипотезы A

Гипотеза A подразумевает ускорение обработки деталей на некоторых станках за счёт дохода, который эти детали будут приносить. Будем управлять этой гипотезой с помощью четырёх величин (в будущем их можно будет задавать в файле экспериментов), каждая из которых обозначает, сколько станков данного типа ускоряется по этой гипотезе:

ACCEL1 EQU 0      ; количество ACCEL2 EQU 0      ; ускоренных ACCEL3 EQU 0      ; по гипотезе А ACCEL4 EQU 0      ; станков каждого типа

Например, ACCEL 3 обозначает, сколько фрезерных станков ускоряется по гипотезе A.

Значения этих величин должны лежать в диапазоне [0, Sj+Rj], где Sj+Rj – вместимость МКУ, объявленная с помощью оператора STORAGE (количество станков данного типа).

Для того, чтобы значения этих величин были доступны по номеру типа станка, добавим в код следующую функцию:

;; Функция, возвращающая кол-во станков типа P4, ускоренных по гипотезе А ACCEL        FUNCTION P4,D4 1,ACCEL1/2,ACCEL2/3,ACCEL3/4,ACCEL4

Эта функция принимает на вход 4-ый параметр транзакта, поскольку именно в параметре 4, согласно рассматриваемому коду «Lab 16. 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.


 

2.1Модификация кода для реализации гипотезы B

Согласно гипотезе B, можно увеличивать число станков каждого типа вплоть до четырёх, однако это повлечёт за собой увеличение себестоимости изготавливаемых деталей.

Управление применением гипотезы B будем осуществлять посредством изменения операнда A оператора STORAGE, где объявляются размеры каждого из многоканальных устройств, моделирующих множество станков определённого типа.

Для реализации гипотезы B добавим в код следующую функцию:

;; Функция, возвращающая, на сколько % увеличится себестоимость детали ;; при использовании гипотезы B, если кол-во станков типа P4 увеличили на 1 BLOSS        FUNCTION P4,D4 1,5/2,8/3,7/4,10

По сути, эта функция заменяет нам таблицу 2.10 из методички, так как, в действительности, вся эта таблица в явном виде не нужна: вторая её строка являет собой первую, умноженную на 2, а третья – первую, умноженную на 3.

Теперь перейдём к участку кода, где производится инициализация параметров транзактов, и добавим туда следующую строчку:

ASSIGN             1,FN$TYP ;тип детали ASSIGN             2,FN$JOB ;количество этапов ASSIGN             3,FN$JTAP ;номер первого этапа ASSIGN             6,FN$DTIM ;допустимое время   ASSIGN 7,0 ; время ускорения обработки детали ASSIGN 8,0 ; сумма, потерянная при ускорении обработки детали (отнимается от дохода) ASSIGN 9,0 ; входной параметр функции ALOSS   ASSIGN 10,0 ; сумма, потерянная при использовании гипотезы B (прибавляется к себестоимости)

Как и написано в комментариях, параметр транзакта 10 будет накапливать сумму убытков от применения гипотезы B для изготовления текущей детали, которая будет прибавляться к себестоимости (а значит, вычитаться из дохода). Прибавление очередного слагаемого к этой сумме будет осуществляться при обработке детали на некотором станке, общее число которых было увеличено. Это слагаемое определяется согласно следующей формуле:

, (2.3)

где     – общее число (как занятых, так и свободных) станков того типа, на станке которого обрабатывается текущая деталь;

            – себестоимость этой детали, получаемая из функции CEB;

            – дополнительный процент себестоимости при увеличении числа станков данного типа на 1 (значение, возвращаемое функцией BLOSS).

Для вычисления этих убытков добавим в код, где транзакт проходит уже через конкретное МКУ, следующую строчку:

ASSIGN 9,((FN$ACCEL-1)#4+P1) ; параметр для функции ALOSS ASSIGN 8+,(FN$MDOH#FN$ALOSS/100) ; определить убытки от ускорения l_skipA ADVANCE (P5-P7) ;обработка на станке ASSIGN 10+,((S*4+R*4-1)#FN$CEB#FN$BLOSS/100) ; определить увеличение себестоимости                                     ; из-за увеличения числа станков LEAVE P4   ;освобождение станка

Всё, что осталось, – учитывать накапливаемое в параметре 10 значение перед уничтожением транзакта, изменяя суммарные значения дохода и себестоимости. Для этого внесём следующие изменения в последний участок кода, который обрабатывает транзакты-детали:

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
TEST L P6,M1,DDD ;штрафовать? Нет - DDD SAVEVALUE SHTRAF+,FN$MSHT ;штраф SAVEVALUE DOHOD-,FN$MSHT  ;определение дохода DDD SAVEVALUE DOHOD+,(FN$MDOH-P8)  ;определение дохода SAVEVALUE DOHOD-,(FN$CEB+P10)  ;определение дохода SAVEVALUE CEBECT+,(FN$CEB+P10)  ;определение *                                   себестоимости TERMINATE

 

 

2.1Модификация кода для реализации гипотезы C

Использование гипотезы C предполагает назначение транзактам-деталям приоритетов в зависимости от их близости к дедлайну и величины штрафа за их несвоевременное изготовление.

Управлять применением этой гипотезы будем с помощью одного значения, которое может быть равно только нулю или единице:

HYPC EQU 0 ; если = 1, то гипотеза C учитывается, иначе = 0

Вычисляемое значение назначаемого приоритета будет умножаться на HYPC. Таким образом, если HYPC = 0, все генерируемые транзакты будут иметь одинаковый приоритет – нулевой. Если же HYPC = 1, то приоритет транзактов-деталей будет определяться по следующей формуле:

, (2.4)

где                – величина штрафа за несвоевременное завершение изготовления текущей детали (значение, возвращаемое функцией MSHT);

    – допустимое время пребывания детали на участке (значение, возвращаемое функцией DTIM);

    – время пребывания детали на участке (СЧА  транзакта);

   ,  – экспериментально подобранные величины, имеющие цель «загнать» вычисляемый приоритет в допустимый диапазон [0, 127].

Если поправки из п.1.4 были учтены и допустимое время пребывания детали на участке умножалось на 10, в выражении (2.4) следует брать . Если нет и допустимое время для деталей 1, 2, 3 и 4 типа равно, соответственно, 1890, 1600, 2300 и 1400 единиц модельного времени, то следует взять . Поскольку при указанных  минимальное значение отношения  равно , для такого случая рекомендуется принять .

Исходя из сказанного выше, вставим в код следующую строчку непосредственно перед занятием деталью конкретного станка, после метки NEXT (так как приоритет должен пересчитываться каждый раз, поскольку значение СЧА  каждый раз будет другое):

NEXT ASSIGN                4,FN$ROUTE ;тип станка ASSIGN                5,FN$TIME ;время наработки   PRIORITY (HYPC#(1000#FN$MSHT/(FN$DTIM-M1)-42))   QUEUE                 P4        ;очередь к станку ENTER                 P4        ;занятие станка

 

Теперь всё готово для проведения экспериментов с использованием гипотезы C посредством изменения значения HYPC.


Дата добавления: 2023-01-08; просмотров: 13; Мы поможем в написании вашей работы!

Поделиться с друзьями:




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