Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мезенцев Имитационное моделирование / Вопросы и задачи к экзамену по ИМ.docx
Скачиваний:
83
Добавлен:
04.01.2020
Размер:
17.27 Mб
Скачать

Задача №2. Job Shop

Найти оптимальное по быстродействию расписание последовательной системы (JSP)

Матрица маршрутов

Матрица времени обслуживания

1

2

1

3

4

4

2

1

2

4

2

5

1

3

1

1

6

4

Обозначим тройкой (i,j,q) операцию обслуживания детали i станком j в q-й по очереди раз. Построим дизъюнктивную сетевую модель обслуживающей системы в представлении «узел-операция» (рисунок 1). Дуги (стрелки) обозначают последовательность выполнения операций, ребра (прямые линии) — конфликты за станок.

Рисунок 1 — Дизъюнктивная сеть

Экономико-математическая модель задачи в общем виде представлена формулами 1–6.

(1)

(2)

(3)

(4)

Формула 4 по-другому может быть записана в виде формул 5 и 6.

время начала выполнения операции i (5)

(6)

Булевы переменные =1, если операцию i решено выполнять раньше операции j, и =0 в противном случае.

B>0 — некоторое большое число, превышающее величиной длительность самой трудоемкой операции в системе. Примем его равным 100.

— время выполнения операции i

Для рассматриваемой задачи экономико-математическая модель представлена формулами 7–28.

(7)

(8)

(9)

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

(24)

(25)

(26)

(27)

(28)

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

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

V = {, ,

}

Точно не знаю, как ранжировать ребра. Я использовала матрицу маршрутов и матрицу времени обслуживания.

Убрала конфликты и нарисовала диаграмму Ганта обработки партий деталей. Партии подписаны слева, на отрезках написаны номера станков. Если идти от 0 направо, видны однозначные конфликты (когда интервалы, требующие одинаковые станки, заходят друг на друга). Это , Далее конфликтность я определяла в зависимости от расстояния между интервалами, требующими один станок. Опять идем от 0 направо. Между операциями 111 и 211 интервал 1 час, так же как между операциями 211 и 112, 211 и 312. Ранжируем . Между операциями 311 и 211 интервал 3 часа. Между операциями 111 и 312 интервал 4 часа. Между операциями 311 и 112 интервал 6 часов.

Для оценки нижней границы задачи уберем все конфликты (ребра) и посчитаем критическое время как для обычного сетевого графика (рисунок 2).

Рисунок 2

Получили, что минимально возможное время обработки трех партий деталей — 11 часов, то есть, нижняя граница решения — 11 часов.

Выбирать ребра будем по принципу максимального приоритета (для чего и ранжировали). При этом будем проверять сеть на отсутствие циклов.

Шаг 1. Выбираем ребро

Подзадача 1.1

(111, затем 311)

Подзадача 1.2

(311, затем 111)

Критическое время 12 минимальное. Оставляем подзадачу 1.2, выбираем следующее ребро.

Шаг 2. Выбираем ребро

Подзадача 1.2.1

Подзадача 1.2.2

Минимальным остается критическое время 12.

Шаг 3. Выбираем ребро

Подзадача 1.2.1.1

Подзадача 1.2.1.2

Минимальное критическое время по всем висячим вершинам — 13

Шаг 4. Выбираем ребро

Подзадача 1.2.1.1.1

Подзадача 1.2.1.1.2

Минимальное критическое время по всем висячим вершинам — 14 (подзадача 1.1). Возвращаемся к этой подзадаче.

Шаг 2. Выбираем ребро

Подзадача 1.1.1

Подзадача 1.1.2

Минимальное критическое время по всем висячим вершинам — 14 (подзадача 1.1.1).

Шаг 3. Выбираем ребро

Подзадача 1.1.1.1

Подзадача 1.1.1.2

Минимальное критическое время по всем висячим вершинам — 14 (подзадача 1.1.1.1).

Шаг 4. Выбираем ребро

Подзадача 1.1.1.1.1

Подзадача 1.1.1.1.2

Минимальное критическое время по всем висячим вершинам — 15 (подзадача 1.2.1.1.2).

Шаг 5. Выбираем ребро

Подзадача 1.2.1.1.2.1

Подзадача 1.2.1.1.2.2

Минимальное критическое время по всем висячим вершинам — 15 (подзадача 1.2.1.1.2.1).

Шаг 6. Выбираем ребро

Подзадача 1.2.1.1.2.1.1

Подзадача 1.2.1.1.2.1.2

Минимальное критическое время по всем висячим вершинам — 15 (подзадача 1.2.1.1.2.1.1).

Шаг 7. Выбираем ребро

Подзадача 1.2.1.1.2.1.1.1

Подзадача 1.2.1.1.2.1.1.2

Минимальное критическое время по всем висячим вершинам — 15 (подзадача 1.2.1.1.2.1.1.1).

Шаг 8. Выбираем ребро

Подзадача 1.2.1.1.2.1.1.1.1

Подзадача 1.2.1.1.2.1.1.1.2

Здесь цикл 111 – 211 – 311 - 111

Минимальное критическое время по всем висячим вершинам — 15 (подзадача 1.2.1.1.2.1.1.1.1).

Шаг 9. Выбираем ребро

Подзадача 1.2.1.1.2.1.1.1.1.1

Подзадача 1.2.1.1.2.1.1.1.1.2

Здесь цикл 111 – 211 – 312 - 111

Минимальное критическое время по всем висячим вершинам — 15 (подзадача 1.2.1.1.2.1.1.1.1.1).

Шаг 10. Выбираем ребро

Подзадача 1.2.1.1.2.1.1.1.1.1.1

Подзадача 1.2.1.1.2.1.1.1.1.1.2

Здесь цикл 111 – 121 – 112 – 311 - 111

Минимальное критическое время — 15.

В итоге имеем следующую сеть:

Трактовка:

Из данной сети берем раннее время начала каждой операции. Получаем расписание:

Партия

Длительность обработки (t), час

Время начала обработки (x) (раннее время начала)

Маршруты (номера станков)

Деталь 1

3

4

4

1

4

11

1

2

1

Деталь 2

4

2

5

0

4

8

2

1

2

Деталь 3

1

6

4

0

1

7

1

3

1

Решение CP для проверки:

// solution with objective 15

itvs = [[<1 1 4 3>

<1 4 8 4> <1 11 15 4>]

[<1 0 4 4> <1 4 6 2> <1 8 13 5>]

[<1 0 1 1> <1 1 7 6> <1 7 11 4>]];

mchs = [{} {<"itvs[2][0]" 0 3 0 0 1 1>

<"itvs[0][0]" 1 0 1 1 4 3>

<"itvs[1][1]" 2 2 2 4 6 2>

<"itvs[2][2]" 3 4 3 7 11 4>

<"itvs[0][2]" 4 1 4 11 15 4>} {

<"itvs[1][0]" 0 1 0 0 4 4>

<"itvs[0][1]" 1 0 1 4 8 4>

<"itvs[1][2]" 2 2 2 8 13 5>}];

// solution with objective 15

1 4 11

0 4 8

0 1 7

Дерево решений:

2