From 099283c4d398c9ad382559882c72165e8e309078 Mon Sep 17 00:00:00 2001 From: NotXia <35894453+NotXia@users.noreply.github.com> Date: Sat, 4 May 2024 19:05:51 +0200 Subject: [PATCH] Add CDMO2 linear programming and simplex --- .../module2/cdmo2.tex | 3 + .../module2/img/lp_brewery_problem.png | Bin 0 -> 16961 bytes .../module2/img/lp_unbounded.png | Bin 0 -> 19482 bytes .../module2/sections/_lp.tex | 480 ++++++++++++++++++ 4 files changed, 483 insertions(+) create mode 100644 src/year1/combinatorial-decision-making-and-optimization/module2/img/lp_brewery_problem.png create mode 100644 src/year1/combinatorial-decision-making-and-optimization/module2/img/lp_unbounded.png create mode 100644 src/year1/combinatorial-decision-making-and-optimization/module2/sections/_lp.tex diff --git a/src/year1/combinatorial-decision-making-and-optimization/module2/cdmo2.tex b/src/year1/combinatorial-decision-making-and-optimization/module2/cdmo2.tex index d6d1190..6d58097 100644 --- a/src/year1/combinatorial-decision-making-and-optimization/module2/cdmo2.tex +++ b/src/year1/combinatorial-decision-making-and-optimization/module2/cdmo2.tex @@ -5,11 +5,14 @@ \def\lastupdate{{PLACEHOLDER-LAST-UPDATE}} \def\calT{\mathcal{T}} +\def\calB{\mathcal{B}} +\def\calN{\mathcal{N}} \begin{document} \makenotesfront \input{./sections/_smt.tex} + \input{./sections/_lp.tex} \end{document} \ No newline at end of file diff --git a/src/year1/combinatorial-decision-making-and-optimization/module2/img/lp_brewery_problem.png b/src/year1/combinatorial-decision-making-and-optimization/module2/img/lp_brewery_problem.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8640dcf0c59e98ea2b4d7ee39a08f30fa900cc GIT binary patch literal 16961 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%0D;|v+`nf$7?T%?tm#9 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 0$. + \begin{remark} + A non-degenerate BFS is represented by a unique basis. + \end{remark} + \end{description} + + \begin{remark} + The simplex algorithm iteratively moves through basic feasible solutions $\tilde{\vec{x}}_1, \tilde{\vec{x}}_2, \dots$ + such that $\vec{c}\tilde{\vec{x}}_k \geq \vec{c}\tilde{\vec{x}}_{k-1}$. + \end{remark} +\end{description} + + +\subsection{Tableau} +\marginnote{Tableau} + +Tabular representation to describe the steps of the simplex algorithm. +A variable $Z$ is introduced to represent the value of the objective function (which can be seen as a conversion of the objective function into a constraint). + +The tableau of an LP problem in standard form is divided into three sections: +\begin{enumerate} + \item Objective function, where the coefficients of the variables are called reduced costs\marginnote{Reduced costs}. + \item Equality constraints. + \item Variable constraints. +\end{enumerate} + +\begin{example}[Brewery problem] + In standard form, the brewery problem is defined as: + \begin{center} + \begin{tabular}{lccccccccccc} + $\max$ & $13A$ & $+$ & $23B$ \\ + subj. to & $5A$ & $+$ & $15B$ & $+$ & $S_C$ & & & & & $=$ & 480 \\ + & $4A$ & $+$ & $4B$ & & & $+$ & $S_H$ & & & $=$ & 160 \\ + & $35A$ & $+$ & $20B$ & & & & & $+$ & $S_M$ & $=$ & 1190 \\ + & $A$ & , & $B$ & , & $S_C$ & , & $S_H$ & , & $S_M$ & $\geq$ & 0 \\ + \end{tabular} + \end{center} + + As a tableau, assuming an initial basis $\calB = \{ S_C, S_H, S_M \}$, the problem is represented as: + \begin{center} + \begin{tabular}{cccccccccccccc} + \toprule + $13A$ & $+$ & $23B$ & & & & & & & $-$ & $Z$ & $=$ & 0 \\ + \midrule + $5A$ & $+$ & $15B$ & $+$ & $S_C$ & & & & & & & $=$ & 480 \\ + $4A$ & $+$ & $4B$ & & & $+$ & $S_H$ & & & & & $=$ & 160 \\ + $35A$ & $+$ & $20B$ & & & & & $+$ & $S_M$ & & & $=$ & 1190 \\ + \midrule + $A$ & , & $B$ & , & $S_C$ & , & $S_H$ & , & $S_M$ & & & $\geq$ & 0 \\ + \bottomrule + \end{tabular} + \end{center} + The reduced costs are $\{ 13, 23, 0, 0, 0 \}$. +\end{example} + + +\subsection{Pivoting} + +Given a basis $\calB$, it is possible to insert a new variable $x^\text{in} \notin \calB$ into it and remove an old one $x^\text{out} \in \calB$ +to increase (or leave unchanged) the objective function: + +\begin{descriptionlist} + \item[Entering variable] \marginnote{Entering variable} + $x^\text{in}$ should be the variable in $\calN$ with the highest improvement on the objective function. + + \item[Leaving variable] \marginnote{Leaving variable} + $x^\text{out}$ should be chosen to ensure that the new basis $\calB' = \calB \cup \{ x^\text{in} \} \smallsetminus \{ x^\text{out} \}$ + is still a feasible basis. + + \begin{description} + \item[Minimum ratio rule] \marginnote{Minimum ratio rule} + For each constraint $i$ (i.e. $i$-th row of the system $\matr{A}\vec{x} = \vec{b}$), it is possible to compute the ratio: + \[ \frac{\vec{b}_i}{\vec{\alpha}_i^\text{in}} \] + where: + \begin{itemize} + \item $\vec{\alpha}_i^\text{in}$ is the coefficient associated to the entering variable $x^\text{in}$ in the $i$-th constraint. + \item $\vec{b}_i$ is the known term of the $i$-th constraint. + \end{itemize} + + The index $i$ of the leaving variable $x^\text{out} = \calB_i$ is determined as: + \[ \arg\min_i \frac{\vec{b}_i}{\vec{\alpha}_i^\text{in}} \] + \end{description} +\end{descriptionlist} + +Once $x^\text{in}$ and $x^\text{out} = \calB_i$ has been determined, +$x^\text{in}$ is isolated in the equation of the $i$-th constraint and it is substituted in all the others. + +\begin{example}[Brewery problem] + The initial tableau of the brewery problem with $\calB = \{ S_C, S_H, S_M \}$ and $\calN = \{ A, B \}$ is: + \begin{center} + \begin{tabular}{cccccccccccccc} + \toprule + $13A$ & $+$ & $23B$ & & & & & & & $-$ & $Z$ & $=$ & 0 \\ + \midrule + $5A$ & $+$ & $15B$ & $+$ & $S_C$ & & & & & & & $=$ & 480 \\ + $4A$ & $+$ & $4B$ & & & $+$ & $S_H$ & & & & & $=$ & 160 \\ + $35A$ & $+$ & $20B$ & & & & & $+$ & $S_M$ & & & $=$ & 1190 \\ + \midrule + $A$ & , & $B$ & , & $S_C$ & , & $S_H$ & , & $S_M$ & & & $\geq$ & 0 \\ + \bottomrule + \end{tabular} + \end{center} + + \begin{enumerate} + \item + It can be easily seen that $x^\text{in} = B$ should be the entering variable. + + For the leaving variable, the ratios are: + \[ \arg\min \left\{ \frac{480}{15}, \frac{160}{4}, \frac{1190}{20} \right\} = \arg\min \left\{ 32, 40, 59.5 \right\} = 1 \] + Therefore, the leaving variable is $x^\text{out} = \calB_1 = S_C$. + + We now isolate $B$ from the first constraint: + \[ + \begin{split} + 5A + 15B + S_C = 480 &\iff \frac{1}{3}A + B + \frac{1}{15}S_C = 32 \\ + &\iff B = 32 - \frac{1}{3}A - \frac{1}{15}S_C \\ + \end{split} + \] + + The tableau with $\calB' = \{ B, S_H, S_M \}$ and $\calN' = \{ A, S_C \}$ is updated as: + \begin{center} + \begin{tabular}{cccccccccccccc} + \toprule + $\frac{16}{3}A$ & & & $-$ & $\frac{23}{15}S_C$ & & & & & $-$ & $Z$ & $=$ & $-736$ \\ + \midrule + $\frac{1}{3}A$ & $+$ & $B$ & $+$ & $\frac{1}{15}S_C$ & & & & & & & $=$ & $32$ \\ + $\frac{8}{3}A$ & & & $-$ & $\frac{4}{15}S_C$ & $+$ & $S_H$ & & & & & $=$ & $32$ \\ + $\frac{85}{3}A$ & & & $-$ & $\frac{4}{3}S_C$ & & & $+$ & $S_M$ & & & $=$ & $550$ \\ + \midrule + $A$ & , & $B$ & , & $S_C$ & , & $S_H$ & , & $S_M$ & & & $\geq$ & 0 \\ + \bottomrule + \end{tabular} + \end{center} + + \item + Now, $x^\text{in} = A$ is the variable that increases the objective function the most. + + For the leaving variable, the ratios are: + \[ \arg\min \left\{ \frac{32}{1/3}, \frac{32}{8/3}, \frac{550}{85/3} \right\} = 2 \] + Therefore, the leaving variable is $x^\text{out} = \calB'_2 = S_H$. + + $A$ isolated in the second constraint brings to: + \[ + \begin{split} + A = \frac{3}{8} (32 + \frac{4}{15}S_C - S_H) \,\iff\, A = 12 + \frac{1}{10}S_C - \frac{3}{8}S_H + \end{split} + \] + + The tableau with $\calB'' = \{ A, B, S_M \}$ and $\calN'' = \{ S_C, S_H \}$ is updated as: + \begin{center} + \begin{tabular}{cccccccccccccc} + \toprule + & & & $-$ & $S_C$ & $-$ & $2S_H$ & & & $-$ & $Z$ & $=$ & $-800$ \\ + \midrule + & & $B$ & $+$ & $\frac{1}{10}S_C$ & $+$ & $\frac{1}{8}S_H$ & & & & & $=$ & $28$ \\ + $A$ & & & $-$ & $\frac{1}{10}S_C$ & $+$ & $\frac{3}{8}S_H$ & & & & & $=$ & $12$ \\ + & & & $-$ & $\frac{25}{6}S_C$ & $-$ & $\frac{85}{8}S_H$ & $+$ & $S_M$ & & & $=$ & $210$ \\ + \midrule + $A$ & , & $B$ & , & $S_C$ & , & $S_H$ & , & $S_M$ & & & $\geq$ & 0 \\ + \bottomrule + \end{tabular} + \end{center} + + We cannot continue anymore as the reduced costs $\{ 0, 0, -1, -2, 0 \}$ are $\leq 0$ (i.e. cannot improve the objective function anymore). + \end{enumerate} +\end{example} + + +\subsection{Optimality} +\marginnote{Optimality} + +When any substitution worsens the objective function, the current assignment is optimal. +In the tableau, this happens when all the reduced costs are $\leq 0$. + +\begin{remark} + For any optimal solution, there is at least a basis such that the reduced costs are $\leq 0$. + Therefore, this is a sufficient condition. +\end{remark} + +\begin{remark} + The fact that reduced costs are $\leq 0$ is not a necessary condition. +\end{remark} + +\begin{example}[Brewery problem] + The tableau at the last iteration, with $\calB'' = \{ A, B, S_M \}$ and $\calN'' = \{ S_C, S_H \}$, is the following: + \begin{center} + \begin{tabular}{cccccccccccccc} + \toprule + & & & $-$ & $S_C$ & $-$ & $2S_H$ & & & $-$ & $Z$ & $=$ & $-800$ \\ + \midrule + & & $B$ & $+$ & $\frac{1}{10}S_C$ & $+$ & $\frac{1}{8}S_H$ & & & & & $=$ & $28$ \\ + $A$ & & & $-$ & $\frac{1}{10}S_C$ & $+$ & $\frac{3}{8}S_H$ & & & & & $=$ & $12$ \\ + & & & $-$ & $\frac{25}{6}S_C$ & $-$ & $\frac{85}{8}S_H$ & $+$ & $S_M$ & & & $=$ & $210$ \\ + \midrule + $A$ & , & $B$ & , & $S_C$ & , & $S_H$ & , & $S_M$ & & & $\geq$ & 0 \\ + \bottomrule + \end{tabular} + \end{center} + + All reduced costs are $\leq 0$ and an optimal solution has been reached: + \begin{itemize} + \item $S_C = 0$ and $S_H = 0$ (variables in $\calN''$). + \item $A = 12$, $B = 28$ and $S_M = 210$ (variables in $\calB''$. Obtained by isolating them in the constraints). + \item $- S_C - 2S_H - Z = -800 \iff Z = 800 - S_C - 2S_H \iff Z = 800$ (objective function). + \end{itemize} +\end{example} + +\begin{remark} + The points in the feasible region of a problem $\mathcal{P}$ are: + \[ \mathcal{F}_\mathcal{P} = \{ \vec{x} \in \mathbb{R}^n \mid \matr{A}\vec{x} \leq \vec{b} \land \vec{x} \geq \nullvec \} \] +\end{remark} + +\begin{description} + \item[Optimal region] \marginnote{Optimal region} + For an LP problem $\mathcal{P}$, its set of solutions is defined as: + \[ \mathcal{O}_\mathcal{P} = \{ x^* \in \mathcal{F}_\mathcal{P} \mid \forall \vec{x} \in \mathcal{F}_\mathcal{P}: \vec{c}\vec{x}^* \geq \vec{c}\vec{x} \} \] + + Trivially, it holds that $\mathcal{O}_\mathcal{P} \subseteq \mathcal{F}_\mathcal{P}$ and + $\mathcal{F}_\mathcal{P} = \varnothing \Rightarrow \mathcal{O}_\mathcal{P} = \varnothing$. + + \begin{theorem} + If $\mathcal{O}_\mathcal{P}$ is finite, then $\vert \mathcal{O}_\mathcal{P} \vert = 1$ + (therefore, if $\vert \mathcal{O}_\mathcal{P} \vert > 1$, then $\mathcal{O}_\mathcal{P}$ is infinite). + \end{theorem} +\end{description} + +\begin{description} + \item[Unbounded problem] \marginnote{Unbounded problem} + An LP problem $\mathcal{P}$ is unbounded if it does not have an optimal solution (i.e. $\mathcal{F}_\mathcal{P}$ is an unbounded polyhedron). + + With the tableau formulation, if a column has reduced cost $> 0$ and all the constraint coefficients are $\leq 0$, then the problem is unbounded. + + \begin{example} + Given the following tableau: + \begin{center} + \begin{tabular}{cccccccccccc} + \toprule + & $x$ & $-$ & $y$ & & & & & $-$ & $Z$ & $=$ & $-1$ \\ + \midrule + $-$ & $x$ & $-$ & $y$ & $+$ & $S_1$ & & & & & $=$ & $0$ \\ + $-$ & $2x$ & $-$ & $y$ & & & $+$ & $S_2$ & & & $=$ & $1$ \\ + \midrule + & $x$ & , & $y$ & , & $S_1$ & , & $S_2$ & & & $\geq$ & 0 \\ + \bottomrule + \end{tabular} + \end{center} + The unboundedness of the problem can be detected from the first column. + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\linewidth]{./img/lp_unbounded.png} + \end{figure} + \end{example} +\end{description} + + +\subsection{Algorithm} + +Given an LP problem $\mathcal{P}$ in standard form, the steps of the simplex algorithm are: +\begin{enumerate} + \item Set $k=0$, find a feasible basis $\calB_k$ and reformulate $\mathcal{P}$ according to it. + \item If the basis feasible solution is optimal, return. + \item If $\mathcal{P}$ is unbounded, return. + \item Select an entering variable $x^\text{in}$. + \item Select a leaving variable $x^\text{out}$. + \item Let $\calB_{k+1} = \calB_k \cup \{ x^\text{in} \} \smallsetminus \{ x^\text{out} \}$ and reformulate $\mathcal{P}$ according to the new basis. + \item Set $k = k + 1$ and go to Point 2. +\end{enumerate} + +\begin{description} + \item[Properties] \phantom{} + \begin{itemize} + \item If all basis feasible solutions are non-degenerate, the simplex algorithm always terminates (as the solution is always strictly improving). + \item In the general case, the algorithm might stall by ending up in a loop. + \item The worst-case time complexity is $O(2^n)$. The average case is polynomial. + \end{itemize} +\end{description} + +\begin{remark} + If the problem has lots of vertexes, the interior point method (polynomial complexity) or approximation algorithms should be preferred. +\end{remark} + + +\subsection{Two-phase method} +\marginnote{Two-phase method} + +Method that solves an LP problem by first finding an initial feasible basis $\calB_0$ and determining if the LP problem is unsatisfiable. + +Given an LP problem $\mathcal{P}$ ($\max\{ \vec{cx} \} \text{ subject to } \matr{A}\vec{x} = \vec{b}$ with $m$ constraints and $n$ variables), +the two-phase method works as follows: +\begin{descriptionlist} + \item[Phase 1] + Define a new artificial problem $\mathcal{P}'$ from $\mathcal{P}$ with new variables $s_1, \dots, s_m$ as follows: + \[ + \begin{split} + \max\left\{ -\sum_{i=1}^{m} s_i \right\} \text{ subject to } + &\sum_{j=1}^{n} a_{i,j} x_j + s_i = b_i \text{ for } i \in \{ k \in \{ 1, \dots, m \} \mid b_k \geq 0 \} \,\land \\ + &\sum_{j=1}^{n} a_{i,j} x_j - s_i = b_i \text{ for } i \in \{ k \in \{ 1, \dots, m \} \mid b_k < 0 \} \,\land \\ + & s_i, x_j \geq 0 + \end{split} + \] + + \begin{remark} + It holds that $-\sum_{i=1}^{m} s_i \leq 0$ and + $\calB' = \{ s_1, \dots, s_m \}$ is always a feasible basis corresponding to the basis feasible solution $x_j = 0$, $s_i = \vert b_i \vert$ + \end{remark} + + The problem $\mathcal{P}'$ with basis $\calB'$ can be solved through the simplex method. + + \begin{theorem} + Let $\mathcal{F}_\mathcal{P}$ be the feasible region of $\mathcal{P}$. It holds that: + \[ \mathcal{F}_\mathcal{P} \neq \varnothing \,\iff\, \sum_{i=1}^{m} s_i = 0 \] + + In other words: + \begin{itemize} + \item If the optimal solution of $\mathcal{P}'$ is $< 0$, then $\mathcal{P}$ is unsatisfiable. + \item Otherwise, the basis $\calB_{\mathcal{P}'}$ corresponding to the optimal solution of $\mathcal{P}'$ + can be used as the initial basis of $\mathcal{P}$, after removing the variables $s_i$. + \end{itemize} + \end{theorem} + + \item[Phase 2] + Solve $\mathcal{P}$ through the simplex algorithm using as initial basis $\calB_{\mathcal{P}'}$. +\end{descriptionlist} \ No newline at end of file