O2Cmax — различия между версиями
Dimitrova (обсуждение | вклад) (→Постановка задачи) |
Dimitrova (обсуждение | вклад) |
||
Строка 14: | Строка 14: | ||
<ol> | <ol> | ||
<li>Разобьём все работы на два множества: <tex>I = \{i \mid a_{i} \le b_{i}; i = 1, \dots, n\}</tex> и <tex>J = \{i \mid a_{i} > b_{i}; i = 1, \dots, n\}</tex></li> | <li>Разобьём все работы на два множества: <tex>I = \{i \mid a_{i} \le b_{i}; i = 1, \dots, n\}</tex> и <tex>J = \{i \mid a_{i} > b_{i}; i = 1, \dots, n\}</tex></li> | ||
− | <li>Найдем <tex>a_{x} = max \{a_{i} \mid i \in I\}</tex> и <tex>b_{y} = max \{b_{i} \mid i \in J\}</tex> </li> | + | <li>Найдем <tex>a_{x} = \max \{a_{i} \mid i \in I\}</tex> и <tex>b_{y} = \max \{b_{i} \mid i \in J\}</tex> </li> |
<li> Рассмотрим 2 случая. Первый случай, когда <tex>a_{x} \ge b_{y}</tex>, тогда | <li> Рассмотрим 2 случая. Первый случай, когда <tex>a_{x} \ge b_{y}</tex>, тогда | ||
<ul> | <ul> | ||
Строка 24: | Строка 24: | ||
</li> | </li> | ||
</ol> | </ol> | ||
+ | |||
+ | ==Псевдокод== | ||
+ | <tex>I \leftarrow \varnothing </tex> | ||
+ | <tex>J \leftarrow \varnothing </tex> | ||
+ | for <tex>i = 1 \dots n</tex> | ||
+ | if <tex>a_{i} \le b{i}</tex> | ||
+ | <tex> I \leftarrow I \cup \{i\} </tex> | ||
+ | else | ||
+ | <tex> J \leftarrow J \cup \{i\} </tex> | ||
+ | Найти <tex>x</tex>, где <tex>a_{x} = \max \limits_{i \in I} \{a_{i}\}</tex> | ||
+ | Найти <tex>y</tex>, где <tex>b_{y} = \max \limits_{i \in J} \{b_{i}\}</tex> | ||
+ | if <tex>a_{x} < b_{y}</tex> | ||
+ | Поменять местами первый и второй станок | ||
+ | Пересчитать <tex>I, J, x</tex> | ||
+ | Запомнить, что поменяли | ||
+ | |||
+ | <tex>time1 \leftarrow 0</tex> | ||
+ | shed2[x] <tex>\leftarrow 0</tex> | ||
+ | <tex>time2 \leftarrow b_{x}</tex> | ||
+ | |||
+ | Для всех <tex>i \in I \setminus \{x\}</tex> | ||
+ | sched1[i] <tex>\leftarrow time1</tex> | ||
+ | <tex>time1 \leftarrow time1 + a_{i}</tex> | ||
+ | <tex>time2 \leftarrow \max\{time1, time2\}</tex> | ||
+ | sched2[i] <tex>\leftarrow time2</tex> | ||
+ | <tex>time2 \leftarrow time2 + b_{i}</tex> | ||
+ | |||
+ | Для всех <tex>i \in J</tex> | ||
+ | sched1[i] <tex>\leftarrow time1</tex> | ||
+ | <tex>time1 \leftarrow time1 + a_{i}</tex> | ||
+ | <tex>time2 \leftarrow \max\{time1, time2\}</tex> | ||
+ | sched2[i] <tex>\leftarrow time2</tex> | ||
+ | <tex>time2 \leftarrow time2 + b_{i}</tex> | ||
+ | |||
+ | <tex>time1 \leftarrow \max\{time1, b_{x}\}</tex> | ||
+ | sched1[x] <tex>\leftarrow time1</tex> | ||
+ | <tex>time1 \leftarrow time1 + a_{x}</tex> | ||
+ | |||
+ | <tex>C_{max} \leftarrow \max\{time1, time2\}</tex> | ||
+ | if станки меняли местами | ||
+ | поменять их обратно |
Версия 02:10, 9 июня 2012
Эта статья находится в разработке!
Постановка задачи
Рассмотрим задачу:
- Дано работ и станка.
- Для каждой работы известно её время выполнения на каждом станке.
Требуется минимизировать время окончания всех работ, если каждую работу необходимо выполнить на обоих станках.
Описание алгоритма
Пусть
- Разобьём все работы на два множества: и
- Найдем и
- Рассмотрим 2 случая. Первый случай, когда
- Выполняем все работы на первом станке в следующем порядке: сперва все работы из , затем из и последней работу
- На втором станке выполняем первой работу
- Остальные работы выполняем на втором станке в порядке их завершения на первом тогда, когда второй станок свободен, а работа на первом уже выполнена
Второй случай рассматривается аналогично: первый и второй станок меняются местами, и вместо
— работа
, тогда
Псевдокод
for if else Найти , где Найти , где if Поменять местами первый и второй станок Пересчитать Запомнить, что поменяли shed2[x] Для всех sched1[i] sched2[i] Для всех sched1[i] sched2[i] sched1[x] if станки меняли местами поменять их обратно