diff --git a/Latex/BYUPhysForDegree.cls b/Latex/BYUPhysForDegree.cls index e4984ed..cf1c9f5 100644 --- a/Latex/BYUPhysForDegree.cls +++ b/Latex/BYUPhysForDegree.cls @@ -134,6 +134,8 @@ % The title of the dean \newcommand{\DeanTitle}[1]{\gdef\@DeanTitle{#1}} +\newcommand{\anonsection}[1]{\section*{#1}\addcontentsline{toc}{section}{#1}} + % The name of the honors dean \newcommand{\HonorsDean}[1]{\gdef\@HonorsDean{#1}} diff --git a/Latex/Chapter0.tex b/Latex/Chapter0.tex index fc57376..f861be5 100644 --- a/Latex/Chapter0.tex +++ b/Latex/Chapter0.tex @@ -1,4 +1,4 @@ -\section*{Введение} +\anonsection{Введение} \label{sec:Chapter0} \index{Chapter0} % \todo[inline]{Тестовый текст} diff --git a/Latex/Chapter5.tex b/Latex/Chapter5.tex index 1ef33f9..ff7b83d 100644 --- a/Latex/Chapter5.tex +++ b/Latex/Chapter5.tex @@ -1,3 +1,3 @@ -\section*{Заключение} +\anonsection{Заключение} \label{sec:Chapter5} \index{Chapter5} \todo[inline]{Здесь надо перечислить все результаты, полученные в ходе работы. Из текста должно быть понятно, в какой мере решена поставленная задача.} diff --git a/example/0_vvedenie.tex b/example/0_vvedenie.tex new file mode 100644 index 0000000..5118af3 --- /dev/null +++ b/example/0_vvedenie.tex @@ -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}, реализована с +использованием свободно доступного решателя ЦЛП и исследована по +критерию масштабируемости. \ No newline at end of file diff --git a/example/10_bibl.tex b/example/10_bibl.tex new file mode 100644 index 0000000..5aa5e62 --- /dev/null +++ b/example/10_bibl.tex @@ -0,0 +1,44 @@ +\begin{thebibliography}{} + +\bibitem{SHUTKOV} +Алгоритм построения расписания для минимизации пикового использования ресурса в однопроцессорной системе~/ Шутков\;Г.\;А.~// Выпускная квалификационная работа. – Факультет ВМК МГУ им. М.В. Ломоносова. – 2023. – 41 с. + +\bibitem{BALASHOV} +\textbf{Балашов\;В.\;В., Абрамов \;А.\;В., Чупахин \;А.\;А. и др.} Муравьиный алгоритм +для построения однопроцессорного расписания с минимизацией пикового +использования ресурса~// Дискретный анализ и исследование операций. – +2024. – Т. 31, №2. – С. 5–26. + +\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. 219–223. + +\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} \ No newline at end of file diff --git a/example/1_cel_zadachi.tex b/example/1_cel_zadachi.tex new file mode 100644 index 0000000..f119ab6 --- /dev/null +++ b/example/1_cel_zadachi.tex @@ -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} \ No newline at end of file diff --git a/example/2_problem_statement.tex b/example/2_problem_statement.tex new file mode 100644 index 0000000..9d7c443 --- /dev/null +++ b/example/2_problem_statement.tex @@ -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-трудной. \ No newline at end of file diff --git a/example/3_reduce_description.tex b/example/3_reduce_description.tex new file mode 100644 index 0000000..6b97519 --- /dev/null +++ b/example/3_reduce_description.tex @@ -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$-ой вершины. diff --git a/example/4_solvers.tex b/example/4_solvers.tex new file mode 100644 index 0000000..aac6ea7 --- /dev/null +++ b/example/4_solvers.tex @@ -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 оказался лучшим по скорости решения задач, поэтому дальнейшие эксперименты проводились на нем. При этом целесообразно запускать решатель с разными упорядочениями и как наличием, так и отсутствием добавленных транзитивных ребер в графе. \ No newline at end of file diff --git a/example/5_alg_description.tex b/example/5_alg_description.tex new file mode 100644 index 0000000..cfb447d --- /dev/null +++ b/example/5_alg_description.tex @@ -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} \ No newline at end of file diff --git a/example/7_experiments.tex b/example/7_experiments.tex new file mode 100644 index 0000000..edbe47a --- /dev/null +++ b/example/7_experiments.tex @@ -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\% от оптимального по значению целевой функции. diff --git a/example/9_zakluch.tex b/example/9_zakluch.tex new file mode 100644 index 0000000..9bd086c --- /dev/null +++ b/example/9_zakluch.tex @@ -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} + +В качестве перспектив развития предложенного метода можно рассматривать исследование зависимости времени работы решателя ЦЛП от упорядочения вершин и ребер графа работ с целью поиска схем упорядочения, позволяющих систематически сократить время работы решателя. \ No newline at end of file diff --git a/example/BYUPhysForDegree.cls b/example/BYUPhysForDegree.cls new file mode 100644 index 0000000..51c48eb --- /dev/null +++ b/example/BYUPhysForDegree.cls @@ -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 +% } + + diff --git a/example/gost71u.bst b/example/gost71u.bst new file mode 100644 index 0000000..fca45ea --- /dev/null +++ b/example/gost71u.bst @@ -0,0 +1,1428 @@ +%% +%% This is file `utf8gost780u.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% utf8gost.dtx (with options: `utf8gost780u') +%% +%% Copyright 1996-2005 Maksym Polyakov. +%% Version 2005.08.12 +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.2 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.2 or later is part of all distributions of LaTeX +%% version 1999/12/01 or later. +%% +%% Please, send bug reports via e-mail: +%% polyama at auburn dot edu +%% +%% 2005.08.12 Bug fix (long annote) +%% +%% 2003.06.06 contributions by Konstantin Vorontsov: +%% New ENTRY "annote" added for output annotations. +%% New commands BibUrl, BibAnnote added for customize urls and annotations. +%% +%% 2003.08.10 +%% New command BibEmph added for customize emphasizing. +%% +%% 2003.10.07 +%% Some bug fixes in names and date formatting. +%% +%% 2003.10.07 +%% Bug fix in INPROCEEDINGS. +%% +%% +%% This bibliography style attempts +%% to format bibliography according to +%% GOST 7.1-84 and GOST 7.80-00 +%% +%% For the Ukrainian|Russian bibliographic entries +%% you need to create field +%% language = {ukrainian|russian}. +%% Default language is English. +%% Field numpages for books must contain number of pages. +%% Optional field url will format url (using hyperref, if loaded). +%% +%% See examples in gost71.pdf and gost780.pdf +%% +%% Requires 8-bit bibtex with switch -B and csf file supporting cyrillic. +%% bibtex8 -B -c .csf +%% + +ENTRY + { address + annote + author + booktitle + bookauthor + chapter + edition + editor + compiler + howpublished + institution + journal + key + month + note + number + organization + pages + numpages + publisher + school + series + title + type + volume + year + language + booklanguage + url + } + {} + { label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block +after.dblslash after.slash after.column after.semicolumn} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.dblslash := + #5 'after.slash := + #6 'after.column := + #7 'after.semicolumn := +} + +STRINGS { s t } + +STRINGS { curlanguage } + +FUNCTION {change.language} +{ booklanguage empty$ + {""} + {booklanguage 'curlanguage := + "\selectlanguageifdefined{" + curlanguage * + "}" * + } + if$ +} + +FUNCTION {output.nonnull} +%%%{ 's := +{ swap$ + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + " " "--- " * write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { output.state after.dblslash = + { "~//" * change.language * " " * write$ } + { output.state after.slash = + { "~/ " * write$ } + { output.state after.column = + { ": " * write$ } + { output.state after.semicolumn = + { "; " * write$ } + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ +%%% s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.dblslash} +{ output.state before.all = + 'skip$ + { after.dblslash 'output.state := } + if$ +} + +FUNCTION {new.slash} +{ output.state before.all = + 'skip$ + { after.slash 'output.state := } + if$ +} + +FUNCTION {new.column} +{ output.state before.all = + 'skip$ + { after.column 'output.state := } + if$ +} + +FUNCTION {new.semicolumn} +{ output.state before.all = + 'skip$ + { after.semicolumn 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {non.stop} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\BibEmph{" swap$ * "}" * } + if$ +} + +FUNCTION {space.word} +{ " " swap$ * " " * } + +FUNCTION {bbl.edby} % { "\bbledby{}" } +{ curlanguage "english" = + {"Ed. by "} + { curlanguage "ukrainian" = + {"{Під ред. }"} + { curlanguage "russian" = + {"{Под ред. }"} + {"language is not defined: " language "edited by" * * warning$ "edited by"} + if$} + if$} + if$ +} + +FUNCTION {bbl.cmplr} +{ curlanguage "english" = + {"Compiler "} + { curlanguage "ukrainian" = + {"{Укл. }"} + { curlanguage "russian" = + {"{Сост. }"} + {"language is not defined: " language "compiler" * * warning$ "compiler"} + if$} + if$} + if$ +} + +FUNCTION {bbl.edition} % { "\bbledition{}" } +{ curlanguage "english" = + {"edition"} + { curlanguage "ukrainian" = + {"{вид.}"} + { curlanguage "russian" = + {"{изд.}"} + {"language is not defined: " language "edition" * * warning$ "edition"} + if$} + if$} + if$ +} + +FUNCTION {bbl.vvolume} % { "\bblVolume{}" } +{ curlanguage "english" = + {"Volume"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"Том"} + {"language is not defined: " language "Volume" * * warning$ "Volume"} + if$} + if$ +} + +FUNCTION {bbl.vvol} % { "\bblVol{}" } +{ curlanguage "english" = + {"Vol."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"Т."} + {"language is not defined: " language "Vol." * * warning$ "Vol."} + if$} + if$ +} + +FUNCTION {bbl.iissue} % { "\bblIssue{}" } +{ curlanguage "english" = + {"Issue"} + { curlanguage "ukrainian" = + {"Випуск"} + { curlanguage "russian" = + {"Выпуск"} + {"language is not defined: " language * warning$ "Issue"} + if$} + if$} + if$ +} + +FUNCTION {bbl.iiss} % { "\bblIss{}" } +{ curlanguage "english" = + {"Iss."} + { curlanguage "ukrainian" = + {"Вип."} + { curlanguage "russian" = + {"Вып."} + {"language is not defined: " language * warning$ "Issue"} + if$} + if$} + if$ +} + +FUNCTION {bbl.of} % { "\bblof{}" } +{ curlanguage "english" = + {"of"} + { curlanguage "ukrainian" = + {"{із}"} + { curlanguage "russian" = + {"{из}"} + {"language is not defined: " language "of" * * warning$ "of"} + if$} + if$} + if$ +} + +FUNCTION {bbl.etal} % { "\bblof{}" } +{ curlanguage "english" = + {"et~al."} + { curlanguage "ukrainian" = + {"{та~ін.}"} + { curlanguage "russian" = + {"{и~др.}"} + {"language is not defined: " language "at al" * * warning$ "at al."} + if$} + if$} + if$ +} + +FUNCTION {bbl.nnumber} % { "\bblNumber{}" } +{ curlanguage "english" = + {"Number"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"Номер"} + {"language is not defined: " language "Number" * * warning$ "Number"} + if$} + if$ +} + +FUNCTION {bbl.number} % { "\bblnumber{}" } +{ curlanguage "english" = + {"number"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{номер}"} + {"language is not defined: " language "number" * * warning$ "number"} + if$} + if$ +} + +FUNCTION {bbl.nr} % { "\bblno{}" } +{ curlanguage "english" = + {"no."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{№}"} + {"language is not defined: " language "no." * * warning$ "no."} + if$} + if$ +} + +FUNCTION {bbl.nnr} % { "\bblno{}" } +{ curlanguage "english" = + {"No."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{№}"} + {"language is not defined: " language "No." * * warning$ "No."} + if$} + if$ +} + +FUNCTION {bbl.in} % { "\bblin{}" } +{ curlanguage "english" = + {"in"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{в}"} + {"language is not defined: " language "in" * * warning$ "in"} + if$} + if$ +} + +FUNCTION {bbl.iin} % { "\bblIn{}" } +{ curlanguage "english" = + {"In"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"В"} + {"language is not defined: " language "In" * * warning$ "In"} + if$} + if$ +} + +FUNCTION {bbl.pages} % { "\bblpp." } +{ curlanguage "english" = + {"pp."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{с.}"} + {"language is not defined: " language "pp." * * warning$ "pp."} + if$} + if$ +} + +FUNCTION {bbl.page} % { "\bblp." +{ curlanguage "english" = + {"p."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{с.}"} + {"language is not defined: " language "p." * * warning$ "p."} + if$} + if$ +} + +FUNCTION {bbl.ppages}% { "\bblPp." } +{ curlanguage "english" = + {"Pp."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{С.}"} + {"language is not defined: " language "Pp." * * warning$ "Pp."} + if$} + if$ +} + +FUNCTION {bbl.ppage} % { "\bblP." } +{ curlanguage "english" = + {"P."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{С.}"} + {"language is not defined: " language "P." * * warning$ "P."} + if$} + if$ +} + + +FUNCTION {bbl.techrep} { "Tech. Rep." } +FUNCTION {bbl.mthesis} { "Master's thesis" } +FUNCTION {bbl.phdthesis} { "Ph.D. thesis" } + +INTEGERS { nameptr namesleft numnames } + + +FUNCTION {format.names} +{ + #1 "{vv~}{ll}{~jj}{,~ff}" format.name$ +} + + +FUNCTION {format.names.rev} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ff}{~vv}{~ll}{, jj}" + format.name$ 't := + nameptr #1 > + { + nameptr #4 = + numnames #4 > and + { "others" 't := + #1 'namesleft := } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + t "others" = + t "~others" = + or + { " " * bbl.etal * } + { ", " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names emphasize} + if$ +} + +FUNCTION {format.bookauthors} +{ bookauthor empty$ + { "" } + { bookauthor format.names} + if$ +} + +FUNCTION {format.authors.after} +{ author empty$ + { "" } + { author format.names.rev} + if$ +} + +FUNCTION {format.bookauthors.after} +{ bookauthor empty$ + { "" } + { bookauthor format.names.rev} + if$ +} + +FUNCTION {format.editors.after} +{ editor empty$ + { "" } + { bbl.edby editor format.names.rev * + } + if$ +} + +FUNCTION {format.compiler.after} +{ compiler empty$ + { "" } + { bbl.cmplr compiler format.names.rev * + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title + } + if$ +} + +FUNCTION {format.date} +{ year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + month + } + if$ + } + { month empty$ + 'year + { year ". " "--- " month * * * } + if$ + } + if$ +} + +FUNCTION {output.address.publisher.date} +{ + address empty$ + 'skip$ + { address output + publisher empty$ + 'skip$ + { new.column + } + if$ + } + if$ + publisher output + format.date output +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + language empty$ + {"english" 'curlanguage :=} + {language 'curlanguage :=} + if$ + "\selectlanguageifdefined{" write$ + curlanguage write$ + "}" write$ newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.iin + " " * } + +FUNCTION {format.btitle} +{ title +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {tie.connect} + {"~" + swap$ * * + } + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.vvol volume tie.connect + series empty$ + 'skip$ + { bbl.of space.word * series emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { "there's a number but no series in " cite$ * warning$ + bbl.nnr } + { + %new.dblslash + new.sentence + series + bbl.nr + tie.or.space.connect} + if$ + number tie.or.space.connect + } + if$ + } + { "" } + if$ +} + +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + + +FUNCTION {convert.edition} +{ edition +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { convert.edition " " * bbl.edition * } + { convert.edition " " * bbl.edition * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { bbl.ppages pages n.dashify tie.connect } + { bbl.ppage pages tie.connect } + if$ + } + if$ +} + +FUNCTION {format.pages.page} +{ pages empty$ + { numpages empty$ + { "" } + { numpages bbl.pages tie.connect } + if$} + { format.pages} + if$ +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + number empty$ + 'skip$ + { + ", no." number tie.or.space.connect * + volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ": " * pages n.dashify * } + if$ + } + if$ +} + +FUNCTION {format.volume} +{ volume empty$ + { "" } + { bbl.vvol volume tie.or.space.connect } + if$ +} + +FUNCTION {format.number} +{ number empty$ + { "" } + { bbl.nr number tie.or.space.connect } + if$ +} + + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { bbl.techrep } + 'type + if$ + number empty$ + { "" } + { number tie.or.space.connect } + if$ +} + +FUNCTION {author.before} +{ + author empty$ + 'skip$ + {author num.names$ #4 < + {format.authors output + new.sentence} + 'skip$ + if$} + if$ +} + +FUNCTION {bookauthor.before} +{ + bookauthor empty$ + 'skip$ + {bookauthor num.names$ #4 < + {format.bookauthors output + new.sentence} + 'skip$ + if$} + if$ +} + + +FUNCTION {author.after} +{ + author empty$ + 'skip$ + {format.authors.after output + new.semicolumn } + if$ +} +FUNCTION {bookauthor.after} +{ + bookauthor empty$ + 'skip$ + {format.bookauthors.after output + new.semicolumn } + if$ +} + +FUNCTION {editor.organization.after} +{ + compiler empty$ + {} + { format.compiler.after output + new.semicolumn + } + if$ + editor empty$ + {} + { format.editors.after output + new.semicolumn + } + if$ + organization empty$ + {} + {organization output + new.semicolumn + } + if$ +} + +FUNCTION {format.url} +{ url empty$ + { "" } + { after.sentence 'output.state := + "\BibUrl{ " url * "}" * + } + if$ +} + +FUNCTION {format.annote} +{ annote empty$ + { "" } +{ after.sentence 'output.state := + "\BibAnnote{" annote add.period$ * "}" * +} + if$ +} + +FUNCTION {article} +{ output.bibitem + % author.before + format.btitle "title" output.check + new.slash + author.after + new.dblslash + journal emphasize "journal" output.check + new.block + format.date output + new.block + format.volume output + format.number output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + % author.before + format.btitle "title" output.check + new.slash + author.after + editor.organization.after + new.sentence + format.number.series output + new.block + format.edition output + new.block + output.address.publisher.date + new.block + format.bvolume output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + author.before + format.title "title" output.check + new.slash + author.after + editor.organization.after + new.block + howpublished output + address output + format.date output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author.before + format.btitle "title" output.check + new.slash + author.after + new.dblslash + bookauthor.before + booktitle "booktitle" output.check + new.slash + bookauthor.after + editor.organization.after + new.block + format.edition output + new.block + format.number.series output + new.sentence + output.address.publisher.date + new.block + format.bvolume output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + author.before + new.sentence + format.btitle "title" output.check + new.slash + author.after + new.dblslash + booktitle "booktitle" output.check + new.slash + editor.organization.after + new.block + output.address.publisher.date + new.block + format.bvolume output + format.number.series output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + % author.before + new.sentence + format.title "title" output.check + new.slash + author.after + new.dblslash + booktitle "booktitle" output.check + new.slash + editor.organization.after + new.block + format.bvolume output + format.number.series output + new.block + address empty$ + { publisher output + format.date "year" output.check + } + { address output.nonnull + new.column + publisher output + format.date "year" output.check + } + if$ + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull + address output + } + if$ + } + { format.authors output.nonnull } + if$ + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { + address new.block.checka + address output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization output + address output + } + if$ + format.edition output + format.date output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check + new.block + note output + new.block + format.url output + format.annote output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + title howpublished new.sentence.checkb + format.btitle output + howpublished new.block.checka + howpublished output + new.block + format.date output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.sentence + format.btitle "title" output.check + new.column + bbl.phdthesis format.thesis.type output.nonnull + new.slash + school "school" output.check + new.block + output.address.publisher.date + new.block + format.pages.page output + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.btitle "title" output.check + new.slash + editor.organization.after + new.block + format.bvolume output + format.number.series output + address empty$ + { publisher output + format.date "year" output.check + } + { address output.nonnull + format.date "year" output.check + new.sentence + publisher output + } + if$ + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + author.before + new.sentence + format.title "title" output.check + new.column + format.tr.number output.nonnull + new.slash + author.after + editor.organization.after + new.block + address output + new.column + institution "institution" output.check + format.date "year" output.check + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + author.before + format.btitle "title" output.check + new.slash + author.after + editor.organization.after + new.block + note "note" output.check + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"\bbljan{}"} + +MACRO {feb} {"\bblfeb{}"} + +MACRO {mar} {"\bblmar{}"} + +MACRO {apr} {"\bblapr{}"} + +MACRO {may} {"\bblmay{}"} + +MACRO {jun} {"\bbljun{}"} + +MACRO {jul} {"\bbljul{}"} + +MACRO {aug} {"\bblaug{}"} + +MACRO {sep} {"\bblsep{}"} + +MACRO {oct} {"\bbloct{}"} + +MACRO {nov} {"\bblnov{}"} + +MACRO {dec} {"\bbldec{}"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ "\begin{thebibliography}{" longest.label * "}" * write$ newline$ + "\def\selectlanguageifdefined#1{" write$ newline$ + "\expandafter\ifx\csname date#1\endcsname\relax" write$ newline$ + "\else\language\csname l@#1\endcsname\fi}" write$ newline$ + "\ifx\undefined\url\def\url#1{{\small #1}}\else\fi" write$ newline$ + "\ifx\undefined\BibUrl\def\BibUrl#1{\url{#1}}\else\fi" write$ newline$ + "\ifx\undefined\BibAnnote\long\def\BibAnnote#1{}\else\fi" write$ newline$ + "\ifx\undefined\BibEmph\def\BibEmph#1{\emph{#1}}\else\fi" write$ newline$ + preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +%% +%% End of file `utf8gost780u.bst'. diff --git a/example/gzlogo.png b/example/gzlogo.png new file mode 100644 index 0000000..f195517 Binary files /dev/null and b/example/gzlogo.png differ diff --git a/example/main.tex b/example/main.tex new file mode 100644 index 0000000..1d4a7b8 --- /dev/null +++ b/example/main.tex @@ -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} diff --git a/example/pictures/dagpie.png b/example/pictures/dagpie.png new file mode 100644 index 0000000..3a0d303 Binary files /dev/null and b/example/pictures/dagpie.png differ diff --git a/example/pictures/default60.png b/example/pictures/default60.png new file mode 100644 index 0000000..ac6521c Binary files /dev/null and b/example/pictures/default60.png differ diff --git a/example/pictures/default65.png b/example/pictures/default65.png new file mode 100644 index 0000000..d06ed3c Binary files /dev/null and b/example/pictures/default65.png differ diff --git a/example/pictures/example.png b/example/pictures/example.png new file mode 100644 index 0000000..75c4215 Binary files /dev/null and b/example/pictures/example.png differ diff --git a/example/pictures/layeredlog.png b/example/pictures/layeredlog.png new file mode 100644 index 0000000..0b21f82 Binary files /dev/null and b/example/pictures/layeredlog.png differ diff --git a/example/pictures/percents_gap.png b/example/pictures/percents_gap.png new file mode 100644 index 0000000..7bd2d34 Binary files /dev/null and b/example/pictures/percents_gap.png differ diff --git a/example/pictures/solvers_dag.png b/example/pictures/solvers_dag.png new file mode 100644 index 0000000..c127cb6 Binary files /dev/null and b/example/pictures/solvers_dag.png differ diff --git a/example/pictures/solvers_default.png b/example/pictures/solvers_default.png new file mode 100644 index 0000000..42866d8 Binary files /dev/null and b/example/pictures/solvers_default.png differ diff --git a/example/pictures/solvers_jump2.png b/example/pictures/solvers_jump2.png new file mode 100644 index 0000000..0b9f35d Binary files /dev/null and b/example/pictures/solvers_jump2.png differ diff --git a/example/pictures/solvers_jump3.png b/example/pictures/solvers_jump3.png new file mode 100644 index 0000000..950ccb4 Binary files /dev/null and b/example/pictures/solvers_jump3.png differ diff --git a/example/pictures/solvers_jump4.png b/example/pictures/solvers_jump4.png new file mode 100644 index 0000000..8bce443 Binary files /dev/null and b/example/pictures/solvers_jump4.png differ diff --git a/example/pictures/solvers_triang.png b/example/pictures/solvers_triang.png new file mode 100644 index 0000000..2048ffb Binary files /dev/null and b/example/pictures/solvers_triang.png differ diff --git a/example/pictures/sorts.png b/example/pictures/sorts.png new file mode 100644 index 0000000..23f009e Binary files /dev/null and b/example/pictures/sorts.png differ diff --git a/example/pictures/sorts_tr.png b/example/pictures/sorts_tr.png new file mode 100644 index 0000000..e8620f2 Binary files /dev/null and b/example/pictures/sorts_tr.png differ diff --git a/example/pictures/transitive_edges.png b/example/pictures/transitive_edges.png new file mode 100644 index 0000000..2c01620 Binary files /dev/null and b/example/pictures/transitive_edges.png differ diff --git a/example/pictures/trianglog.png b/example/pictures/trianglog.png new file mode 100644 index 0000000..4b1f18e Binary files /dev/null and b/example/pictures/trianglog.png differ diff --git a/example/pictures/схема_слоистого_графа.png b/example/pictures/схема_слоистого_графа.png new file mode 100644 index 0000000..4831f36 Binary files /dev/null and b/example/pictures/схема_слоистого_графа.png differ diff --git a/example/pictures/схема_случайного_графа.png b/example/pictures/схема_случайного_графа.png new file mode 100644 index 0000000..f07e7b5 Binary files /dev/null and b/example/pictures/схема_случайного_графа.png differ diff --git a/example/pictures/схема_треугольного_графа.png b/example/pictures/схема_треугольного_графа.png new file mode 100644 index 0000000..4009b88 Binary files /dev/null and b/example/pictures/схема_треугольного_графа.png differ diff --git a/example/references.bib b/example/references.bib new file mode 100644 index 0000000..4a305fd --- /dev/null +++ b/example/references.bib @@ -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}, +} \ No newline at end of file