index
.pdfМинистерство образования и науки Санкт-Петербургский государственный электротехнический
университет ЛЭТИ
Кафедра АСОИУ
Курсовая работа по дисциплине ¾Моделирование систем¿
Выполнил студент гр.7852, ОФ Мамедов И.М.
Преподаватель:Кутузов О.И.
¾ ¿
Подпись:
Санкт-Петербург
2011 год
Содержание
1 |
Задание |
2 |
|
2 |
Построение концептуальной модели |
2 |
|
|
2.1 |
Концептуальная схема . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
2 |
|
2.2 |
Описание переменных и констант . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
2 |
|
2.3 |
Расчетные данные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
3 |
3 |
Разработка моделирующего алгоритма |
3 |
|
|
3.1 |
Блок-схема обобщенного алгоритма имитации . . . . . . . . . . . . . . . . . . . . . . . . . . . |
4 |
|
3.2 |
Блок-схемы частных алгоритмов имитации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
4 |
4 |
Программная реализация моделирующего алгоритма |
5 |
|
5 |
Проведение численных экспериментов |
10 |
|
6 |
Анализ и интерпретация результатов |
10 |
|
7 |
Рекомендации по реализации моделируемой системы |
10 |
|
8 |
Список используемой литературы |
11 |
1
1Задание
Задание 2.
На обрабатывающий участок цеха поступают детали в среднем через 50 мин. Первичная обработка деталей производится на одном из двух станков. Первый станок обрабатывает деталь в среднем 40 мин и имеет до 4% брака, второй соответственно 60 мин и 8% брака. Все бракованные детали возвращаются на повторную обработку на второй станок. Детали, попавшие в разряд бракованных дважды, считаются отходами. Вторичную обработку проводят также два станка в среднем 100 мин каждый. Причем первый станок обрабатывает имеющиеся в накопителе после первичной обработки детали, а второй станок подключается при образовании в накопителе задела больше трех деталей. Все интервалы времени распределены по экспоненциальному закону.
Смоделировать обработку на участке 500 деталей. Определить загрузку второго станка на вторичной обработке и вероятность появления отходов. Определить возможность снижения задела в накопителе и повышения загрузки второго станка на вторичной обработке.
2Построение концептуальной модели
2.1Концептуальная схема
Рис. 1: Функциональная схема системы
На Q-схеме(рис.1) изображен следующий процесс: деталь поступает из входного потока в первую очередь, откуда ее может забрать для обработки первый или второй станок. При браке она может попасть как с первого станка на второй, так и со второго на второй для повторной обработки. Также второй станок может отправить деталь в отходы. Прошедшая деталь попадает во вторую очередь, где ее обрабатывают 3й и 4й станки.
2.2Описание переменных и констант
При написании моделирующей программы использовались следующие константы:
detailInterval = 50 - среднее время появления новой детали
firstWastedFrequency = 0.04 - вероятность появления брака на первом станке
secondWastedFrequency = 0.08 - вероятность появления брака на втором станке
firstMachineTime = 40 - среднее время обработки на первом станке
secondMachineTime = 60 - среднее время обработки на втором станке
thirdMachineTime = 100 - среднее время обработки на третьем станке
fourthMachineTime = 100 - среднее время обработки на четвертом станке
2
Класс EventTypes(EventTypes.java) содержит в себе описание типов событий.
Также для расчета используется класс Machine(Machine.java), который описывает отдельный станок, обрабатывающий детали. Ниже описание его полей и методов:
interval - среднее время обработки детали
waste - вероятность брака
busy - флаг занятости станка
currentDetail - объект класса Detail, деталь, которую станок обрабатывает в текущий момент
started, stopped - служебные поля для расчета времени работы станка
count - количество деталей, обработанных станком
wasted - количество деталей, забракованных станком
isWasted - метод проверки забракованности детали
Для реализации событийной модели используется класс EventQueue, который содержит в себе список событий, сортируемый по времени при добавлении нового события.
Описание переменных, использовавшихся при моделировании:
detailsCount - количество готовых деталей detailsWasted - количество деталей, ушедших в отходы
firstQueue - очередь для первого и второго станков secondQueue - очередь для третьего и четвертого станков queue - очередь событий
time - текущее время currentEvent - текущее событие
currentMachine - станок, участвующий в текущем событии
2.3 Расчетные данные
Название |
Значение |
|
|
Среднее время поступления детали |
50 минут |
Среднее время обработки 1го станка |
40 минут |
Среднее время обработки 2го станка |
60 минут |
Среднее время обработки 3го станка |
100 минут |
Среднее время обработки 4го станка |
100 минут |
Вероятность брака на 1м станке |
4% |
Вероятность брака на 2м станке |
8% |
3Разработка моделирующего алгоритма
Вданной курсовой работе будет использоваться моделирующий алгоритм на основе особых моментов. Выделяется несколько событий так, чтобы они исключали друг друга и в совокупности охватывали все возможные изменения в системе. В рамках одного события имитируются многие элементарные события, отражающие изменения состояний сразу нескольких объектов. В алгоритме имитации отражаются только элементарные события, без которых невозможно построение реализации, обеспечивающее нахождение искомых характеристик.
Вобщем виде алгоритм моделирования(Q-схема) изображен на рисунке 2
Вданном случае такими событиями будут:
3
Рис. 2: Общий алгоритм моделирования методом особых моментов
Новая деталь в очереди 1(для 1го и 2го станков)
Новая деталь в очереди 2(для 3го и 4го станков)
Готовность детали из очереди 1
Готовность детали из очереди 2
3.1Блок-схема обобщенного алгоритма имитации
На рисунке 3 представлена общая блок-схема алгоритма
Рис. 3: Общий алгоритм
3.2Блок-схемы частных алгоритмов имитации
На рисунке 4 изображен алгоритм обработки первой очереди, на рис.5 - второй очереди, а на рис.6 - обработка события ¾Готова деталь в первой очереди¿.
4
Рис. 4: Обработка первой очереди
Рис. 5: Обработка второй очереди
4Программная реализация моделирующего алгоритма
Моделирующая программа написана на Java и состоит из нескольких модулей, так что здесь будет приведен исходный код только основного цикла(Листинг 2), который обрабатывает события, и модуля инициализации(Листинг 1).
Листинг 1: Main.java
1 public class Main {
2
3public static void main(String[] args) {
4double firstWastedFrequency = 0.04;
5double secondWastedFrequency = 0.08;
6int firstMachineTime = 40;
7int secondMachineTime = 60;
8int thirdMachineTime = 100;
9int fourthMachineTime = 100;
10int detailInterval = 50;
11if(args.length == 1){
12try{
13detailInterval = Integer.parseInt(args[0]);
14System.out.println("Используется средний интервал появления детали " + detailInterval + " минут.")
15} catch(NumberFormatException e){
16 |
System.out.println("Ошибка: вы ввели не число"); |
17}
18}
19int detailsCount = 500;
20List<Machine> machines = new ArrayList<Machine>();
21machines.add(new Machine(firstMachineTime, firstWastedFrequency, "First"));
22machines.add(new Machine(firstMachineTime, secondWastedFrequency, "Second"));
5
Рис. 6: Деталь в 1й очереди готова
23machines.add(new Machine(thirdMachineTime, 0, "Third"));
24machines.add(new Machine(fourthMachineTime, 0, "Fourth"));
25MainLoop loop = new MainLoop(detailsCount, detailInterval, machines);
26loop.run()
27...
28//Вывод результатов
29...
30}
В модуле инициализации в список machines добавляются объекты класса Machine с вышеуказанными параметрами и класс MainLoop, представляющий собой главный цикл.
Листинг 2: MainLoop.java
1 public class MainLoop {
2 private int detailsCount = 0;
3 private int detailsWasted = 0;
4private int detailsMax;
5private double time = 0;
6private final int detailInterval;
7private final List<Machine> machines;
8private LinkedList<Detail> firstQueue = new LinkedList<Detail>();
9private LinkedList<Detail> secondQueue = new LinkedList<Detail>();
10private EventQueue queue;
11private final RandExp exprandom;
13public MainLoop(int detailsMax, int detailInterval, List<Machine> machines) {
14this.detailsMax = detailsMax;
15this.detailInterval = detailInterval;
16this.machines = machines;
17exprandom = new RandExp();
18}
19
20public Statistic run() {
21int firstQueueSize = 0;
22int secondQueueSize = 0;
23detailsCount = 0;
24detailsWasted = 0;
25for (int i = 0; i < machines.size(); i++) {
6
26machines.get(i).reinit();
27}
28firstQueue.clear();
29secondQueue.clear();
30time = 0;
31queue = new EventQueue();
33 |
queue.put(new Event(null, |
34 |
time + exprandom.nextExponential(detailInterval), |
35 |
EventTypes.NEW_DETAIL_AT_1)); |
36Detail detail;
37Machine currentMachine;
38mainloop:
39while (true) {
40Event currentEvent = queue.pop();
41time = currentEvent.time;
42switch (currentEvent.state) {
43 |
case EventTypes.NEW_DETAIL_AT_1: |
44 |
queue.put(new Event(null, |
45 |
time + exprandom.nextExponential(detailInterval), |
46 |
EventTypes.NEW_DETAIL_AT_1)); |
47 |
firstQueue.addLast(new Detail()); |
48 |
// обработка первой очереди |
49 |
processFirst(); |
50 |
break; |
51 |
case EventTypes.FINISH_DETAIL_AT_1: |
52 |
currentMachine = currentEvent.machine; |
53 |
Detail d = currentMachine.currentDetail; |
54 |
if (currentMachine.isWasted()) { |
55 |
currentMachine.wasted++; |
56 |
d.wasted++; |
57 |
if (d.wasted < 2) { |
58 |
firstQueue.o erFirst(d); |
59 |
} else { |
60 |
detailsWasted++; |
61 |
} |
62 |
currentMachine.stopped = time; |
63 |
currentMachine.busytime += currentMachine.stopped currentMachine.started; |
64 |
currentMachine.currentDetail = null; |
65 |
currentMachine.busy = false; |
66 |
processFirst(); |
67 |
} else { |
68 |
queue.put(new Event(null, time, EventTypes.NEW_DETAIL_AT_2)); |
69 |
currentMachine.stopped = time; |
70 |
currentMachine.busytime += currentMachine.stopped currentMachine.started; |
71 |
currentMachine.currentDetail = null; |
72 |
currentMachine.busy = false; |
73 |
secondQueue.push(d); |
74 |
processSecond(); |
75 |
} |
76 |
|
77 |
break; |
78 |
case EventTypes.NEW_DETAIL_AT_2: |
79 |
// обработка второй очереди |
80 |
processSecond(); |
81 |
break; |
7
82 |
case EventTypes.FINISH_DETAIL_AT_2: |
83 |
//после обработки во второй очереди деталь готова |
84 |
currentMachine = currentEvent.machine; |
85 |
currentMachine.busy = false; |
86 |
currentMachine.stopped = time; |
87 |
currentMachine.busytime += currentMachine.stopped currentMachine.started; |
88 |
currentMachine.started = 0; |
89 |
currentMachine.stopped = 0; |
90 |
detailsCount++; |
91 |
if (detailsCount == detailsMax) { |
92 |
break mainloop; |
93 |
} |
94 |
break; |
95}
96firstQueueSize += firstQueue.size();
97secondQueueSize += secondQueue.size();
98}
99
100double wastedPossibility = (double) detailsWasted / detailsMax;
101return new Statistic(time, detailsWasted, wastedPossibility, (double)machines.get(3).busytime/time);
102}
103
104private void processFirst() {
105Machine machine1 = machines.get(0);
106Machine machine2 = machines.get(1);
107if (firstQueue.size() == 0) {
108return;
109}
110Detail d = firstQueue.pop();
111if (d.wasted == 0) {
112// если деталь не бракована отдаем первому станку
113if (!machine1.busy) {
114 |
machine1.currentDetail = d; |
115 |
machine1.started = time; |
116 |
machine1.count++; |
117 |
queue.put(new Event(machine1, |
118 |
time + exprandom.nextExponential(machine1.interval), |
119 |
EventTypes.FINISH_DETAIL_AT_1)); |
120 |
machine1.busy = true; |
121 |
//кладем деталь в первый станок |
122 |
} else { |
123 |
checkSecondMachine(machine2, d); |
124}
125} else {
126// оптимизировать
127checkSecondMachine(machine2, d);
128}
129}
130
131public void checkSecondMachine(Machine machine2, Detail d) {
132if (!machine2.busy) {
133machine2.currentDetail = d;
134machine2.count++;
135machine2.started = time;
136queue.put(new Event(machine2,
137 |
time + exprandom.nextExponential(machine2.interval), |
8
138 |
EventTypes.FINISH_DETAIL_AT_1)); |
139machine2.busy = true;
140} else {
141firstQueue.o erFirst(d);
142}
143}
144
145private void processSecond() {
146Machine machine3 = machines.get(2);
147Machine machine4 = machines.get(3);
148if (secondQueue.size() == 0) {
149return;
150}
151Detail d = secondQueue.pop();
152if (machine3.busy) {
153if (secondQueue.size() > 3) {
154 |
if (machine4.busy) { |
155 |
secondQueue.o erFirst(d); |
156 |
// если все станки заняты возвращаем деталь обратно |
157 |
} else { |
158 |
machine4.currentDetail = d; |
159 |
machine4.started = time; |
160 |
machine4.count++; |
161 |
queue.put(new Event(machine4, |
162 |
time + exprandom.nextExponential(machine4.interval), |
163 |
EventTypes.FINISH_DETAIL_AT_2)); |
164 |
machine4.busy = true; |
165 |
} |
166 |
} else { |
167 |
// первый станок занят, деталей >3, кладем обратно |
168 |
secondQueue.o erFirst(d); |
169}
170} else {
171machine3.currentDetail = d;
172machine3.started = time;
173machine3.count++;
174queue.put(new Event(machine3,
175 |
time + exprandom.nextExponential(machine3.interval), |
176 |
EventTypes.FINISH_DETAIL_AT_2)); |
177machine3.busy = true;
178}
179}
180}
9