Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

index

.pdf
Скачиваний:
29
Добавлен:
09.02.2015
Размер:
300.23 Кб
Скачать

Министерство образования и науки Санкт-Петербургский государственный электротехнический

университет ЛЭТИ

Кафедра АСОИУ

Курсовая работа по дисциплине ¾Моделирование систем¿

Выполнил студент гр.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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]