Files
CursASVK/example/3_reduce_description.tex
T
2026-05-06 10:09:45 +03:00

127 lines
8.2 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\section{Сведение к задаче целочисленного линейного программирования}
\label{sec:3_reduce_description} \index{3_reduce_description}
\hspace{0.47cm}
Опишем предложенную в данной работе схему сведения поставленной задачи к задаче
ЦЛП.
Для представления расписания, т.е. перестановки вершин графа $G = (V, E)$,
воспользуемся подходом на основе переменных предшествования,
описанном в \cite{BAKER} и первоначально предложенном в \cite{MANNE}.
Поскольку этот подход использует длительности работ, формально положим
длительность каждой работы равной 1. В рамках указанного подхода
используются бинарные переменные предшествования:
\begin{multline*}
\begin{gathered}
\forall i, j \in V, i \neq j:
\\
m_{ij} =
\begin{cases}
1, &\text{если вершина $i$ стоит в перестановке раньше вершины $j$}\\
0, &\text{в противном случае}
\end{cases}
\end{gathered}
\end{multline*}
Также используются целочисленные переменные $s_j, j \in V$, которые задают
время старта соответствующей работы $j$, в нашем случае равное ее позиции в
расписании, считая с 0.
Чтобы совокупность переменных $m_{ij}$ и $s_j$
задавала линейный порядок
вершин графа с соблюдением заданного графом частичного порядка, на нее
накладываются ограничения (1) -- (5) \citeappendix{BAKER}{Appendix C}.
\[s_j = \sum_{i \in V}m_{ij}, \forall j \in V \eqno(1)\]
\[m_{ij} + m_{ji} = 1, \forall i,j \in V, i \neq j \eqno(2)\]
\[m_{ij} = 1, \forall (i,j) \in E \eqno(3)\]
\[s_i + 1 \le s_j + |V|(1 - m_{ij}), \forall i,j \in V, i < j \eqno(4)\]
\[s_j + 1 \le s_i + |V|m_{ij}, \forall i,j \in V, i < j \eqno(5)\]
Для удобства будем считать, что
\[m_{ii} = 1, i \in V \eqno(6)\]
Ограничение (1) определяет, что позиция вершины в перестановке равна
числу вершин, предшествующих ей в перестановке. Ограничение (2) требует,
чтобы для каждой пары вершин одна из них стояла раньше другой.
Ограничение (3) гарантирует частичный порядок на множестве вершин,
заданный графом $G$. Ограничения (4), (5) вместе с ограничением (1)
исключают цикличность перестановки, а именно задают условие: для каждой
пары вершин $i, j$ либо $j$ расположена в расписании позже чем $i$ (значит, $s_i + 1 \le s_j$), либо $i$ расположена в расписании позже чем $j$ (значит, $s_j + 1 \le s_i$
). В
правых частях ограничений (4), (5) $|V|$ играет роль достаточно большого
положительного числа, так чтобы в зависимости от значения $m_{ij}$ только одно
из этих двух ограничений было содержательным, а второе заведомо
выполнялось. Вводить ограничения (4), (5) для пар $i, j$ при $i$ > $j$ избыточно,
поскольку ограничения уже введены для соответствующих пар $j, i$.
Теперь необходимо ввести целевую функцию на расписании.
Обозначим через $R_k$, $k \in V$, объем ресурса, который требуется при
выполнении работы $k$, включая ресурс, требуемый для результата самой
работы $k$. Введем переменную $F$ и ограничения для нее:
\[F \ge R_k, \forall k \in V \eqno(7)\]
С учетом этих ограничений, исходная задача сводится к минимизации
целевой функции, равной переменной $F$:
\[\min F \]
Теперь надо выразить $R_k$ с использованием переменных $m_{ij}$. Для этого
достаточно найти все работы $i$, выполняющиеся до работы $k$, т.е. $m_{ik} = 1$,
результат выполнения которых требуется либо самой работе $k$, либо хотя бы
одной работе $j$, $(i,j) \in E$, выполняющейся после работы $k$; для случая
$m_{ik} = 1$ при $i = k$ считаем, что результат работы «требуется ей самой», т.к.
ресурс под него отводится до высвобождения ресурса работой.
Введем переменные
\begin{equation*}
\forall i,k \in V: y_{ik} =
\begin{cases}
1, &\text{если $m_{ik} = 1$ и $\exists j \in V: ((i,j) \in E) \wedge (m_{kj} = 1)$}\\
1, &\text{если $i = k$}\\
0, &\text{в противном случае}
\end{cases}
\end{equation*}
При введенных таким способом $y_{ik}$ верно, что
\[R_k = \sum_{i \in V}r_iy_{ik}, \forall k \in V \]
Зададим линейные ограничения на переменные $y_{ik}$:
\[y_{ii} = 1, \forall i \in V \eqno(8)\]
\[y_{ij} = 1, \forall (i,j) \in E \eqno(9)\]
\[y_{ik} \le m_{ik}, \forall i,k: i \neq k, (i,k) \notin E \eqno(10)\]
\[y_{ik} \le \sum_{(i,j) \in E}m_{kj}, \forall i,k,j: i \neq k, (i,j) \in E, (i,k) \notin E \eqno(11)\]
\[y_{ik} \ge m_{kj} + m_{ik} - 1, \forall i,k,j: i \neq k, (i,j) \in E, (i,k) \notin E \eqno(12)\]
Ограничение (8) показывает, что результат работы «требуется ей самой», т.к.
ресурс под него отводится до высвобождения ресурса работой. Ограничение (9) гарантирует, что результат работы $i$ будет храниться до завершения выполнения всех ее прямых потомков $j$. Ограничение (10) гарантирует, что, если работа $k$ находится в расписании перед работой $i$, то результат работы $i$ для работы $k$ храниться не будет. Ограничение (11) гарантирует, что, если все прямые потомки $j$ работы $i$ находятся в расписании до работы $k$, то результат работы $i$ для работы $k$ храниться не будет. Ограничение (12) гарантирует, что результат работы $i$ будет храниться во время выполнения $k$, если хотя бы один прямой потомок $j$ работы $i$ стоит в расписании позже $k$.
Итого, исходная задача сводится к задаче ЦЛП вида:
\[\min F \]
с переменными $m_{ij}$, $s_j$, $y_{ij}$, $F$ и ограничениями (1 – 12).
Число переменных задачи ЦЛП: \[2|V|^2 + |V| + 1.\]
Число ограничений задачи ЦЛП:
\[|V| + (|V|^2 - |V|) + |E| + (|V|^2 - |V|) + |V| + |V| + |V| + |E| + (|V|^2 - |V| - |E|) + \]
\[+(|V|^2 - |V|*p - |V| + p - |E|) + |V|*|E| - |E| - \sum_{i=1}^{|V|} l_i^2 = \]
\[= 4|V|^2 + |V|*|E| - |V|*p - |E| + p - \sum_{i=1}^{|V|} l_i^2,\]
где $p$ — число вершин без потомков, $l_i$ — число потомков $i$-ой вершины.