Опубликован: 07.11.2014 | Доступ: свободный | Студентов: 441 / 37 | Длительность: 15:17:00
ISBN: 978-5-9556-0161-8
Тема: САПР
Лекция 3:

Модель процесса изготовления в цехе деталей

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Проведение исследований

Полагаем, что вы ввели программу модели, исправили ошибки и выполнили указанное количество прогонов модели. Фрагмент отчёта приведен ниже.

SAVEVALUE       RETRY        VALUE
 PROG             0      16641.000
 NDET             0          9.000
 BRAK             0          3.000
 DOLJABRAK        0          0.279
 DOLJADET         0          0.721
 SDET             0         48.559

В результате решения прямой задачи получим, что за 8 часов цехом будет изготовлено деталей, относительная доля готовых деталей составит DoljaDet = 0,721, а среднее время изготовления одной детали SDet = 48,559 мин. При этом будет забраковано Brak = 3 детали, относительная доля которых составит DoljaBrak = 0,2279.

Фрагмент отчёта, если не использовать процедуру INT, т.е. не округлять до целого количество изготовленных и количество забракованных деталей:

SAVEVALUE       RETRY        VALUE
 PROG             0      16641.000
 NDET             0          9.885
 BRAK             0          3.821
 DOLJABRAK        0          0.279
 DOLJADET         0          0.721
 SDET             0         48.559

За 8 часов цехом будет изготовлено Ndet = 9,885 деталей, относительная доля готовых деталей DoljaDet = 0,721 и среднее время изготовления одной детали SDet = 48,559 мин останутся такими же. При этом будет забраковано Brak = 3,821 деталей, относительная доля которых от общего количества готовых и забракованных DoljaBrak = 0,279 также не изменится.

Замечание. Если вы вместо 1000 укажите 100 предварительных прогонов и запустите модель, то получите тот же результат.

Решение обратной задачи

Целью обратной задачи является определение среднего времени на изготовление какого-то количества деталей. Для проверки работоспособности модели возьмём количество деталей, полученных в результате решения прямой задачи, т.е. Det = 9.

Особенности построения программы модели

Модель для решения обратной задачи приведена ниже.

; Модель процесса изготовления деталей. Обратная задача

…

;	Имитация выполнения 3-й операции
	ASSIGN		2,3	; Код 3 в Р2-признак 3-й операции
Oper3	QUEUE	P2				; Встать в очередь
	SEIZE		Konveer3	; Начать третью операцию
	DEPART		P2				; Покинуть очередь
	ADVANCE		(Exponential (23,0,T3)) ; 3-я операция
	RELEASE		Konveer3		; Закончить 3-ю операцию
	ADVANCE		(Exponential (23,0,Tk3)); Контроль 3-й операции
	TRANSFER	q3_,,Sboi 	; Брак на пункт контроля
	TRANSFER	,Met2			; Готовые детали
; Сегмент имитации работы пункта контроля
Sboi	QUEUE		Kont			; В очередь на пункт контроля
	SEIZE		Kontr		; Занять пункт контроля
	DEPART		Kont			; Покинуть очередь на пункт контроля
	ADVANCE		(Exponential(23,0,Tk)); Окончательный контроль
	RELEASE		Kontr		; Освободить пункт контроля
	TRANSFER	q4_,,EndOper	; В окончательный брак
	TEST E		P1,1,EndOper	; Если второй раз, то в окончательный брак
	ASSIGN		1,2	; Код 2 в Р1-деталь пойдёт второй раз
Met1	TRANSFER	,(Met1+P2)
	TRANSFER	,Oper1		; Повторно на 1-ю операцию
	TRANSFER	,Oper2		; Повторно на 2-ю операцию
	TRANSFER	,Oper3		; Повторно на 3-ю операцию
EndOper	TERMINATE		; Счет брака
; Сегмент завершения моделирования и расчета результатов
Met2	TEST L	X$Prog,TG1,Met3	; Если условие выполняется, то
	SAVEVALUE Prog,TG1	  ; X$Prog=TG1 счетчику завершений
Met3	SAVEVALUE	NDet+,1		  ; Счет количества готовых деталей
	TEST E	X$NDet,Det,Ter1	; Если готово Det деталей, зафиксировать один прогон
  	TEST E	TG1,1,Met4 ; Если в счетчике завершений 1, то расчет результатов моделирования
	SAVEVALUE	Brak,(N$EndOper/X$Prog) ; Количество забракованных деталей, шт.
	SAVEVALUE	DoljaBrak,(X$Brak/(X$Brak+Det); Общая доля брака
	SAVEVALUE	DoljaDet,(Det/(X$Brak+Det))	; Доля готовых деталей
	SAVEVALUE	Brak,(INT(X$Brak)) ; Количество забракованных деталей (целое), шт.
	SAVEVALUE	TDet,(((AC1-X$AC2)/X$Prog)/60); Среднее время изготовления Det деталей, час
	SAVEVALUE SDet,((X$TDet/Det)#60); Среднее время изготовления одной детали, мин
	SAVEVALUE	AC2,AC1	; Время предварительных прогонов
	SAVEVALUE	X$Prog,0	; Обнуление ячейки X$Prog
Met4	SAVEVALUE	NDet,0		; Обнуление X$NDet
	TERMINATE	1		; Из счётчика завершений минус 1
Ter1	TERMINATE			; Вывод вспомогательных транзактов
	START	1000,NP	; Число предварительных прогонов модели
	RESET				; Сброс статистики
	START	16641	; Число основных прогонов модели

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

Det	EQU		9		; Количество деталей, которые нужно изготовить

Округление до целого количества забракованных деталей производится после расчёта доли готовых и забракованных деталей. Если иначе, то расчёт долей будет некорректным.

В программе модели прямой задачи годные детали после выполнения 3-й операции подсчитывались. Имитирующие их транзакты уничтожались:

EndOper1		TERMINATE			; Счёт готовых деталей

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

TRANSFER	,Met2			; Готовые детали

Сегмент имитации работы пункта контроля остаётся неизменным. Остановимся на сегменте завершения моделирования и расчета результатов.

Сохраняемая ячейка NDet служит для счёта текущего количества изготовленных деталей. Как только выполняется условие X$NDet = Det, фиксируется один прогон модели. Det - переменная пользователя, которой задаётся количество деталей, время подготовки которых нужно определить.

Вам уже известно, что модельное время предварительных прогонов не должно учитываться при расчёте среднего времени изготовления 9 деталей. Поэтому оно запоминается в сохраняемой ячейке X$AC2, а при расчте вычитается из AC1:

SAVEVALUE	TDet,(((AC1-X$AC2)/X$Prog)/60)	; Среднее время изготовления Det деталей, час
Проведение исследований

Фрагмент отчёта приведен ниже:

SAVEVALUE     RETRY        VALUE
 PROG           0      16641.000
 BRAK           0          3.000
 DOLJABRAK      0          0.279
 DOLJADET       0          0.721
 TDET           0          7.266
 SDET           0         48.443

В результате решения обратной задачи получим, что деталей будут изготовлены цехом за TDet = 7,266 часа, относительная доля которых составит DoljaDet = 0,721, а среднее время изготовления одной детали SDet = 48,443 мин. При этом будет забраковано Brak = 3 детали, относительная доля которых составит DoljaBrak = 0,279.

Замечание. Если вы замените 1000 предварительных прогонов на 100 и запустите модель, то получите:
SAVEVALUE       RETRY        VALUE
 PROG             0      16641.000
 BRAK             0          3.000
 DOLJABRAK        0          0.278
 DOLJADET         0          0.722
 TDET             0          7.256
 SDET             0         48.374

Видно, что результаты моделирования изменились незначительно. Но если эти изменения для вас несущественны, можно оставить указанное число предварительных прогонов модели в дальнейших исследованиях.

Проведение экспериментов

В "Модель обработки запросов сервером" был проведен дисперсионный анализ с имитационной моделью, предназначенной для решения прямой задачи. Здесь же мы проведём дисперсионный анализ с моделью, решающей обратную задачу.

Исследовать влияние качестваq_1, q_2, q_3, q_4 выполнения операций на время изготовления D деталей. Значения уровней факторов приведены в Табл. 2.2.

Таблица 2.2.
Уровни факторов Факторы
q_1 q_2 q_3 q_4
Нижний 0,1 0,15 0,1 0,2
Верхний 0,25 0,35 0,2 0,9

Результаты моделирования необходимо получить с точностью \varepsilon = 1 мин и доверительной вероятностью \alpha = 0,99. Но поскольку остаётся условие определения относительного числа подготовленных деталей, то количество прогонов остаётся равным 16641, что и в модели для решения прямой задачи.

Некоторые особенности построения для такого случая модели были изложены в п. 2.1.2.1. Однако показатели, которые там определялись в дисперсионном анализе, не были временными. А это является существенным в построении сегмента организации завершения моделирования.

Поскольку результатом моделирования является оценка математического ожидания времени TDet изготовления Det деталей, то в ее вычислении используется абсолютное модельное время АС1 (системный числовой атрибут). При проведении дисперсионного анализа встроенный генератор эксперимента имеет две команды START, а между ними - команда RESET. Команда RESET не влияет на абсолютное модельное время. Поэтому АС1 будет суммой абсолютного модельного времени предварительных прогонов до установившегося режима, обозначим его АС2, и абсолютного модельного времени, пусть АС3, основных прогонов, в ходе которых собирается интересующая нас статистика. Нам для расчетов нужно АС3. Для его получения в программу введены строки:

SAVEVALUE AC3,(AC1-X$AC2) SAVEVALUE AC2,AC1

После предварительных прогонов в ячейке X$Prog сохранится указанное в первой команде START количество прогонов. Эта ячейка используется в первой строке рассматриваемого сегмента и её содержимое должно быть равным нулю. В противном случае модель будет работать неверно. Для предотвращения ошибки введена строка:

SAVEVALUE X$Prog,0
Замечание. Если предварительное число прогонов модели меньше числа основных прогонов, то можно обойтись и без этой команды.

Проведите эксперимент. Как проводится дисперсионный анализ, вы уже знаете. Теме не менее, установите необходимые данные эксперимента согласно Рис. 2.2. Укажите число предварительных прогонов 1000 вместо 100, установленных по умолчанию.

Результаты эксперимента показаны на Рис. 2.3. Видно, что все четыре фактора существенные. Наибольшее влияние на функцию отклика оказывает фактор В, что вполне логично, так как из первых трёх он имеет наибольший верхний уровень, т. е. наибольшую долю брака. Наименьшую значимость имеет фактор С, что также объясняется более низким значением доли брака.

Измените непосредственно в процедуре запуска сгенерированного Plus-эксперимента количество предварительных прогонов с 1000 на 100 и запустите модель. Вы получите практически те же самые результаты, например, Grand Mean = 9,006 вместо 9,017.

Диалоговое окно (заполненное) Screening Experiment Generator (Генератор отсеивающего эксперимента)

Рис. 2.2. Диалоговое окно (заполненное) Screening Experiment Generator (Генератор отсеивающего эксперимента)
Результаты отсеивающего эксперимента

увеличить изображение
Рис. 2.3. Результаты отсеивающего эксперимента

Модель в AnyLogic

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

  • исходные данные;
  • подготовка заготовки;
  • операция 1;
  • операция 2;
  • операция 3;
  • пункт окончательного контроля;
  • склад готовых деталей;
  • склад бракованных деталей.
  • результаты моделирования.

Исходные данные. Использование массивов

Для ввода исходных данных используем элементы Параметр.

  1. Выполните команду Файл/Создать/Модель на панели инструментов.
  2. В поле Имя модели диалогового окна Новая модель введите Изготовление_в_цехе_деталей. Выберите каталог, в котором будут сохранены файлы вашей модели.
  3. Щёлкните кнопку Готово.
  4. Создайте область просмотра для размещения элементов сегмента Цех.
  5. Из палитры Презентация перетащите элемент Область просмотра.
  6. На панели Свойства в поле Имя: введите цех.
  7. Задайте Выравнивать по: Верхн. левому углу.
  8. Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  9. На странице Местоположение и размер введите в поля X: 0, Y: 0, Ширина: 780, Высота: 530.
  10. Перетащите элемент Скруглённый прямоугольник. На странице Местоположение и размер установите: X: 280, Y: 300, Ширина: 250, в поле Высота: 220.
  11. Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Исходные данные.
  12. В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные. Разместите их так, как показано на Рис. 2.4. Значения свойств установите согласно Табл. 2.3. На Рис. 2.4, как вы, наверное, уже заметили, два элемента Параметр отличаются от остальных. Они используются для ввода данных Табл. 2.1 как одномерных массивов.
Размещение элементов Параметр для ввода исходных данных

увеличить изображение
Рис. 2.4. Размещение элементов Параметр для ввода исходных данных
Таблица 2.3.
Элементы и их свойства
Параметр Параметр
Имя Тип Значение по умолчанию Имя Тип Значение по умолчанию
Tn double 35 Tk1 double 4
T1 double 30 Tk2 double 5
T2 double 25 Tk3 double 15
T3 double 35 Tk double 8
q1 double 0,12 врМод double 480
q2 double 0,15 колПрог double 16641
q3 double 0,1
q4 double 0,8

Создайте размерности массивов. В данном случае они одинаковые. Элементов в одной строке Табл. 2.1 шесть. Предположим, что число видов заготовок может увеличиться до 10. Значит размерность одного массива 10 элементов.

  1. Щёлкните правой кнопкой мышки в панели Проекты и в контекстном меню выберите Создать/Размерность.
  2. В открывшемся окне Размерность в поле Имя введите КолВарЗаг.
  3. Установите Тип размерности: Диапазон.
  4. В открывшееся поле Диапазон: введите 1-10.
  5. Щёлкните Готово.

Теперь создайте непосредственно массивы. Начните с массива верВарЗаг для вероятностей появления видов заготовок.

  1. Из Палитры Основные перетащите элемент Параметр.
  2. На странице Основные панели Свойства в поле Имя: введите верВарЗаг. Тип: double.
  3. Установите флажок Массив. Откроется окно Размерности (Рис. 2.5). Щёлкните по расположенной справа от окна и подсвеченной зелёным кнопке.
    Окно элемента Параметр - массива

    увеличить изображение
    Рис. 2.5. Окно элемента Параметр - массива
  4. Откроется окно Edit dimensions (Рис. 2.6). В окошке Возможные размерности: выделите КолВарЗаг.
  5. Щёлкните по кнопке . Размерность КолВарЗаг появится в окошке Выбранные размерности.
  6. Закройте окно. Вы вернётесь на панель Свойства. В окошке Размерности вы увидите размерность КолВарЗаг.
  7. Щёлкните Редактировать значения массива. Откроется одноимённое диалоговое окно (2.7 ).
    Окно Выбор размерности

    Рис. 2.6. Окно Выбор размерности
    Окно Редактирование значений массива

    увеличить изображение
    Рис. 2.7. Окно Редактирование значений массива
  8. В левой части окна стрелками показано размещение элементов массива. Оставим горизонтальное. Элементы массива имеют разные значения. Поэтому не используем [ВСЕ].
  9. В правой части окна введите значения элементов массива:
    0.05,0.18,0.34,0.56,0.85,1,0,0,0,0

    Обратите внимание, что данные из первой строки Табл. 2.1 введены в порядке возрастания, причём, второй элемент = первый элемент Табл. 2.1 + второй Табл. 2.1, третий = второй + третий Табл. 2.1 и т.д. Эта особенность будет учтена в последующем программном коде. Хотя можно было бы ввести и так, как в Табл. 2.1.

  10. Щёлкните ОК. Вы вернётесь на панель Свойства. В поле Значение по умолчанию: появятся введённые вами значения шести элементов массива. Остальные четыре элемента равны нулю. Обратите также внимание на то, что элементы массива заключены в {…}.
  11. Аналогичным образом создайте второй массив с именем срВрПодгЗаг для среднего времени подготовки заготовки.
  12. В поле Значение по умолчанию: должно быть:
    {10,14,21,22,28,25,0,0,0,0}
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Игорь Маникин
Игорь Маникин

Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю?

Еще раз спасибо за прекрасный курс!

Артём Нагайцев
Артём Нагайцев

Выдает ошибку "entity cannot be resolved to a variable" при попытке запуска. В чем может быть причина? Ошибка в строках

entity.time_vxod=time(); 

time_obrabotki.add(time()-entity.time_vxod);