fix introduction

This commit is contained in:
2026-05-06 10:09:45 +03:00
parent 80e86394d1
commit 5daba127fe
36 changed files with 3088 additions and 2 deletions
+57
View File
@@ -0,0 +1,57 @@
\anonsection{Введение}
\label{sec:0_vvedenie} \index{0_vvedenie}
\hspace{0.47cm}
В вычислительных системах с ограниченным количеством некоторого
ресурса (например, оперативной памяти) при построении расписания
вычислений важным критерием является пиковое (максимальное по всему
расписанию) использование ресурса. В данной работе рассматривается
задача построения однопроцессорного расписания с минимизацией
этого критерия. Результат решения задачи может использоваться для
оценки объема оперативной памяти, необходимого в проектируемой системе
для выполнения заданного набора работ.
Входными данными задачи является ориентированный ациклический граф
без петель и кратных ребер, в котором вершины задают работы, а ребра –
зависимости между ними. Таким образом, входной граф задает условия
частичного порядка на множестве работ. Каждой вершине в графе
сопоставлено неотрицательное число – количество занимаемого
соответствующей работой ресурса. При этом каждая работа занимает ресурс
в момент начала своего выполнения и освобождает его в момент, когда
последний из ее непосредственных потомков завершит выполнение.
Для входного графа необходимо построить расписание, минимизирующее пиковое использование ресурса в системе. Поскольку директивные сроки выполнения работ не заданы, и оптимизируемым критерием является пиковое использование ресурса, время выполнения работ не учитывается. В связи с этим расписание можно рассматривать как набор шагов, на каждом из которых выполняется одна работа.
На рис. \ref{fig:example} приведен граф и два возможных расписания для него. На вершинах графа указаны номера работ и количество занимаемого ресурса. В расписании под горизонтальной осью подписаны работы, которые выполняются на соответствующих шагах расписания, а вертикальной оси соответствует количество занимаемого ресурса в системе. Красные стрелки вверх в расписании обозначают занятие ресурса, а зеленые стрелки вниз -- освобождение.
Для нахождения значения целевой функции на каждом шаге вычисляется общее использование ресурса в системе, затем выбирается максимальное по всему расписанию -- пиковое значение. В расписании фигурными скобками обозначены и пронумерованы в порядке следования моменты подсчета используемого ресурса. Видно, что пиковое значение достигается после занятия ресурса работой, но до освобождения ей ресурса из-под работ предков.
На примере (рис. \ref{fig:example}), видно, что для одного и того же графа работ могут быть построены разные расписания. Так, в расписании 1 целевая функция равна 9 и достигается в момент выполнения работы $V_2$. В расписании 2 пиковое использование ресурса достигает 11 во время выполнения работ $V_3$ и $V_4$. Таким образом, в расписании 1 целевая функция меньше, чем в расписании 2.
\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{pictures/example.png}
\caption{Граф работ и возможные расписания для него}
\label{fig:example}
\end{figure}
В работе \cite{SHUTKOV} для данной задачи предложен детерминированный алгоритм,
строящий близкие к оптимальным расписания в случае, если входной граф
является последовательно-параллельным. По мере добавления в граф ребер,
нарушающих его последовательно-параллельную структуру, получаемые
алгоритмом расписания по качеству (т.е. значению целевой функции)
приближаются к результатам жадного алгоритма, что указывает на рост
отклонения от оптимума.
В работе \cite{BALASHOV} для данной задачи предложен муравьиный алгоритм,
превосходящий по качеству решения жадный алгоритм, однако в силу
рандомизированности не гарантирующий качество решения даже на уровне
верхней оценки отклонения от оптимума.
Актуальна разработка метода построения оптимального расписания, который
не был бы ограничен конкретным классом структуры входного графа. В данной работе
предложена схема сведения
рассматриваемой задачи к задаче целочисленного линейного
программирования (ЦЛП) \cite{SHEV}, реализована с
использованием свободно доступного решателя ЦЛП и исследована по
критерию масштабируемости.
+44
View File
@@ -0,0 +1,44 @@
\begin{thebibliography}{}
\bibitem{SHUTKOV}
Алгоритм построения расписания для минимизации пикового использования ресурса в однопроцессорной системе~/ Шутков\;Г.\;А.~// Выпускная квалификационная работа. – Факультет ВМК МГУ им. М.В. Ломоносова. – 2023. – 41 с.
\bibitem{BALASHOV}
\textbf{Балашов\;В.\;В., Абрамов \;А.\;В., Чупахин \;А.\;А. и др.} Муравьиный алгоритм
для построения однопроцессорного расписания с минимизацией пикового
использования ресурса~// Дискретный анализ и исследование операций. –
2024. Т. 31, №2. С. 526.
\bibitem{SHEV}
\textbf{Шевченко \;В.\;Н., Золотых \;Н.\;Ю.} Линейное и целочисленное линейное
программирование~// Изд-во Нижегородского государственного
университета им. Н.И. Лобачевского. – 2004. – 154 с.
\bibitem{BAKER}
\textbf{Baker \;K.\;R., Trietsch \;D.} Principles of Sequencing and Scheduling~// John Wiley \& Sons. 2009. 510 p.
\bibitem{MANNE}
\textbf{Manne \;A.\;S.} On the Job-Shop Scheduling Problem~// Operations Research.
1960. Vol. 8, No. 2. P. 219223.
\bibitem{COIN}
COIN-OR: Computations Infrastructure for Operations Research. Projects by Category. COIN-OR, 2025. Available at \url{https://www.coin-or.org/projects/} (accessed March~25, 2025).
\bibitem{GLPK}
GNU Linear Programming Kit. GLPK, 2025. Available at \url{https://www.gnu.org/software/glpk/} (accessed March~25, 2025).
\bibitem{SCIP}
SCIP: Solving Constraint Integer Programs. Zuse Institute Berlin, 2025. Available at \url{https://scipopt.org/} (accessed March~25, 2025).
\bibitem{HiGHS}
HiGHS: high performance software
for linear optimization. HiGHS, 2025. Available at \url{https://highs.dev/} (accessed March~25, 2025).
\bibitem{GAMS}
GAMS: The General Algebraic Modeling Language. GAMS, 2025. Available at \url{https://www.gams.com/latest/docs/S\_MAIN.html} (accessed March~25, 2025).
\bibitem{GUROBI}
Gurobi optimizer. Gurobi optimization, 2025. Available at \url{https://www.gurobi.com/solutions/gurobi-optimizer/} (accessed March~25, 2025).
\end{thebibliography}
+14
View File
@@ -0,0 +1,14 @@
\section{Цель работы}
\label{sec:1_cel_zadachi} \index{1_cel_zadachi}
\hspace{0.47cm}
Целью работы является разработка и реализация подхода на основе целочисленного линейного программирования к построению однопроцессорного расписания с минимизацией пикового использования ресурса.
Для достижения цели необходимо:
\begin{enumerate}
\item Разработать схему сведения задачи построения расписания к задаче ЦЛП;
\item Выполнить сравнение производительности свободно доступных решателей ЦЛП на примерах задачи;
\item По результатам сравнения выбрать решатель ЦЛП;
\item Провести экспериментальное исследование масштабируемости предложенного подхода по времени поиска решения.
\end{enumerate}
+42
View File
@@ -0,0 +1,42 @@
\section{Формальная постановка задачи}
\label{sec:2_problem_statement} \index{2_post_zad}
\hspace{0.47cm}
Модель прикладной программы может быть представлена как ориентированный ациклический граф потока данных $G=(V,E)$, $|V|=n$, $|E|=m$. Каждой вершине графа соответствует работа $\{p_i\}_{i=1}^n$, каждой дуге "--- передача данных между работами. Если $(p_i,p_j)\in{E}$, $1\leq{i,j}\leq{n}$, то для выполнения работы $p_j$ необходим результат выполнения работы $p_i$.
Вычислительная среда состоит из одного процессора $SP$, который в каждый момент времени способен выполнять только одну работу, и уникального ресурса $SR$. Каждая работа выполняется на процессоре $SP$ без прерываний. В момент старта работа $p_i$, $1\leq{i}\leq{n}$, захватывает $r_{p_i}\geq{0}$ ресурса $SR$ для хранения результата. При завершении работы ${p_i}$ происходит высвобождение ресурса, занимаемого такими работами $p_j$, \\$1\leq{j}\leq{n}$, $(p_j,p_i)\in{E}$, для которых $p_i$ является последним выполненным потомком.
Расписание $HP$ сформировано, если для всех работ из $G$ определен порядок их выполнения на процессоре $SP$. Фактически $HP$ представляет собой перестановку $\pi$ номеров работ из $G$ (будем считать, что работы пронумерованы), поэтому ниже понятия <<расписание>> и <<перестановка работ>> считаем взаимозаменяемыми.
$$\pi = (j_1, j_2,\dots, j_n)$$
где $j_i$ "--- номер работы, находящегося в $i$-ой позиции расписания.
Расписание $HP$ корректно, если выполнены следующие ограничения $\{1-3\}$:
\begin{enumerate}
\item Каждая работа назначено на процессор $SP$.
\item Процессор $SP$ в каждый момент времени выполняет не более одной работы.
\item Частичный порядок, заданный графом зависимостей $G$, сохранен в $HP$.
\end{enumerate}
Далее будем говорить, что расписание допустимо $HP\in{HP_{\{1-3\}}^*}$, если оно удовлетворяет набору ограничений $\{1-3\}$.
Минимизируемой целевой функцией является максимальное по всему расписанию количество занятого в вычислительной системе ресурса. Длительности работ в рамках задачи не рассматриваются.
Пусть задано расписание $HP \in HP_{\{1-3\}}^*$. Опишем процедуру расчета целевой функции для $HP$. Обозначим за $f_{HP}^k$, $1\leq{k}\leq{n}$, количество занятого ресурса для $k$-ой позиции в расписании $HP$. Пусть $A$ "--- множество работ, расположенных в расписании $HP$ на позициях $1,\dots,k$. Пусть $B \subset A$ "--- множество работ, расположенных в расписании $HP$ на позициях $1,\dots,k-1$, у каждой из которых все потомки расположены на позициях от $1$ до $k-1$. Тогда $f_{HP}^k$ вычисляется по следующей формуле:
\begin{equation*}
f_{HP}^k=\sum\limits_{p_j\in{A}} r_{p_j} - \sum\limits_{p_i\in{B}} r_{p_i}
\end{equation*}
Пусть известны значения $\{f_{HP}^k\}_{k=1}^n$ для расписания $HP$. Тогда значение целевой функции $f_{HP}$ для такого расписания:
\begin{equation*}\label{eq:cost}
f_{HP}=\max_{1\leq{k}\leq{n}} f_{HP}^k
\end{equation*}
Требуется для модели прикладной программы $G$ найти такое расписание \\$HP_* \in HP_{\{1-3\}}^*$, для которого достигается минимальное значение целевой функции:
\begin{equation*}
f_{HP_*}=\min\limits_{HP\in{HP_{\{1-3\}}^*}} f_{HP}
\end{equation*}
Описанная задача является задачей о минимизации максимальной совокупности стоимости \cite{GARYJONSON}. В \cite{ABDEL}, \cite{SETHI} доказано, что в общем случае эта задача является NP-трудной.
+126
View File
@@ -0,0 +1,126 @@
\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$-ой вершины.
+237
View File
@@ -0,0 +1,237 @@
\section{Выбор решателя задач целочисленного линейного программирования}
\label{sec:4_solvers} \index{4_solvers}
\subsection{Обзор решателей}\label{sec:solvers_overview}
Существует ряд программных средств решения задачи ЦЛП (далее –
«решатели»). Выбор решателя для использования в данной работе основан на
критериях доступности, поддержки основных программных платформ и наличия входного языка «lp» для описания задач ЦЛП.
Рассмотрение решателей ЦЛП по этим критериям приведено в таблице \ref{overview}.
\begin{table}[h!]
\caption{\label{overview}Обзор решателей ЦЛП}
\begin{tabular}{|> {\centering\arraybackslash} p{3.8cm}|> {\centering\arraybackslash} p{4.5cm}|c|p{2cm}|} \hline
\centering\arraybackslash \textbf{Решатель} & \centering\arraybackslash\textbf{Доступность} & \textbf{Платформа} &
\textbf{Наличие входного языка lp} \\ \hline
CBC COIN-OR \cite{COIN} & свободный доступ, Eclipse Public License & Linux, Windows, MacOS & \centering\arraybackslash + \\ \hline
GLPK (GNU Linear Programming Kit) \cite{GLPK} & свободный доступ, GNU General Public License (GPL) & Linux, Windows, MacOS & \centering\arraybackslash + \\ \hline
SCIP \cite{SCIP} & свободный доступ, Apache License & Linux, Windows, MacOS & \centering\arraybackslash + \\ \hline
HiGHS \cite{HiGHS} & свободный доступ, MIT License & Linux, Windows, MacOS & \centering\arraybackslash + \\ \hline
GAMS \cite{GAMS} & есть академическая
лицензия, но она не
доступна в РФ & Linux, Windows, MacOS & \centering\arraybackslash + \\ \hline
GUROBI \cite{GUROBI} & есть академическая
лицензия, но она не
доступна в РФ & Linux, Windows, MacOS & \centering\arraybackslash + \\ \hline
\end{tabular}
\label{tab:my_label}
\end{table}
Из свободно доступных решателей для сравнения производительности были выбраны GLPK, SCIP, CBC COIN-OR, поскольку они удовлетворяют всем критериям. Решатель HiGHS был найден и добавлен в обзор после выполнения основного объема экспериментов, поэтому в сравнении производительности не участвовал.
\subsection{Формирование входных данных решателя}\label{sec:input_generation}
Соответствующие входному графу $G$ линейные ограничения необходимо
транслировать во входной язык решателя, в данном случае -- язык «lp». При трансляции необходимо
распределить переменные и линейные ограничения по секциям входного
файла решателя:
\begin{itemize}
\item переменные -- по секциям Integer и Binary (см. таблицу \ref{tab:variable_distribution})
\item ограничения -- по секциям Subject to и Bounds (см. таблицу \ref{tab:restrictions_distribution})
\end{itemize}
Целевая функция, равная переменной F, находится в секции Minimize.
\begin{table}[h]
\caption{Распределение переменных задачи по секциям}
\centering
\begin{tabular}{|c|>{\centering\arraybackslash}p{6.5cm}|>{\centering\arraybackslash}p{6.5cm}|}
\hline
\textbf{Секция} & \textbf{Переменные формальной постановки} & \textbf{Переменные на входном языке решателя} \\
\hline
Integer & $F, s_j$ & F, s\_j \\
\hline
Binary & $m_{ij}, w_{ij}, l_{ij}$ & m\_i\_j, w\_i\_j, l\_i\_j \\
\hline
\end{tabular}
\label{tab:variable_distribution}
\end{table}
\begin{table}[h]
\caption{Распределение ограничений задачи по секциям}
\centering
\begin{tabular}{|l|l|}
\hline
\textbf{Секция} & \textbf{Линейные ограничения формальной постановки} \\
\hline
Subject to & (1), (2), (4), (5), (7), (10), (11), (12) \\
\hline
Bounds & (3), (6), (8), (9) \\
\hline
\end{tabular}
\label{tab:restrictions_distribution}
\end{table}
\begin{figure}[h!]
\centering
\includegraphics[width=0.7\linewidth]{pictures/transitive_edges.png}
\caption{Добавление транзитивных ребер}
\label{fig:transitive_edges}
\end{figure}
Предварительные прогоны решателей показали, что время получения результата может быть сокращено путем добавления транзитивных ограничений частичного порядка на множестве вершин графа. А именно, если $(p_i, p_j) \in E$ и $(p_j, p_k) \in E$, добавляется ограничение вида (3), как если бы $(p_i, p_k) \in E$. Ограничения такого вида не изменяют множество допустимых решений, поскольку не добавляют новых ограничений частичного порядка.
Предварительные прогоны проводились на процессоре, описанном в подразделе \ref{sec:results}.
\begin{figure}[h!]
\centering
\includegraphics[scale=0.53]{pictures/default60.png}
\caption{Преимущество сведения без транзитивности.}
\label{fig:default60}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[scale=0.53]{pictures/default65.png}
\caption{Преимущество сведения с транзитивностью.}
\label{fig:default65}
\end{figure}
На рис. \ref{fig:transitive_edges} показан исходный граф (слева) и граф с добавленными ребрами, соответствующими транзитивным ограничениям (далее для краткости -- граф с транзитивностью).
На диаграммах (рис. \ref{fig:default60}, \ref{fig:default65}) сравнивается время нахождения решателем SCIP решения с одними и теми же входными данными задачи, на графах с наличием и отсутствием транзитивных ребер и различными упорядочениями вершин и ребер. Красной стрелкой показан результат с наименьшим временем выполнения. На рис. \ref{fig:default60} показан случай, в котором решение находится быстрее при отсутствии транзитивности, а на рис. \ref{fig:default65} случай, в котором решение находится быстрее при наличии транзитивности.
Предварительные прогоны также показали, что время получения результата зависит от порядка перечисления вершин и ребер графа, а соответственно –- от порядка следования переменных и ограничений в секциях входного файла
решателя. В терминах файла с описанием графа работ, порядок перечисления
вершин –- это порядок строк в файле; порядок вершин в строке –- это порядок
перечисления в строке потомков вершины, т.е. исходящих ребер. Ниже приведен
пример файла с описанием графа, в нем поле node соответствует вершине
графа, поле size –- занимаемому ресурсу, поле children –- потомкам данной
вершины:
\begin{table}[h]
\centering
\begin{tabular}{ccc}
node & size & children \\
\hline
1 & 2 & 2 3 \\
2 & 5 & 3 \\
3 & 4 & \\
\end{tabular}
\label{tab:sample_data}
\end{table}
В данной работе использовались следующие варианты упорядочения:
\begin{enumerate}
\item \textit{default}: проход по строкам (имеются в виду строки входного файла с описанием графа) сверху вниз, по вершинам в строке слева
направо;
\item \textit{down\_left}: проход по строкам сверху вниз, по вершинам в строке справа
налево;
\item \textit{up\_right}: проход по строкам снизу вверх, по вершинам в строке слева
направо;
\item \textit{tiers}: строки упорядочены по возрастанию номера яруса, к которому
относится вершина, вершины одного яруса упорядочены по
возрастанию номеров в первоначальном файле; в каждой строке вершины-потомки упорядочены
по той же схеме;
\item \textit{reverse\_tiers}: схема, обратная к tiers, причем ярусы отсчитываются
начиная с выходных вершин графа.
\end{enumerate}
На рис. \ref{fig:sorts} и рис. \ref{fig:sorts_tr} сравнивается время работы решателя SCIP в зависимости от упорядочения входных данных при отсутствии и наличии транзитивности соответственно. Каждая группа из пяти столбцов соответствует одному графу с разными упорядочениями. Прогоны решателя для каждого из этих рисунков прерывались, если за 1 час не был получен результат. Тем самым, длительность прогона в 3600 секунд соответствует отсутствию результата. Красной стрелкой отмечено упорядочение с наименьшим временем нахождения решения.
На рис. \ref{fig:sorts} и рис. \ref{fig:sorts_tr} видно, что время работы решателя очень существенно (в разы, в десятки раз) различается в зависимости от упорядочения входных данных.
\begin{figure}[h!]
\centering
\includegraphics[scale=0.49]{pictures/sorts.png}
\caption{Зависимость времени работы решателя от упорядочений для графов без транзитивности.}
\label{fig:sorts}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[scale=0.49]{pictures/sorts_tr.png}
\caption{Зависимость времени работы решателя от упорядочений для графов с транзитивностью.}
\label{fig:sorts_tr}
\end{figure}
\newpage
\subsection{Сравнение производительности решателей}\label{sec:solvers_benchmark}
Были проведены предварительные эксперименты для решателей SCIP 9.2.1, GLPK 5.0, CBC COIN-OR 2.10.12 на всех классах графов с лимитом времени 1800 секунд. Подробное описание классов графов можно прочитать в подразделе \ref{sec:data_classes}.
Предварительные эксперименты проводились на компьютере со следующими характеристиками:
\begin{itemize}
\item ЦП: AMD Ryzen 3 5300U, тактовая частота 2.6 ГГц
\item Количество ядер: 4
\item Oбъем ОЗУ: 8 Гб
\item OС: Ubuntu 20.04 LTS
\end{itemize}
Результаты экспериментов представлены на рис. \ref{fig:solvers_default} -- \ref{fig:solvers_dag}. Графы на каждой диаграмме упорядочены в порядке возрастания количества вершин (соответствуют числам в конце названия графа). Цвету столбца соответствует наличие/отсутствие транзитивных ограничений на том варианте входных данных, где расчет у данного решателя завершился раньше всего, а цвету границы столбца –- упорядочение вершин и ребер. Над каждым столбцом на диаграмме находится буква, соответствующая первой букве названия решателя: G –- GLPK, C - CBC, S - SCIP.
\begin{figure} [h!]
\centering
\includegraphics[width=0.85\linewidth]{pictures/solvers_default.png}
\caption{Время выполнения решателей на слоистых графах с числом «пропускаемых слоев» 0.}
\label{fig:solvers_default}
\end{figure}
\begin{figure} [h!]
\centering
\includegraphics[width=0.85\linewidth]{pictures/solvers_jump2.png}
\caption{Время выполнения решателей на слоистых графах с числом «пропускаемых слоев» 1.}
\label{fig:solvers_jump2}
\end{figure}
\begin{figure} [h!]
\centering
\includegraphics[width=0.85\linewidth]{pictures/solvers_jump3.png}
\caption{Время выполнения решателей на слоистых графах с числом «пропускаемых слоев» 2.}
\label{fig:solvers_jump3}
\end{figure}
\begin{figure} [h!]
\centering
\includegraphics[width=0.85\linewidth]{pictures/solvers_jump4.png}
\caption{Время выполнения решателей на слоистых графах с числом «пропускаемых слоев» 3.}
\label{fig:solvers_jump4}
\end{figure}
Диаграммы на рис. \ref{fig:solvers_default} -- \ref{fig:solvers_jump4} соответствуют слоистым графам. Графы, название которых начинается на jump\_2, jump\_3, jump\_4, имеют количество слоев, пропускаемых ребрами, соответственно 1, 2 и 3. Для графов, название которых начинается на default, пропускаемые слои отсутствуют.
По диаграмме рис. \ref{fig:solvers_default} однозначный выбор решателя для слоистых графов сделать сложно. Так, например, SCIP на default60 и default80 единственный не достигает лимита времени, но на default55 и default75 превышает лучшее время выполнения в сотни раз. В то же время, по диаграммам рис. \ref{fig:solvers_jump2} -- \ref{fig:solvers_jump4} можно сделать однозначный выбор в пользу SCIP, так как он чаще завершается раньше остальных и реже превышает лимит времени.
\begin{figure} [h!]
\centering
\includegraphics[width=0.918\linewidth]{pictures/solvers_triang.png}
\caption{Время выполнения решателей на треугольных графах.}
\label{fig:solvers_triang}
\end{figure}
На диаграмме рис. \ref{fig:solvers_triang} для треугольных графов видно, что SCIP в большинстве случаев завершается быстрее (зачастую в $\approx10$ раз) других решателей и, в отличие от них, ни разу не достигает лимита времени выполнения.
\begin{figure} [h!]
\centering
\includegraphics[width=0.9\linewidth]{pictures/solvers_dag.png}
\caption{Время выполнения решателей на случайных графах.}
\label{fig:solvers_dag}
\end{figure}
На случайных графах (см. рис. \ref{fig:solvers_dag}) ситуация аналогична ситуации с треугольными графами.
\subsection{Выводы}
По совокупности проведенных экспериментов решатель SCIP оказался лучшим по скорости решения задач, поэтому дальнейшие эксперименты проводились на нем. При этом целесообразно запускать решатель с разными упорядочениями и как наличием, так и отсутствием добавленных транзитивных ребер в графе.
+125
View File
@@ -0,0 +1,125 @@
\section{Описание программной реализации}
\label{sec:5_alg_description} \index{5_alg_description}
\subsection{Запуск решателя при выполнении экспериментов}
\label{sec:solver_run}
При выполнении серий экспериментов было введено ограничение по времени на
выполнение решателя, так как есть задачи (например, с треугольным графом из 55
вершин и 90 ребер), на которых решатель не завершил работу в течение
суток. Ограничение задается в виде параметра эксперимента.
В связи с существенной зависимостью времени работы решателя от упорядочения и наличия/отсутствия транзитивности, для основной серии экспериментов (см. раздел \ref{sec:7_experiments}) была выбрана следующая схема выполнения эксперимента с каждым конкретным набором входных данных (графом работ):
\begin{itemize}
\item на 10 процессорных ядрах параллельно запускаются 10 экземпляров
решателя, с 5 разными упорядочениями переменных и линейных
ограничений в каждой секции входного файла решателя, как при наличии так и при отсутствии добавленных в граф транзитивных ребер;
\item на выполнение каждого экземпляра решателя установлен лимит по
времени, являющийся параметром эксперимента;
\item по достижении лимита времени, все экземпляры решателя, не завершившиеся до
этого момента, останавливаются искусственно;
\item если хотя бы один экземпляр решателя завершился с обнаружением оптимального решения (статус «optimal solution found» для SCIP), то принудительно завершается выполнение остальных экземпляров.
\end{itemize}
В набор упорядочений входили: default, down\_left, up\_right, tiers, reverse\_tiers (см. подраздел \ref{sec:input_generation}).
Эксперимент для конкретного графа считается успешным, если хотя бы один из
экземпляров решателя завершился с обнаружением оптимального решения. Если
такого экземпляра нет, то некоторые решения задачи (без гарантии
оптимальности) могут быть получены от экземпляров решателя, завершившихся по лимиту времени, но нашедших в ходе работы допустимые решения.
Выдача решателя содержит верхние оценки отклонения целевой функции на полученных промежуточных решениях от оптимального значения. В подразделе \ref{sec:gap} на отдельных примерах рассмотрено, какую экономию по времени можно получить, ограничившись поиском решений с наперед заданным отклонением значения целевой функции от оптимального.
Решатель SCIP запускался при помощи команды вида:
\begin{verbatim}
scip -s only_time.set -l <выходной файл> -f <входной файл>
\end{verbatim}
Решатель CBC запускался при помощи команды вида:
\begin{verbatim}
cbc <входной файл> sec <лимит в секундах> solve solu <выходной файл>
\end{verbatim}
Решатель GLPK запускался при помощи команды вида:
\begin{verbatim}
time timeout <лимит в секундах> glpsol --cpxlp --first <входной файл>
-o <выходной файл>
\end{verbatim}
Здесь <лимит в секундах> был установлен в 1800, это же значение было записано в файл only\_time.set
\subsection{Разработанные программы}
\label{programs}
Исходные тексты реализации, а также комплекты входных данных, доступны в репозитории на сервисе Github \cite{GITHUB}.
\textbf{Транслятор входных данных во входной язык решателя}
Программа make\_input.py, написанная на языке Python 3.9. Получает на вход
файл с описанием графа работ и транслирует его в 5 файлов на входном
языке решателя, соответствующих 5 различным упорядочениям вершин и
ребер графа (а, следовательно, переменных и ограничений задачи ЦЛП). Упорядочения описаны в подразделе \ref{sec:input_generation}.
Параметры командной строки:
\texttt{-i, --input}: Путь к входному файлу или каталогу с файлами. Обязательный параметр.
\texttt{-o, --output}: Путь к каталогу для сохранения выходных файлов. По умолчанию используется подкаталог outputs/ в текущем каталоге.
\texttt{-tr, --transitive}: Флаг, указывающий на добавление транзитивных ребер при генерации ограничений.
\newpage
Пример запуска:
\begin{verbatim}
make_input.py -i input.txt -o outdir/ -tr
\end{verbatim}
\textbf{Командный сценарий запуска серии экспериментов}
Программа run\_scip.sh, написанная на языке bash, выполняет параллельные запуски решателя SCIP для различных упорядочений и наличия/отсутствия транзитивности и принудительно завершает выполнение всех экземпляров решателя, если хотя бы один экземпляр успешно завершился. Программы run\_glpk.sh и run\_cbc.sh выполняют последовательные запуски решателей GLPK и CBC для различных упорядочений и наличия/отсутствия транзитивности.
Для каждого файла из каталога translator\_inputs/ предварительно должен быть вызван транслятор входных данных во входной язык решателя. Входные данные решателя должны быть в каталогах inputs/new\_tr/order/ и inputs/new\_no\_tr/order/ (суффиксы «\_tr» и «no\_tr» соответствуют наличию и отсутствию транзитивности). Результаты записываются в каталоги outs/new\_tr/ и outs/new\_no\_tr/.
Формат вызова программ:
\begin{verbatim}
run_scip.sh
run_glpk.sh
run_cbc.sh
\end{verbatim}
\textbf{Сборщик результатов экспериментов}
Программы get\_stats\_scip.py, get\_stats\_glpk.py, get\_stats\_cbc.py, написанные на языке Python 3.9, получают на вход каталог с файлами с результатами экспериментов соответствующего решателя и записывают в файлы SCIP\_res, GLPK\_res, CBC\_res соответственно три словаря: с количеством вершин для каждого графа, временем выполнения эксперимента и статусом завершения эксперимента. Программа get\_percents.py, написанная на языке Python 3.9, получает на вход список файлов с результатами экспериментов решателя SCIP и записывает в файл SCIP\_percents словари соответствия для каждого графа: времени и процентного отклонения лучшего найденного решения от теоретической оценки оптимального.
Формат вызова программ:
\begin{verbatim}
get_stats_scip.py <каталог c результатами экспериментов>
get_stats_glpk.py <каталог c результатами экспериментов>
get_stats_cbc.py <каталог c результатами экспериментов>
get_percents.py <путь к файлу1> <путь к файлу2> ...
\end{verbatim}
\textbf{Программы отображения результатов экспериментов}
Программы show\_res\_scip.py (результат см. рис. \ref{fig:default60}, \ref{fig:default65}), show\_sorts\_scip.py (см. рис. \ref{fig:sorts}, \ref{fig:sorts_tr}) принимают на вход файл SCIP\_res, полученный с помощью программы \\get\_stats\_scip.py, и строят диаграммы в формате, описанном в подразделе \ref{sec:input_generation}.
Программа show\_all.py (результат см. рис. \ref{fig:solvers_default} -- \ref{fig:solvers_dag}) принимает на вход три файла с результатами экспериментов трех решателей SCIP\_res, GLPK\_res, CBC\_res и строит диаграммы, описанные в подразделе \ref{sec:solvers_benchmark}.
Программы plot\_triang.py (результат см. рис. \ref{fig:trianglog}), plot\_layered.py (см. рис. \ref{fig:layeredlog}), plot\_dag.py (см. рис. \ref{fig:dagpie}) получают на вход файл SCIP\_res и строят диаграммы по серии экспериментов в формате, описанном в подразделе \ref{sec:results}.
Программа plot\_percents.py (см. рис. \ref{fig:percents_gap}) принимает на вход файл SCIP\_percents и строит диаграммы в формате, описанном в подразделе \ref{sec:gap}.
Все вышеперечисленные программы написаны на языке Python 3.9 с использованием библиотеки matplotlib.
Формат вызова программ:
\begin{verbatim}
show_res_scip.py SCIP_res
show_sorts_scip.py SCIP_res
show_all.py SCIP_res GLPK_res CBC_res
plot_triang.py SCIP_res
plot_layered.py SCIP_res
plot_dag.py SCIP_res
plot_percents.py SCIP_percents
\end{verbatim}
+162
View File
@@ -0,0 +1,162 @@
\section{Экспериментальное исследование масштабируемости подхода}
\label{sec:7_experiments} \index{7_experiments}
\subsection{Цели исследования}\label{sec:purpose}
Целью экспериментального исследования являлась оценка масштабируемости предложенного подхода на основе ЦЛП по времени поиска решения при увеличении размерности входных данных.
\subsection{Классы исходных данных}\label{sec:data_classes}
Для исследования использовались три типа входных графов:
\begin{enumerate}
\item Случайно сгенерированные графы.
\item Слоистые графы.
\item Графы работ алгоритма Гаусса-Жордана.
\end{enumerate}
Рассмотрим отдельно каждый тип графов.
\textbf{Случайные графы работ.}
Случайные графы (рис. \ref{fig:sluch_gr}), в которых каждая вершина может иметь 1 или 2 предков и любое количество потомков.
\begin{figure}[!h]
\centering
\includegraphics[scale=0.3]{./pictures/схема_случайного_графа.png}
\caption{Случайный граф.}
\label{fig:sluch_gr}
\end{figure}
Для экспериментов использовались графы со следующими свойствами:
\begin{itemize}
\item Количество вершин: от 30 до 97.
\item Количество ребер: от 41 до 144.
\item Средняя плотность (количество ребер/количество вершин): 1,47.
\item Использование ресурсов вершинами: случайное, возможные значения 16384, 65536, 262144.
\end{itemize}
\textbf{Слоистые графы работ.}
Графы работ со слоистой структурой (рис. \ref{fig:sloist_gr}), типичные для многих реальных приложений с многоэтапными вычислениями, например, цифровая обработка сигналов.
\begin{figure}[!h]
\centering
\includegraphics[height=5cm,keepaspectratio]{./pictures/схема_слоистого_графа.png}
\caption{Слоистый граф.}
\label{fig:sloist_gr}
\end{figure}
\newpage
Для экспериментов использовались графы со следующими свойствами:
\begin{itemize}
\item Количество вершин: от 10 до 80 с шагом 5.
\item Количество ребер: от 9 до 178.
\item Средняя плотность (количество ребер/количество вершин): 1,49.
\item Использование ресурсов вершинами: случайное кратное 1024, в диапазоне [2048; 11264].
\end{itemize}
\textbf{Треугольные графы работ.}
Основной набор графов работ для экспериментов по масштабируемости. Этот набор основан на графах работ алгоритма Гаусса-Жордана. Треугольные графы (рис. \ref{fig:treug_graf}) -- это многоуровневые графы с регулярной структурой и ребрами, соединяющими только соседние слои.
\begin{figure}[!h]
\centering
\includegraphics[height=6cm,keepaspectratio]{pictures/схема_треугольного_графа.png}
\caption{Треугольный граф.}
\label{fig:treug_graf}
\end{figure}
Для экспериментов использовались графы со следующими свойствами:
\begin{itemize}
\item Количество вершин: от 21 до 55.
\item Количество ребер: от 30 до 90.
\item Средняя плотность (количество ребер/количество вершин): 1,54.
\item Использование ресурсов вершинами: случайное в диапазоне [1; 100].
\end{itemize}
Количество слоев варьировалось от 6 до 10 с шагом 1. Для каждого количества слоев в наборе есть 6 графов с одинаковой структурой и разным использованием ресурсов вершинами.
\subsection{Результаты экспериментов}
\label{sec:results}
Эксперименты проводились на компьютере со следующими характеристиками:
\begin{itemize}
\item ЦП: Intel Xeon E5-2650 v4, тактовая частота 2.2 ГГц
\item Количество ядер: 20
\item Oбъем ОЗУ: 64 Гб
\item OС: Ubuntu 20.04 LTS
\end{itemize}
На диаграмме рис. \ref{fig:trianglog} представлено время поиска решения на треугольных графах с использованием решателя SCIP (выбран по результатам предварительных экспериментов, описанных в разделе \ref{sec:4_solvers}). Цвету столбца соответствует наличие или отсутствие транзитивных ребер, а цвету границы столбца -- упорядочение входных данных.
\begin{figure} [h!]
\centering
\includegraphics[width=1\linewidth]{pictures/trianglog.png}
\caption{Время поиска решения на треугольных графах.}
\label{fig:trianglog}
\end{figure}
Видно, что с ростом числа вершин увеличивается усредненное по графам с одинаковым числом вершин время поиска решения. В зависимости от использования ресурсов вершинами, время поиска при одинаковом числе вершин может различаться в сотни раз (например, для графов с 45 вершинами).
На диаграмме рис. \ref{fig:layeredlog} представлено время поиска решения на слоистых графах. Цвету столбца соответствует наличие или отсутствие транзитивных ребер, а цвету границы столбца -- упорядочение. Под каждым столбцом находится число -- максимальное количество слоев, пропускаемое ребрами, а под этими числами -- число вершин в графе.
\begin{figure}
\centering
\includegraphics[width=1\linewidth]{pictures/layeredlog.png}
\caption{Время поиска решения на слоистых графах.}
\label{fig:layeredlog}
\end{figure}
Видно, что с ростом числа вершин увеличивается усредненное по графам с одинаковым числом вершин время поиска решения. Для фиксированного числа вершин, с увеличением количества пропускаемых слоев время поиска решения растет, порой в десятки раз (например, для графов с 50 вершинами).
Для случайных графов были построены круговые диаграммы, см. рис. \ref{fig:dagpie}. В легенде каждой диаграммы указано соответствие цвета количеству секунд, понадобившемуся на поиск решения. Ограничение на время работы решателя (TIMELIMIT) было установлено в 3600 секунд.
\newpage
По диаграммам видно, что:
\begin{itemize}
\item В диапазоне от 30 до 55 вершин около 70\% запусков решателя выполняются менее 100 секунд.
\item В диапазоне от 55 до 80 вершин большинство запусков решателя выполняются больше 1000 секунд, из них около трети превышают лимит времени.
\item В диапазоне от 80 до 100 вершин превысили лимит времени 90 процентов запусков решателя, и ни один не завершился в пределах 1000 секунд.
\end{itemize}
Таким образом, для случайных графов с ростом числа вершин увеличивается минимальное и среднее время нахождения решения, а также растет доля запусков решателя, превысивших ограничение по времени.
\begin{figure}
\centering
\includegraphics[width=1\linewidth]{pictures/dagpie.png}
\caption{Время поиска решения на случайных графах.}
\label{fig:dagpie}
\end{figure}
\subsection{Экономия времени за счет поиска неоптимальных решений}\label{sec:gap}
Решатель SCIP во время поиска оптимального решения находит допустимые, но не оптимальные решения и показывает, насколько лучшее из них отличается по значению целевой функции от оценки оптимума целевой функции, исходя из текущих результатов алгоритма. Формула подсчета отклонения выглядит так:
\[gap = \frac{|primalbound - dualbound|}{min(|primalbound|,|dualbound|)|} * 100\%,\]
где $primalbound$ --- это верхняя оценка оптимального значения, которая равна значению целевой функции лучшего найденного решения задачи, $dualbound$ --- нижняя оценка оптимального значения целевой функции, и знаки $primalbound$ и $dualbound$ совпадают. Если знаки $primalbound$ и $dualbound$ разные, то отклонение ($gap$) принимает значение «Infinity» (бесконечность).
\begin{figure}[h!]
\centering
\includegraphics[width=1\linewidth]{template-cmc/pictures/percents_gap.png}
\caption{Отклонение от теоретической оценки точного решения в процентах.}
\label{fig:percents_gap}
\end{figure}
По рис. \ref{fig:percents_gap} можно для нескольких графов проследить время поиска решений с верхними оценками отклонения от оптимума в диапазоне от 20\% до 0\% (оптимальное решение) с шагом 5\%. Под столбцами подписаны проценты отклонения, а ниже -- названия графов. Если нужный процент (например, 15\% для графа default70) отсутствовал в протоколе работы решателя, то брался процент на 1 меньше или больше. Если и он отсутствовал, то этот столбец пропускался (например, 5\% для графа jump\_4\_40).
Видно, что в ряде случаев можно значительно сэкономить время, задав небольшое отклонение искомого решения от оптимального по значению целевой функции. Так, для треугольного графа triang10\_0 решение с 10\% отклонением от оптимума ищется более чем в 100 раз быстрее, чем оптимальное решение. В других случаях экономия может быть несущественной, например для слоистого графа jump\_3\_45.
\subsection{Выводы}\label{sec:summary}
Экспериментальное исследование показало быстрый рост времени работы решателя с увеличением размера входного графа, что характерно для NP-трудных задач. При одинаковом количестве вершин в графе, существенное влияние на время работы решателя оказывает как количество потребляемого работами ресурса (видно на треугольных графах), так и структура графа (видно на слоистых графах с различным количеством пропускаемых ребрами слоев).
Выявлена значительная зависимость времени поиска решения от упорядочения входных данных и от наличия или отсутствия добавленных в граф транзитивных ребер. Зависимость не носит систематического характера, поэтому рекомендуется использовать схему с параллельным запуском экземпляров решателя для различных сочетаний упорядочения и наличия/отсутствия транзитивных ребер при одном и том же наборе входных данных задачи.
Ограничения применимости метода по размеру входного графа зависят от структуры графа. В проведенных экспериментах, для треугольных графов максимальное число вершин графа, для которого было найдено решение, составляло 55; для слоистых -- 80 (при отсутствии ребер, пропускающих слои). При этом для треугольного графа с 55 вершинами и 90 ребрами поиск решения занял двое суток, а для слоистого графа с 75 вершинами и 161 ребрами (включая ребра, пропускающие слои) решение не было найдено за 20 суток. Отметим, что в области цифровой обработки сигналов присутствуют графы работ с количеством вершин, не превышающим выявленные пределы: в статье \cite{CASANOVA} приведены графы работ для операций LU-разложения (55 вершин), QR-разложения (55 вершин), разложения Холецкого (35 вершин).
В ряде случаев время работы решателя можно значительно (в десятки раз, до 100 раз) сократить, если остановить поиск при обнаружении решения, отклоняющегося на 10-15\% от оптимального по значению целевой функции.
+16
View File
@@ -0,0 +1,16 @@
\anonsection{Заключение}
\label{sec:9_zakluch} \index{9_zakluch}
В данной работе получены следующие результаты:
\begin{enumerate}
\item Разработана схема сведения задачи построения расписания к задаче ЦЛП;
\item На основе сравнения производительности выбран решатель ЦЛП –- SCIP;
\item С учетом выявленной зависимости времени работы решателя от упорядочения входных данных, предложена и реализована многопроцессная схема запуска решателя;
\item Проведено экспериментальное исследование масштабируемости предложенного подхода, показавшее:
\begin{itemize}
\item значительную зависимость времени работы решателя ЦЛП от упорядочения вершин и ребер графа работ;
\item применимость подхода для входных графов, содержащих до 97 вершин и 143 ребер (один из случайных графов);
\item возможность сокращения времени работы решателя на 0,5--99\% (в зависимости от входных данных) в случае приемлемости решения, отклоняющегося от оптимального на 5--20\%.
\end{itemize}
\end{enumerate}
В качестве перспектив развития предложенного метода можно рассматривать исследование зависимости времени работы решателя ЦЛП от упорядочения вершин и ребер графа работ с целью поиска схем упорядочения, позволяющих систематически сократить время работы решателя.
+626
View File
@@ -0,0 +1,626 @@
% Revision: 07-25-2007
% Revision History
% 07-10-2008 : Corrected Alignment of signature boxes on Masters/PhD Approval page
% 07-25-2007 : Corrected some spelling errors
% 05-16-2006 : Added etd option and moved most packages from class file to template
% 05-15-2006 : Initial version.
%
% Known bugs
% Having a tiny bit of the abstract spill to second page defeats page number removal.
% Workaround: make the abstract a little longer or a little shorter.
%
% The BYUPhys class is for producing theses and dissertations
% in the BYU department of physics and astronomy. You can supply
% the following optional arguments in the square brackets to
% specify the thesis type:
%
% senior : Produces the senior thesis preliminary pages (default)
% honors : Produces the honors thesis preliminary pages
% masters : Produces the masters thesis preliminary pages
% phd : Produces the PhD dissertation preliminary pages
%
% The default format is appropriate for printing, with blank pages
% inserted after the preliminary pages in twoside mode so you can
% send it directly to a two-sided printer. However, for ETD
% submission the blank pages need to be removed from the final output.
% The following option does this:
%
% etd : Produces an electronic copy with no blank pages in the preliminary section
%
% The rest of the class options are the same as the regular book class.
% A few to remember:
%
% oneside : Produces single sided print layout (recommended for theses less than 50 pages)
% twoside : Produces single sided print layout (the default if you remove oneside)
%
% The BYUPhys class provides the following macros:
%
% \makepreliminarypages : Makes the preliminary pages
% \clearemptydoublepage : same as \cleardoublepage but doesn't put page numbers
% on blank intervening pages
% \singlespace : switch to single spaced lines
% \doublespace : switch to double spaced lines
%
% ------------------------------------------------------------------------------------------------------
%
\NeedsTeXFormat{LaTeX2e} \ProvidesClass{BYUPhysForDegree}
% ---------------------------- declarations -------------------------
%
% These macros are used to declare arguments needed for the
% construction of the preliminary pages
% The year and month the degree is awarded
\newcommand{\University}[1]{\gdef\@University{#1}}
\newcommand{\Faculty}[1]{\gdef\@Faculty{#1}}
\newcommand{\Chair}[1]{\gdef\@Chair{#1}}
\newcommand{\Lab}[1]{\gdef\@Lab{#1}}
\newcommand{\GrText}[1]{\gdef\@GrText{#1}}
\newcommand{\AcadGroup}[1]{\gdef\@AcadGroup{#1}}
\newcommand{\AdvisorText}[1]{\gdef\@AdvisorText{#1}}
\newcommand{\ConsultantText}[1]{\gdef\@ConsultantText{#1}}
\newcommand{\ApprovalText}[1]{\gdef\@ApprovalText{#1}}
\newcommand{\ApprovalAText}[1]{\gdef\@ApprovalAText{#1}}
\newcommand{\ApprovalBText}[1]{\gdef\@ApprovalBText{#1}}
\newcommand{\DateText}[1]{\gdef\@DateText{#1}}
\newcommand{\Year}[1]{\gdef\@Year{#1}}
\newcommand{\Month}[1]{\gdef\@Month{#1}}
\newcommand{\City}[1]{\gdef\@City{#1}}
% The full name of the degree
\newcommand{\degree}[1]{\gdef\@degree{#1}}
% The name of this document (thesis/dissertation)
\newcommand{\docname}[1]{\gdef\@docname{#1}}
% First line of title
%\newcommand{\TitleTop}[1]{\gdef\@TitleTop{\mbox{\uppercase{#1}}}}
\newcommand{\TitleTop}[1]{\gdef\@TitleTop{\mbox{#1}}}
\newcommand{\TitleTopEng}[1]{\gdef\@TitleTopEng{\mbox{#1}}}
\newcommand{\TitleMiddle}[1]{\gdef\@TitleMiddle{\mbox{#1}}}
\newcommand{\TitleMiddleEng}[1]{\gdef\@TitleMiddleEng{\mbox{#1}}}
% Second line of title
\newcommand{\TitleBottom}[1]{\gdef\@TitleBottom{\mbox{#1}}}
\newcommand{\TitleBottomEng}[1]{\gdef\@TitleBottomEng{\mbox{#1}}}
% Abstract text
\newcommand{\Abstract}[1]{\gdef\@Abstract{#1}}
\newcommand{\AbstractEng}[1]{\gdef\@AbstractEng{#1}}
\newcommand{\AbstractText}[1]{\gdef\@AbstractText{#1}}
% Acknowledgments text
%\newcommand{\Acknowledgments}[1]{\gdef\@Acknowledgments{#1}}
%\newcommand{\AcknowledgmentsText}[1]{\gdef\@AcknowledgmentsText{#1}}
% The author's name
\newcommand{\AuthorText}[1]{\gdef\@AuthorText{#1}}
\newcommand{\Author}[1]{\gdef\@Author{#1}}
\newcommand{\AuthorEng}[1]{\gdef\@AuthorEng{#1}}
\newcommand{\AuthorGenitiveCase}[1]{\gdef\@AuthorGenitiveCase{#1}}
% The name of the advisor
\newcommand{\Advisor}[1]{\gdef\@Advisor{#1}}
\newcommand{\AdvisorDegree}[1]{\gdef\@AdvisorDegree{#1}}
% The name of the consultant
\newcommand{\Consultant}[1]{\gdef\@Consultant{#1}}
\newcommand{\ConsultantDegree}[1]{\gdef\@ConsultantDegree{#1}}
% The name of the committee member 2
\newcommand{\MemberA}[1]{\gdef\@MemberA{#1}}
% The name of the committee member 3
\newcommand{\MemberB}[1]{\gdef\@MemberB{#1}}
% The name of the committee member 4
\newcommand{\MemberC}[1]{\gdef\@MemberC{#1}}
% The name of the committee member 5
\newcommand{\MemberD}[1]{\gdef\@MemberD{#1}}
% The name of the department chair
\newcommand{\DepRep}[1]{\gdef\@DepRep{#1}}
% The title of the department chair (allow for associate chair, etc.)
\newcommand{\DepRepTitle}[1]{\gdef\@DepRepTitle{#1}}
% The name of the department undergraduate coordinator
\newcommand{\UgradCoord}[1]{\gdef\@UgradCoord{#1}}
% The name of the dean
\newcommand{\Dean}[1]{\gdef\@Dean{#1}}
% The title of the dean
\newcommand{\DeanTitle}[1]{\gdef\@DeanTitle{#1}}
% The name of the honors dean
\newcommand{\HonorsDean}[1]{\gdef\@HonorsDean{#1}}
\newcommand{\anonsection}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}}
% Set default values for fields
\University{2010}
\Year{2010}
\Month{Month}
\Author{Author}
\TitleTop{Title}
\TitleMiddle{ }
\TitleBottom{ } % default is empty
\Abstract{Abstract text goes here.}
% \Acknowledgments{Acknowledgment text goes here.}
% \degree{Bachelor of Science}
\docname{Master Thesis}
\Advisor{Advisor}
\Consultant{}
\ConsultantDegree{}
\ConsultantText{}
\MemberA{Committee Member A}
\MemberB{Committee Member B}
\MemberC{Committee Member C}
\MemberD{Committee Member D}
\DepRep{Department Chair Name}
\DepRepTitle{Chair}
\Dean{Dean Name}
\DeanTitle{Associate Dean}
\HonorsDean{Honors Dean Name}
\UgradCoord{Department Ugrad Coordinator }
% ---------------------------- options ------------------------------
% A command to switch to single spaced lines
\newcommand{\singlespace}{\renewcommand{\baselinestretch}{1}\small\normalsize}
\newcommand{\oneandhalfspace}{\renewcommand{\baselinestretch}{1.33}\small\normalsize}
% A command to switch to double spaced lines
\newcommand{\doublespace}{\renewcommand{\baselinestretch}{1.66}\small\normalsize}
% A command pirated from chngpage.sty
\DeclareRobustCommand{\ch@ngetext}{%
\setlength{\@colht}{\textheight}\setlength{\@colroom}{\textheight}%
\setlength{\vsize}{\textheight}\setlength{\columnwidth}{\textwidth}%
\if@twocolumn%
\advance\columnwidth-\columnsep \divide\columnwidth\tw@%
\@firstcolumntrue%
\fi%
\setlength{\hsize}{\columnwidth}%
\setlength{\linewidth}{\hsize}%
}
% A command to make margins right for the initial single sided business.
\newcommand{\preliminarymargins}{%
\addtolength{\textwidth}{-0.5in}%
\addtolength{\evensidemargin}{0.5in}%
\ch@ngetext%
}
% A command to fix the margins after the initial single sided business.
\newcommand{\fixmargins}{%
\addtolength{\textwidth}{0.5in}
\addtolength{\evensidemargin}{-0.5in}
\ch@ngetext%
}
% Define the preliminary section for a senior thesis.
% The senior option is essentially ignored since it is the default
\newcommand{\makepreliminarypages}{
\preliminarymargins
\titlepage
% \copyrightpage
% \seniorapprovalpage
\abstractpage
% \acknowledgmentspage
\fixmargins
\renewcommand{\clearemptydoublepage}{\cle@remptydoublep@ge}
}
% Define the honors thesis preliminary section if the 'honors' option is specified
\DeclareOption{honors}{
\renewcommand{\makepreliminarypages}{
\preliminarymargins
\honorstitlepage
\copyrightpage
\seniorapprovalpage
\abstractpage
% \acknowledgmentspage
\fixmargins
\renewcommand{\clearemptydoublepage}{\cle@remptydoublep@ge}
}
}
% Changes to masters thesis preliminary section if the 'masters' option is specified
\DeclareOption{masters}{
\degree{Master of Science}
\docname{thesis}
\renewcommand{\makepreliminarypages}{
\preliminarymargins
\titlepage
\copyrightpage
\masterapprovalpage
\acceptancepage
\abstractpage
% \acknowledgmentspage
\fixmargins
\renewcommand{\clearemptydoublepage}{\cle@remptydoublep@ge}
}
}
% Changes to PhD preliminary section if the 'phd' option is specified
\DeclareOption{phd}{
\degree{Doctor of Philosophy}
\docname{dissertation}
\renewcommand{\makepreliminarypages}{
\preliminarymargins
\titlepage
\copyrightpage
\phdapprovalpage
\acceptancepage
\abstractpage
% \acknowledgmentspage
\fixmargins
\renewcommand{\clearemptydoublepage}{\cle@remptydoublep@ge}
}
}
% --------------------- Some commands to handle the single sided preliminary pages ------------------
% Define the '\clearemptydoublepage' command to clear pages but not number any blank pages inserted.
% This is taken from the BYUThesis.cls file
\let\cle@rdoublep@ge\cleardoublepage
\newcommand{\cle@remptydoublep@ge}{
\clearpage
\if@twoside
\ifodd\c@page\else
\fi\fi
{\pagestyle{empty}\cle@rdoublep@ge}}
\newcommand{\clearemptydoublepage}{\cle@remptydoublep@ge}
% Create an abstract environment which is single sided, even in a double sided book.
% again, this was taken from BYUThesis.cls
\def\skip@bstr@ctp@ges{\relax}
\def\@@skip@bstr@ctp@ges{%
\if@twoside
\ifodd\c@page\else
\vbox{\vbox to \vsize{}}
\clearpage\fi
\else
\fi
\afterpage{\skip@bstr@ctp@ges}
}
\newenvironment{abstractenv}{
\def\skip@bstr@ctp@ges{\@@skip@bstr@ctp@ges}
\afterpage{\skip@bstr@ctp@ges \thispagestyle{empty}}
\pagestyle{empty}
}
% Redefine above commands if etd option is specified. The blank pages make printing nice,
% but they don't want them in the submitted PDF
\DeclareOption{etd}{
\renewcommand{\clearemptydoublepage}{ \clearpage }
\renewenvironment{abstractenv}{\afterpage{\thispagestyle{empty}}\pagestyle{empty}}{}
}
% ------------------------ Load the class and needed packages ---------------------------------
% Load the book class
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[a4,12pt]{article}
% The afterpage package is required to make single sided formal pages
% in a double sided environment
\RequirePackage{afterpage}
% Note: the hyperref package is required to make an appropriate ETD.
% However, we don't require it here since it is supposed to be the last
% package loaded and students may want to load other packages in the
% main tex file. So that this class file doesn't crash if the student
% forgets to load hyperref, we have used the following commands below:
%
% \providecommand\phantomsection{}
% \providecommand\pdfbookmark[3][]{}
%
% These commands provide dummy versions of the macros, but won't
% bother the real versions if the hyperref package is loaded in the
% tex file.
% ---------------------------- main code ----------------------------
% Set the margins to BYU specifications for the single sided preliminary
% pages. At the end of the \makepreliminarypages command we fix the margins
% to be appropriate alternating values for double sided printing (if selected).
% If the \makepreliminarypages macro is not run, this never gets fixed.
\setlength{\marginparwidth}{0pt}
\setlength{\marginparsep}{0pt}
\setlength{\oddsidemargin}{0.3in}
\setlength{\evensidemargin}{0in}
\setlength{\textwidth}{6in}
\setlength{\topmargin}{0in}
\setlength{\headheight}{0.125in}
\setlength{\headsep}{0.25in}
\setlength{\textheight}{8.625in}
\setlength{\footskip}{0.25in}
\raggedbottom
% Redefine the Table of Contents to deal with some blank page
% and bookmarking issues relating to ETD submission
%\let\TEMPtableofcontents\tableofcontents
%\renewcommand{\tableofcontents}{
% \clearemptydoublepage
%\providecommand\phantomsection{} \phantomsection
%\addcontentsline{toc}{chapter}{Оглавление}
%\TEMPtableofcontents
%}
% Redefine the List of Figures to deal with some blank page
% and bookmarking issues
%\let\TEMPlistoffigures\listoffigures
%\renewcommand{\listoffigures}{
% \providecommand\phantomsection{} \phantomsection
%\addcontentsline{toc}{chapter}{List of Figures}
%\TEMPlistoffigures
%}
% Redefine the Bibliography to deal with a bookmarking issues
\let\TEMPbibliography\bibliography
\renewcommand{\bibliography}{
\providecommand\phantomsection{} \phantomsection
%\addcontentsline{toc}{chapter}{Литература}
\TEMPbibliography
}
%---------------------------- The Preliminary Page Definitions --------------------------
% ============================== Title Page ===============================
\renewcommand{\titlepage}{
\thispagestyle{empty}
\begin{center}
\providecommand\pdfbookmark[3][]{} \pdfbookmark[1]{Title Page}{bm:Title}
\includegraphics[height=4cm,keepaspectratio]{./gzlogo.png}\\[0.1cm]
%\vspace*{0.375in}
{\large \@University\\}
\@Faculty\\
{\footnotesize \@Chair\\}
{\scriptsize \@Lab\\[\baselineskip]}
\vfill
{\Large \@Author \\[\baselineskip]}
{%\HRule \\[0.4cm]
\Large \textbf{\@TitleTop}\\
\textbf{\@TitleMiddle}\\
\textbf{\@TitleBottom}\\[\baselineskip]
\large \@docname \\[\baselineskip] }
%\HRule \\[1.5cm]
\normalsize
\vfill
\begin{flushright}
% \emph{\@AuthorText:\\}
% {\small \@GrText~\@AcadGroup\\}
\textbf{\@AdvisorText\\}
{~ \@AdvisorDegree~ \\ \@Advisor\\}
\emph{\@ConsultantText\\}
{~ \@ConsultantDegree~ \@Consultant\\}
\end{flushright}
\vfill
%\vskip0.667in
%\@degree \\
\vfill
\@City, \@Year \\[\baselineskip]
\end{center}
\clearemptydoublepage
}
% ============================== Honors Title Page ========================
\newcommand{\honorstitlepage}{
\thispagestyle{empty}
\begin{center}
%\providecommand\pdfbookmark[3][]{} \pdfbookmark[0]{Title Page}{bm:Title}
\vspace*{0.375in}
\@TitleTop\\[\baselineskip]
%\@TitleMiddle\\ %
\@TitleBottom\\
\vfill
\@Author,
\vfill
%Submitted to Brigham Young University in partial fulfillment\\[\baselineskip]
%of graduation requirements for University Honors\\[2\baselineskip]
%Department of Physics and Astronomy\\[\baselineskip]
%\@Month~\@Year
\@City,~\@Year
\vfill
\end{center}
\parbox[t]{2.75in}{
Advisor: \@Advisor \\[.5\baselineskip]
Signature: \hrulefill}
\hfill
\parbox[t]{2.75in}{
Honors Dean: \@HonorsDean \\[.5\baselineskip]
Signature: \hrulefill}
\clearemptydoublepage
}
% ======================== Copyright page ===============================
\newcommand{\copyrightpage}{
\thispagestyle{empty}
\providecommand\pdfbookmark[3][]{} \pdfbookmark[0]{Copyright}{bm:Copyright}
\vspace*{\fill}
\begin{center}
Copyright \copyright\ \@Year~\@Author\\[\baselineskip]
All Rights Reserved\\[5\baselineskip]
\end{center}
\vspace{1in}
\vfill
\clearemptydoublepage
}
% =============================== Approval page =======================
\newcommand{\datebox}{
\parbox[t]{1.5in}{
\ \\[2\baselineskip]
\rule{1.5in}{0.4pt}\\
\@DateText
}
}
\newcommand{\signaturebox}[1]{
\parbox[t]{3.6in}{
\ \\[2\baselineskip]
\rule{3.6in}{0.4pt}\\
#1
}
}
\newcommand{\phdapprovalpage}{
\thispagestyle{empty}
\begin{center}
\providecommand\pdfbookmark[3][]{} \pdfbookmark[0]{Graduate Committee Approval}{bm:ComAp}
\vspace*{0.375in}
BRIGHAM YOUNG UNIVERSITY\\[3\baselineskip]
GRADUATE COMMITTEE APPROVAL\\[5\baselineskip]
of a \@docname~submitted by\\[\baselineskip]
\@Author\\[2\baselineskip]
\end{center}
\noindent
This dissertation has been read by each member of the following graduate committee
and by majority vote has been found to be satisfactory.\\[\baselineskip]
\datebox\hfill\signaturebox{\@Advisor, Chair}\\
\datebox\hfill\signaturebox{\@MemberA}\\
\datebox\hfill\signaturebox{\@MemberB}\\
\datebox\hfill\signaturebox{\@MemberC}\\
\datebox\hfill\signaturebox{\@MemberD}
\vfill
\clearemptydoublepage
}
\newcommand{\masterapprovalpage}{
\thispagestyle{empty}
\begin{center}
\providecommand\pdfbookmark[3][]{} \pdfbookmark[0]{Graduate Committee Approval}{bm:ComAp}
\vspace*{0.375in}
BRIGHAM YOUNG UNIVERSITY\\[3\baselineskip]
GRADUATE COMMITTEE APPROVAL\\[5\baselineskip]
of a \@docname~submitted by\\[\baselineskip]
\@Author\\[2\baselineskip]
\end{center}
\noindent
This thesis has been read by each member of the following graduate committee
and by majority vote has been found to be satisfactory.\\[\baselineskip]
\datebox\hfill\signaturebox{\@Advisor, Chair}\\
\datebox\hfill\signaturebox{\@MemberA}\\
\datebox\hfill\signaturebox{\@MemberB}\\
\vfill
\clearemptydoublepage
}
\newcommand{\seniorapprovalpage}{
\thispagestyle{empty}
\begin{center}
\providecommand\pdfbookmark[3][]{} \pdfbookmark[0]{Department Approval}{bm:DepAp}
\vspace*{0.375in}
\@University\\[3\baselineskip]
{\bf \@ApprovalText}\\[5\baselineskip]
\@docname~\@ApprovalAText\\[\baselineskip]
{\em \@AuthorGenitiveCase}\\[2\baselineskip]
\@ApprovalBText
\\[\baselineskip]
\end{center}
\datebox\hfill\signaturebox{\@Advisor, \@AdvisorText}\\
%\datebox\hfill\signaturebox{\@UgradCoord, Research Coordinator}\\
%\datebox\hfill\signaturebox{\@DepRep, \@DepRepTitle}\\
\vfill
\clearemptydoublepage
}
% ======================= Acceptance Page ============================
\newcommand{\acceptancepage}{
\thispagestyle{empty}%
\begin{center}
\providecommand\pdfbookmark[3][]{} \pdfbookmark[0]{Acceptance Page}{bm:Accept}
\vspace*{0.375in}
BRIGHAM YOUNG UNIVERSITY\\[3\baselineskip]
\end{center}%
\noindent%
As chair of the candidate's graduate committee, I have read the
\@docname\ of \@Author \ in its final form and have found
that (1) its format, citations, and bibliographical style are
consistent and acceptable and fulfill university and department
style requirements; (2) its illustrative materials including
figures, tables, and charts are in place; and (3) the final
manuscript is satisfactory to the graduate committee
and is ready for submission to the university library.\\[2\baselineskip]
\datebox\hfill\signaturebox{\@Advisor\\Chair, Graduate Committee}
\vskip 0pt plus 2fill
\noindent Accepted for the Department\par\hfill%
\signaturebox{\@DepRep, \@DepRepTitle\\Department of Physics and
Astronomy }{} \vfill \noindent Accepted for the College\par\hfill
\signaturebox{\@Dean, \@DeanTitle \\
College of Physical and Mathematical Sciences}
\clearemptydoublepage
}
% ========================= Abstract ===================================
\newcommand{\abstractpage}{
\thispagestyle{empty}
\begin{abstractenv}
\begin{center}
\providecommand\pdfbookmark[3][]{} \pdfbookmark[1]{Abstract}{bm:Abstract}
\vspace*{0.375in}
{\bf \@AbstractText}\\[1\baselineskip]
%{\large \@TitleTop\\
%\@TitleBottom}\\[1\baselineskip]
%{\em \@Author}\\[\baselineskip]
\end{center}
\renewcommand{\baselinestretch}{1.33}\small\normalsize
\@Abstract
\vfill
%\begin{center}
%\providecommand\pdfbookmark[3][]{} \pdfbookmark[0]{Abstract}{bm:Abstract}
%\vspace*{0.375in}
%{\bf Abstract}\\[1\baselineskip]
%{\large \@TitleTopEng\\
%\@TitleBottomEng}\\[1\baselineskip]
%{\em \@AuthorEng}\\[\baselineskip]
%\end{center}
%\renewcommand{\baselinestretch}{1.33}\small\normalsize
%\@AbstractEng
\end{abstractenv}
\clearemptydoublepage
}
% ========================= Acknowledgments ==============================
%\newcommand{\acknowledgmentspage}{
% \renewcommand{\baselinestretch}{1}\small\normalsize
% \thispagestyle{empty}
% \begin{center}
% \providecommand\pdfbookmark[3][]{}
% \pdfbookmark[0]{Acknowledgments}{bm:Acknowledge}
% \vspace*{0.375in}
% {\Large \@AcknowledgmentsText}\\[3\baselineskip]
% \end{center}
%
% \renewcommand{\baselinestretch}{1.66} \small\normalsize%
% \@Acknowledgments
% \clearemptydoublepage
% }
+1428
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

+102
View File
@@ -0,0 +1,102 @@
\documentclass[oneside,senior,etd]{BYUPhysForDegree}
\usepackage[utf8]{inputenc}
\usepackage{rotating}
\usepackage[russian]{babel}
\usepackage{amsfonts} % Пакеты для математических символов и теорем
\usepackage{amstext}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{graphicx} % Пакеты для вставки графики
\usepackage{subfig}
\usepackage{color}
\usepackage[unicode]{hyperref}
\usepackage[nottoc]{tocbibind} % Для того, чтобы список литературы отображался в оглавлении
\usepackage{algorithmic} % Для записи алгоритмов в псевдокоде
\usepackage{algorithm}
\usepackage{verbatim} % Для вставок заранее подготовленного текста в режиме as-is
\usepackage{listings}
\usepackage{array}
\usepackage[numbers]{natbib}
\newcommand{\citeappendix}[2]{[\citenum{#1}, #2]}
\usepackage{commath}
\newcommand\Tau{\mathcal{T}}
\newcommand{\R}{\mathbb{R}}
\usepackage{color}
\usepackage[colorinlistoftodos, prependcaption]{todonotes}
\usepackage{multirow}
\newcommand*{\MyIndent}{\hspace*{0.2cm}}%
\usepackage{commath}
\newcommand\Tau{\mathcal{T}}
\newcommand{\R}{\mathbb{R}}
\usepackage{color}
\usepackage[colorinlistoftodos, prependcaption]{todonotes}
\usepackage{multirow}
\newcommand*{\MyIndent}{\hspace*{0.2cm}}%
\Chair{Кафедра автоматизации систем вычислительных комплексов}
\Lab{~}
\Year{2025}
\Month{Май}
\City{Москва}
\AuthorText{Автор}
\Author{Сенюшкина Алина Константиновна}
\AuthorEng{}
\AcadGroup{421}
\TitleTop{Подход на основе линейного программирования}
\TitleMiddle{к минимизации пикового использования ресурса}
\TitleBottom{в однопроцессорных системах} % leave empty if you don't need it
\TitleTopEng{}
\TitleBottomEng{} % leave empty if you don't need it
%\docname{Курсовая работа}
\docname{Выпускная квалификационная работа}
%\docname{Магистерская диссертация}
\Advisor{Балашов Василий Викторович}
\AdvisorDegree{к.ф.-м.н., с.н.с.}
\Abstract{В работе предложено решение задачи построения однопроцессорного
расписания с минимизацией пикового использования ресурса при помощи
целочисленного линейного программирования (ЦЛП). Задача построения расписания сведена к задаче ЦЛП. Разработан транслятор
набора входных данных исходной задачи в описание задачи ЦЛП на входном
языке решателей «lp». На основе сравнения производительности выбран решатель ЦЛП -- SCIP. Выполнено экспериментальное исследование
масштабируемости предложенного подхода, в ходе которого выявлена значительная зависимость времени работы решателя ЦЛП от упорядочения вершин и ребер графа работ.}
%%%% DON'T change this. It is here because .sty does not support cyrillic cp properly %%%%
\University{Московский государственный университет имени М.В.Ломоносова}
\Faculty{Факультет вычислительной математики и кибернетики}
\GrText{гр.}
\AdvisorText{Научный руководитель}
\AbstractText{Аннотация}
\begin{document}
\fixmargins
\makepreliminarypages
\oneandhalfspace
\tableofcontents
\include{template-cmc/0_vvedenie}
\include{template-cmc/1_cel_zadachi}
\include{template-cmc/2_problem_statement}
\include{template-cmc/3_reduce_description}
\include{template-cmc/4_solvers}
\include{template-cmc/5_alg_description}
\include{template-cmc/7_experiments}
\include{template-cmc/9_zakluch}
\bibliographystyle{gost71u}
\bibliography{references}
% \include{Appendix}
\end{document}
Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

+105
View File
@@ -0,0 +1,105 @@
@article{SHUTKOV,
author = {{Г.А. Шутков}},
title = {Алгоритм построения расписания для минимизации пикового использования ресурса в однопроцессорной системе},
journal = {Выпускная квалификационная работа},
year = {2023. --- С. 41}
}
@article{BALASHOV,
author = {{В.В. Балашов, А.В. Абрамов, А.А. Чупахин и др.}},
title = {Муравьиный алгоритм
для построения однопроцессорного расписания с минимизацией пикового
использования ресурса},
journal = {Дискретный анализ и исследование операций},
year = {2024. --- Т. 31, № 2. --- С. 5--26}
}
@book{SHEV,
author = {{В.Н. Шевченко, Н.Ю. Золотых}},
title = {Линейное и целочисленное линейное
программирование},
publisher = {Изд-во Нижегородского государственного
университета им. Н.И. Лобачевского},
year = {2004. --- С. 154}
}
@book{BAKER,
author = {{K.R. Baker, D. Trietsch}},
title = {Principles of Sequencing and Scheduling},
publisher = {John Wiley and Sons.},
year = {2009},
pages = {510},
}
@article{MANNE,
author = {{A.S. Manne}},
title = {On the Job-Shop Scheduling Problem},
journal = {Operations Research},
year = {1960},
pages = {219--223},
volume = {8},
number = {2}
}
@article{COIN,
title = {COIN-OR: Computations Infrastructure for Operations Research. Projects by Category. COIN-OR, 2025. [Электронный ресурс]. URL: \url{https://www.coin-or.org/projects/} (дата обращения: 25.04.2025).},
}
@article{GLPK,
title = {GNU Linear Programming Kit. GLPK, 2025. [Электронный ресурс]. URL: \url{https://www.gnu.org/software/glpk/} (дата обращения: 25.04.2025).},
}
@article{SCIP,
title = {SCIP: Solving Constraint Integer Programs. Zuse Institute Berlin, 2025. [Электронный ресурс]. URL: \url{https://scipopt.org/} (дата обращения: 25.04.2025).},
}
@article{HiGHS,
title = {HiGHS: high performance software
for linear optimization. HiGHS, 2025. [Электронный ресурс]. URL: \url{https://highs.dev/} (дата обращения: 25.04.2025).},
}
@article{GAMS,
title = {GAMS: The General Algebraic Modeling Language. GAMS, 2025. [Электронный ресурс]. URL: \url{https://www.gams.com/latest/docs/S\_MAIN.html} (дата обращения: 25.04.2025).},
}
@article{GUROBI,
title = {Gurobi optimizer. Gurobi optimization, 2025. [Электронный ресурс]. URL: \url{https://www.gurobi.com/solutions/gurobi-optimizer/} (дата обращения: 25.04.2025).},
}
@article{GITHUB,
title = {Программная реализация разработанного подхода. [Электронный ресурс]. URL: \url{https://github.com/AlinaSeny/single_proc_scheduling} (дата обращения: 18.05.2025).},
}
@book{GARYJONSON,
author = {{М. Гэри, Д. Джонсон}},
title = {Вычислительные машины и труднорешаемые задачи},
publisher = {М.: Мир.},
year = {1982. --- С. 419}
}
@article{ABDEL,
author = {{H.M. Abdel-Wahab}},
title = {Scheduling with applications to register allocation and deadlock problems},
journal = {Ph. D. Thesis},
year = {1976},
organization = {University of Waterloo},
pages = {440},
}
@article{SETHI,
author = {{R. Sethi}},
title = {Complete register allocation problems},
journal = {In 5th ACM symposium on theory of computing},
year = {1973},
pages = {182--195},
}
@article{CASANOVA,
author = {{H. Casanova, J. Herrmann, Y. Robert}},
title = {Computing the expected makespan of task graphs in
the presence of silent errors},
journal = {Parallel Computing},
year = {2017},
pages = {28},
}