Придумаете случайную задачу на расписание с ограничениями, свяжите её с теорией графов и предложите алгоритм поиска оптимального решения, обсудите сложность и случаи NP-полноты
Задача (случайный пример). Есть набор задач J={1,…,n}J=\{1,\dots,n\}J={1,…,n}, одинаковые машины MMM числа mmm. Каждая задача jjj имеет длительность pj∈{1,2,4}p_j\in\{1,2,4\}pj∈{1,2,4}. Даны ограничения: - предшествования (частичный порядок) задаются ориентированным ацикличным графом (DAG) D=(J,Eprec)D=(J,E_{prec})D=(J,Eprec): если (i→j)∈Eprec(i\to j)\in E_{prec}(i→j)∈Eprec, то jjj нельзя начать до завершения iii; - конфликтные пары (нельзя выполнять одновременно) задаются неориентированным графом G=(J,Econf)G=(J,E_{conf})G=(J,Econf): если {i,j}∈Econf\{i,j\}\in E_{conf}{i,j}∈Econf, то их исполнения не должны пересекаться по времени. Цель: минимизировать makespan CmaxC_{\max}Cmax — время завершения всех задач. Связь с теорией графов. - Предшествования — это DAG DDD (частичный порядок). Антайны (maximal antichains) в этом порядке соответствуют множествам задач, которые теоретически могут выполняться одновременно, если нет конфликтов. - Конфликты — это граф GGG; в любой момент можно запустить лишь такое подмножество задач, которое является независимым множеством в GGG и не содержит задач с неудовлетворёнными предшественниками. - Модель с дизъюнктивными рёбрами: для каждой конфликтной пары {i,j}\{i,j\}{i,j} добавляется дизъюнктивное условие «либо iii перед jjj, либо jjj перед iii» — классическая дисъюнктивная модель для цехового расписания. Формулировка точного алгоритма (time-indexed ILP). Пусть верхняя грань срока TTT (возможно суммарный объём). Вводим бинарные переменные xj,t={1,если задача j стартует в момент t,0,иначе
x_{j,t}=\begin{cases}1,&\text{если задача }j\text{ стартует в момент }t,\\0,&\text{иначе}\end{cases} xj,t={1,0,еслизадачаjстартуетвмоментt,иначе
с t=0,…,T−pjt=0,\dots,T- p_jt=0,…,T−pj. Ограничения: 1) каждая задача стартует ровно один раз: ∀j: ∑t=0T−pjxj,t=1.
\forall j:\ \sum_{t=0}^{T-p_j} x_{j,t}=1. ∀j:t=0∑T−pjxj,t=1.
2) машина в любой момент обслуживает не более mmm задач: ∀τ∈{0,…,T−1}: ∑j∑t: t≤τ<t+pjxj,t≤m.
\forall \tau\in\{0,\dots,T-1\}:\ \sum_{j}\sum_{t:\ t\le\tau<t+p_j} x_{j,t}\le m. ∀τ∈{0,…,T−1}:j∑t:t≤τ<t+pj∑xj,t≤m.
3) предшествования: ∀(i→j)∈Eprec: ∑tt xi,t+pi≤∑tt xj,t.
\forall (i\to j)\in E_{prec}:\ \sum_t t\,x_{i,t}+p_i \le \sum_t t\,x_{j,t}. ∀(i→j)∈Eprec:t∑txi,t+pi≤t∑txj,t.
4) конфликты (запрещение перекрытия для каждой пары): ∀{i,j}∈Econf: ∑t,u: интервалы [t,t+pi),[u,u+pj) пересекаютсяxi,txj,u=0,
\forall\{i,j\}\in E_{conf}:\ \sum_{t,u:\ \text{интервалы }[t,t+p_i),[u,u+p_j)\text{ пересекаются}} x_{i,t}x_{j,u}=0, ∀{i,j}∈Econf:t,u:интервалы[t,t+pi),[u,u+pj)пересекаются∑xi,txj,u=0,
или линеаризовать через дополнительные бинарные переменные порядка. Цель: минимизировать TTT (либо минимизировать последнее завершение через переменные начала). Этот ILP даёт оптимальное решение, но размер и решаемость резко растут с TTT и nnn. Альтернативный точный метод (перебор/DP по состояниям). Определим DP по подмножествам завершённых задач: F(S)F(S)F(S) — минимальное время, за которое можно выполнить подмножество SSS. Начальное F(∅)=0F(\varnothing)=0F(∅)=0. Переход: из состояния SSS можно одновременно запустить любое множество A⊆J∖SA\subseteq J\setminus SA⊆J∖S, такое что - все задачи в AAA имеют все предшественники в SSS (т.е. AAA — допустимое расширение), - AAA независимо в GGG, - ∣A∣≤m|A|\le m∣A∣≤m. Тогда F(S∪A)=min{ max(F(S), F(S)+maxj∈Apj) }=F(S)+maxj∈Apj.
F(S\cup A)=\min\{\,\max(F(S),\,F(S)+\max_{j\in A} p_j)\,\} = F(S)+\max_{j\in A} p_j. F(S∪A)=min{max(F(S),F(S)+j∈Amaxpj)}=F(S)+j∈Amaxpj.
Ищем F(J)F(J)F(J). Этот DP требует перебора подмножеств допустимых AAA и всех SSS, в худшем случае экспоненциально: время порядка O∗(2n)O^*(2^n)O∗(2n) (символ O∗(⋅)O^*(\cdot)O∗(⋅) опускает полиномиальные множители). Эвристики и приближения. - List-scheduling (topological order / LPT): сортировать задачи по приоритету (например, по длительности или раннему возможному старту) и размещать на первой свободной машине при соблюдении предшествований и конфликтов. Быстро, но не всегда оптимально. - Для общего случая без предшествований list-scheduling даёт гарантированный коэффициент приближения ≤2−1m\le 2-\tfrac{1}{m}≤2−m1 относительно оптимального CmaxC_{\max}Cmax (классическая оценка Грэма). - Можно использовать B&B + релаксации (LP), или итеративно выбирать максимум независимого множества в GGG из допустимых задач для заполнения слота (требует решение MWIS — тоже NP-трудная подзадача). Сложность и NP-полнота. - Общая задача (идентичные машины, предшествования, конфликты) является NP-трудной; точное решение в общем случае требует экспоненциального времени (и ILP решается экспоненциально в худшем случае). - Уже частные случаи NP-полны: - задача идентичных машин без предшествований P∣∣CmaxP||C_{\max}P∣∣Cmax содержит Partition/3-Partition и потому NP-трудна (сильная NP-полнота для общего mmm и длительностей). - задача с единичными длительностями и предшествованиями P∣prec,pj=1∣CmaxP|prec,p_j=1|C_{\max}P∣prec,pj=1∣Cmax NP-полна для m≥2m\ge2m≥2 (классический результат). - задача с конфликтным графом сводится к проблемам раскраски/пакетирования (capacity coloring) и потому NP-трудна в общем случае. - Полиномиально разрешимые случаи: - m=1m=1m=1 — просто топологическая сортировка, полиномиально. - если предшествования образуют цепь (total order) — однопроходная последовательность. - некоторые параметризованные случаи: при очень малом nnn или малой ширине частичного порядка (малый максимум размера антайна) можно применять DP по состояниям с приемлемой сложностью; также допустимы FPT-алгоритмы при параметре «ширина» или «treewidth» соответствующих графов. Краткая инструкция для практического решения. - Для n≲40n\lesssim 40n≲40: используйте DP по подмножествам или time-indexed ILP в современном солвере (CP-SAT). - Для средних nnn: B&B с эвристическим упорядочиванием (topological + LPT) и отсекающими оценками (нижняя граница по сумме длительностей и по длине критического пути). - Для больших nnn: приближённые и жадные алгоритмы, локальный поиск, расписание по уровням (антайнки), либо сведение к специальной задаче с последующим применением эвристик на конфликтном графе. Если хотите, могу сгенерировать конкретный случай (конкретные n,m,pjn,m,p_jn,m,pj, списки рёбер Eprec,EconfE_{prec},E_{conf}Eprec,Econf) и показать пошагово поиск оптимального расписания на небольшом примере.
- предшествования (частичный порядок) задаются ориентированным ацикличным графом (DAG) D=(J,Eprec)D=(J,E_{prec})D=(J,Eprec ): если (i→j)∈Eprec(i\to j)\in E_{prec}(i→j)∈Eprec , то jjj нельзя начать до завершения iii;
- конфликтные пары (нельзя выполнять одновременно) задаются неориентированным графом G=(J,Econf)G=(J,E_{conf})G=(J,Econf ): если {i,j}∈Econf\{i,j\}\in E_{conf}{i,j}∈Econf , то их исполнения не должны пересекаться по времени.
Цель: минимизировать makespan CmaxC_{\max}Cmax — время завершения всех задач.
Связь с теорией графов.
- Предшествования — это DAG DDD (частичный порядок). Антайны (maximal antichains) в этом порядке соответствуют множествам задач, которые теоретически могут выполняться одновременно, если нет конфликтов.
- Конфликты — это граф GGG; в любой момент можно запустить лишь такое подмножество задач, которое является независимым множеством в GGG и не содержит задач с неудовлетворёнными предшественниками.
- Модель с дизъюнктивными рёбрами: для каждой конфликтной пары {i,j}\{i,j\}{i,j} добавляется дизъюнктивное условие «либо iii перед jjj, либо jjj перед iii» — классическая дисъюнктивная модель для цехового расписания.
Формулировка точного алгоритма (time-indexed ILP).
Пусть верхняя грань срока TTT (возможно суммарный объём). Вводим бинарные переменные
xj,t={1,если задача j стартует в момент t,0,иначе x_{j,t}=\begin{cases}1,&\text{если задача }j\text{ стартует в момент }t,\\0,&\text{иначе}\end{cases}
xj,t ={1,0, если задача j стартует в момент t,иначе с t=0,…,T−pjt=0,\dots,T- p_jt=0,…,T−pj . Ограничения:
1) каждая задача стартует ровно один раз:
∀j: ∑t=0T−pjxj,t=1. \forall j:\ \sum_{t=0}^{T-p_j} x_{j,t}=1.
∀j: t=0∑T−pj xj,t =1. 2) машина в любой момент обслуживает не более mmm задач:
∀τ∈{0,…,T−1}: ∑j∑t: t≤τ<t+pjxj,t≤m. \forall \tau\in\{0,\dots,T-1\}:\ \sum_{j}\sum_{t:\ t\le\tau<t+p_j} x_{j,t}\le m.
∀τ∈{0,…,T−1}: j∑ t: t≤τ<t+pj ∑ xj,t ≤m. 3) предшествования:
∀(i→j)∈Eprec: ∑tt xi,t+pi≤∑tt xj,t. \forall (i\to j)\in E_{prec}:\ \sum_t t\,x_{i,t}+p_i \le \sum_t t\,x_{j,t}.
∀(i→j)∈Eprec : t∑ txi,t +pi ≤t∑ txj,t . 4) конфликты (запрещение перекрытия для каждой пары):
∀{i,j}∈Econf: ∑t,u: интервалы [t,t+pi),[u,u+pj) пересекаютсяxi,txj,u=0, \forall\{i,j\}\in E_{conf}:\ \sum_{t,u:\ \text{интервалы }[t,t+p_i),[u,u+p_j)\text{ пересекаются}} x_{i,t}x_{j,u}=0,
∀{i,j}∈Econf : t,u: интервалы [t,t+pi ),[u,u+pj ) пересекаются∑ xi,t xj,u =0, или линеаризовать через дополнительные бинарные переменные порядка. Цель: минимизировать TTT (либо минимизировать последнее завершение через переменные начала).
Этот ILP даёт оптимальное решение, но размер и решаемость резко растут с TTT и nnn.
Альтернативный точный метод (перебор/DP по состояниям).
Определим DP по подмножествам завершённых задач: F(S)F(S)F(S) — минимальное время, за которое можно выполнить подмножество SSS. Начальное F(∅)=0F(\varnothing)=0F(∅)=0. Переход: из состояния SSS можно одновременно запустить любое множество A⊆J∖SA\subseteq J\setminus SA⊆J∖S, такое что
- все задачи в AAA имеют все предшественники в SSS (т.е. AAA — допустимое расширение),
- AAA независимо в GGG,
- ∣A∣≤m|A|\le m∣A∣≤m.
Тогда
F(S∪A)=min{ max(F(S), F(S)+maxj∈Apj) }=F(S)+maxj∈Apj. F(S\cup A)=\min\{\,\max(F(S),\,F(S)+\max_{j\in A} p_j)\,\} = F(S)+\max_{j\in A} p_j.
F(S∪A)=min{max(F(S),F(S)+j∈Amax pj )}=F(S)+j∈Amax pj . Ищем F(J)F(J)F(J). Этот DP требует перебора подмножеств допустимых AAA и всех SSS, в худшем случае экспоненциально: время порядка O∗(2n)O^*(2^n)O∗(2n) (символ O∗(⋅)O^*(\cdot)O∗(⋅) опускает полиномиальные множители).
Эвристики и приближения.
- List-scheduling (topological order / LPT): сортировать задачи по приоритету (например, по длительности или раннему возможному старту) и размещать на первой свободной машине при соблюдении предшествований и конфликтов. Быстро, но не всегда оптимально.
- Для общего случая без предшествований list-scheduling даёт гарантированный коэффициент приближения ≤2−1m\le 2-\tfrac{1}{m}≤2−m1 относительно оптимального CmaxC_{\max}Cmax (классическая оценка Грэма).
- Можно использовать B&B + релаксации (LP), или итеративно выбирать максимум независимого множества в GGG из допустимых задач для заполнения слота (требует решение MWIS — тоже NP-трудная подзадача).
Сложность и NP-полнота.
- Общая задача (идентичные машины, предшествования, конфликты) является NP-трудной; точное решение в общем случае требует экспоненциального времени (и ILP решается экспоненциально в худшем случае).
- Уже частные случаи NP-полны:
- задача идентичных машин без предшествований P∣∣CmaxP||C_{\max}P∣∣Cmax содержит Partition/3-Partition и потому NP-трудна (сильная NP-полнота для общего mmm и длительностей).
- задача с единичными длительностями и предшествованиями P∣prec,pj=1∣CmaxP|prec,p_j=1|C_{\max}P∣prec,pj =1∣Cmax NP-полна для m≥2m\ge2m≥2 (классический результат).
- задача с конфликтным графом сводится к проблемам раскраски/пакетирования (capacity coloring) и потому NP-трудна в общем случае.
- Полиномиально разрешимые случаи:
- m=1m=1m=1 — просто топологическая сортировка, полиномиально.
- если предшествования образуют цепь (total order) — однопроходная последовательность.
- некоторые параметризованные случаи: при очень малом nnn или малой ширине частичного порядка (малый максимум размера антайна) можно применять DP по состояниям с приемлемой сложностью; также допустимы FPT-алгоритмы при параметре «ширина» или «treewidth» соответствующих графов.
Краткая инструкция для практического решения.
- Для n≲40n\lesssim 40n≲40: используйте DP по подмножествам или time-indexed ILP в современном солвере (CP-SAT).
- Для средних nnn: B&B с эвристическим упорядочиванием (topological + LPT) и отсекающими оценками (нижняя граница по сумме длительностей и по длине критического пути).
- Для больших nnn: приближённые и жадные алгоритмы, локальный поиск, расписание по уровням (антайнки), либо сведение к специальной задаче с последующим применением эвристик на конфликтном графе.
Если хотите, могу сгенерировать конкретный случай (конкретные n,m,pjn,m,p_jn,m,pj , списки рёбер Eprec,EconfE_{prec},E_{conf}Eprec ,Econf ) и показать пошагово поиск оптимального расписания на небольшом примере.