Added "applications" section

This commit is contained in:
Mark 2022-11-21 22:01:21 -08:00
parent d8a2f8af98
commit 61b137e389
7 changed files with 905 additions and 838 deletions

View File

@ -6,59 +6,8 @@
solutions
]{ormc_handout}
\usepackage{subfiles}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{shapes.geometric}
% We put nodes in a separate layer, so we can
% slightly overlap with paths for a perfect fit
\pgfdeclarelayer{nodes}
\pgfdeclarelayer{path}
\pgfsetlayers{main,nodes}
% Layer settings
\tikzset{
% Layer hack, lets us write
% later = * in scopes.
layer/.style = {
execute at begin scope={\pgfonlayer{#1}},
execute at end scope={\endpgfonlayer}
},
%
% Arrowhead tweaks
>={Latex[ width=2mm, length=2mm ]},
label/.style = {
circle,
% For automatic red background in solutions
fill = \ORMCbgcolor,
draw = none
},
%
% Nodes
main/.style = {
draw,
circle,
fill = white
},
%
% Flow annotations
flow/.style = {
opacity = 1,
thin,
inner xsep = 2.5mm,
inner ysep = 2.5mm
},
%
% Paths
path/.style = {
line width = 4mm,
draw = black,
% Lengthen paths so they're
% completely under nodes.
line cap = rect,
opacity = 0.3
}
}
\input{tikxset}
\begin{document}
@ -69,109 +18,14 @@
{Prepared by Mark on \today}
\subfile{parts/00 review}
\subfile{parts/01 flow}
\subfile{parts/02 residual}
\subfile{parts/03 fulkerson}
\input{parts/00 review}
\input{parts/01 flow}
\input{parts/02 residual}
\input{parts/03 fulkerson}
\input{parts/04 applications}
\problem{Maximum Cardinality Matching}
A \textit{matching} is a subset of edges in a bipartite graph. Nodes in a matching must not have more than one edge connected to them. \\
A matching is \textit{maximal} if it has more edges than any other matching.
\vspace{5mm}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
Initial Graph \\
\vspace{2mm}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
\node[main] (A1) at (0mm, 24mm) {};
\node[main] (A2) at (0mm, 18mm) {};
\node[main] (A3) at (0mm, 12mm) {};
\node[main] (A4) at (0mm, 6mm) {};
\node[main] (A5) at (0mm, 0mm) {};
\node[main] (B1) at (20mm, 24mm) {};
\node[main] (B2) at (20mm, 18mm) {};
\node[main] (B3) at (20mm, 12mm) {};
\node[main] (B4) at (20mm, 6mm) {};
\node[main] (B5) at (20mm, 0mm) {};
\end{scope}
% Edges
\draw
(A1) edge (B2)
(A1) edge (B3)
(A2) edge (B1)
(A2) edge (B4)
(A4) edge (B3)
(A2) edge (B3)
(A5) edge (B3)
(A5) edge (B4)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
Maximal Matching \\
\vspace{2mm}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
\node[main] (A1) at (0mm, 24mm) {};
\node[main] (A2) at (0mm, 18mm) {};
\node[main] (A3) at (0mm, 12mm) {};
\node[main] (A4) at (0mm, 6mm) {};
\node[main] (A5) at (0mm, 0mm) {};
\node[main] (B1) at (20mm, 24mm) {};
\node[main] (B2) at (20mm, 18mm) {};
\node[main] (B3) at (20mm, 12mm) {};
\node[main] (B4) at (20mm, 6mm) {};
\node[main] (B5) at (20mm, 0mm) {};
\end{scope}
% Edges
\draw[opacity = 0.4]
(A1) edge (B2)
(A1) edge (B3)
(A2) edge (B1)
(A2) edge (B4)
(A4) edge (B3)
(A4) edge (B3)
(A5) edge (B3)
(A5) edge (B4)
;
\draw
(A1) edge (B2)
(A2) edge (B1)
(A4) edge (B3)
(A5) edge (B4)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\vspace{5mm}
Devise an algorithm to find a maximal matching in any bipartite graph. \\
Find an upper bound for its runtime.
\begin{solution}
Turn this into a maximum flow problem and use FF. \\
Connect a node $S$ to all nodes in the left group and a node $T$ to all nodes in the right group. All edges have capacity 1.
\vspace{2ex}
Just like FF, this algorithm will take at most $\min(\# \text{ left nodes}, \# \text{ right nodes})$ iterations.
\end{solution}
\end{document}

View File

@ -1,17 +1,12 @@
\documentclass[../main.tex]{subfiles}
\section{Review}
\definition{}
A \textit{graph} consists of a set of \textit{nodes} $\{A, B, ...\}$ and a set of edges $\{ (A,B), (A,C), ...\}$ connecting them.
A \textit{directed graph} is a graph where edges have direction. In such a graph, $(A, B)$ and $(B, A)$ are distinct edges.
A \textit{weighted graph} is a graph that features weights on its edges. \\
A weighted directed graph is shown below.
\begin{document}
\section{Review}
\definition{}
A \textit{graph} consists of a set of \textit{nodes} $\{A, B, ...\}$ and a set of edges $\{ (A,B), (A,C), ...\}$ connecting them.
A \textit{directed graph} is a graph where edges have direction. In such a graph, $(A, B)$ and $(B, A)$ are distinct edges.
A \textit{weighted graph} is a graph that features weights on its edges. \\
A weighted directed graph is shown below.
\begin{center}
\begin{center}
\begin{tikzpicture}[node distance = 20mm]
% Nodes
\begin{scope}
@ -28,15 +23,15 @@
(B) edge[bend right] node[label] {$1$} (A)
;
\end{tikzpicture}
\end{center}
\end{center}
\vfill
\vfill
\definition{}
We say a graph is \textit{bipartite} if its nodes can be split into two groups $L$ and $R$ so that no two nodes in the same group are connected by an edge. \\
The following graph is bipartite:
\definition{}
We say a graph is \textit{bipartite} if its nodes can be split into two groups $L$ and $R$ so that no two nodes in the same group are connected by an edge. \\
The following graph is bipartite:
\begin{center}
\begin{center}
\begin{tikzpicture}
% Nodes
\begin{scope}
@ -58,16 +53,16 @@
(C) edge (D)
;
\end{tikzpicture}
\end{center}
\end{center}
\vfill
\vfill
\definition{}
We say two nodes $A$ ane $B$ are \textit{connected} if we can reach $A$ from $B$ and $B$ from $A$ by walking along (possibly directed) edges. We say a graph is connected if all its nodes are connected to each other.\\
\definition{}
We say two nodes $A$ ane $B$ are \textit{connected} if we can reach $A$ from $B$ and $B$ from $A$ by walking along (possibly directed) edges. We say a graph is connected if all its nodes are connected to each other.\\
The bipartite graph above and the directed graph below are not connected.
The bipartite graph above and the directed graph below are not connected.
\begin{center}
\begin{center}
\begin{tikzpicture}[node distance = 20mm]
% Nodes
\begin{scope}
@ -83,9 +78,7 @@
(B) edge (C)
;
\end{tikzpicture}
\end{center}
\end{center}
\vfill
\pagebreak
\end{document}
\vfill
\pagebreak

View File

@ -1,29 +1,24 @@
\documentclass[../main.tex]{subfiles}
\section{Network Flow}
\generic{Networks}
Say have a network: a sequence of pipes, a set of cities and highways, an electrical circuit, server infrastructure, etc.
\begin{document}
\vspace{1ex}
\section{Network Flow}
We'll represent our network with a connected directed weighted graph. If we take a city, edges will be highways and cities will be nodes. There are a few conditions for a valid network graph:
\generic{Networks}
Say have a network: a sequence of pipes, a set of cities and highways, an electrical circuit, server infrastructure, etc.
\vspace{1ex}
We'll represent our network with a connected directed weighted graph. If we take a city, edges will be highways and cities will be nodes. There are a few conditions for a valid network graph:
\begin{itemize}
\begin{itemize}
\item The weight of each edge represents its capacity, the number of lanes in the highway.
\item Edge capacities are always positive integers.\hspace{-0.5ex}\footnotemark{}
\item Node $S$ is a \textit{source}: it produces flow.
\item Node $T$ is a \textit{sink}: it consumes flow.
\item All other nodes \textit{conserve} flow. In other words, the sum of flow coming in must equal the sum of flow going out.
\end{itemize}
\end{itemize}
\footnotetext{An edge with capacity zero is equivalent to an edge that does not exist; An edge with negative capacity is equivalent to an edge in the opposite direction.}
\footnotetext{An edge with capacity zero is equivalent to an edge that does not exist; An edge with negative capacity is equivalent to an edge in the opposite direction.}
Here is an example of a such a graph:
\begin{center}
Here is an example of a such a graph:
\begin{center}
\begin{tikzpicture}
% Nodes
@ -43,17 +38,17 @@
(B) edge node[label] {$1$} (T)
;
\end{tikzpicture}
\end{center}
\end{center}
\hrule{}
\hrule{}
\generic{Flow}
In our city example, cars represent \textit{flow}. Let's send one unit of cars along the topmost highway:
\generic{Flow}
In our city example, cars represent \textit{flow}. Let's send one unit of cars along the topmost highway:
\vspace{2ex}
\vspace{2ex}
\begin{minipage}{0.33\textwidth}
\begin{center}
\begin{minipage}{0.33\textwidth}
\begin{center}
\begin{tikzpicture}
% Nodes
@ -79,9 +74,9 @@
-- node[above right, flow] {$(1)$} (T)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\begin{minipage}{0.65\textwidth}
\end{center}
\end{minipage}
\begin{minipage}{0.65\textwidth}
There are a few things to notice here:
\begin{itemize}
\item Highlighted edges carry flow.
@ -90,26 +85,26 @@
\item Flow comes from $S$ and goes towards $T$.
\item Flow is conserved: all flow produced by $S$ enters $T$.
\end{itemize}
\end{minipage}
\end{minipage}
\vspace{1ex}
\vspace{1ex}
The \textit{magnitude} of a flow\footnotemark{} is the number of \say{flow-units} that go from $S$ to $T$. \\
The \textit{magnitude} of a flow\footnotemark{} is the number of \say{flow-units} that go from $S$ to $T$. \\
We are interested in the \textit{maximum flow} through this network: what is the greatest amount of flow we can push from $S$ to $T$?
We are interested in the \textit{maximum flow} through this network: what is the greatest amount of flow we can push from $S$ to $T$?
\footnotetext{you could also think of \say{flow} as a directed weighted graph on top of our network.}
\footnotetext{you could also think of \say{flow} as a directed weighted graph on top of our network.}
\problem{}
What is the magnitude of the flow above?
\problem{}
What is the magnitude of the flow above?
\vfill
\pagebreak
\vfill
\pagebreak
\problem{}
Find a flow with magnitude 2 on the graph below.
\problem{}
Find a flow with magnitude 2 on the graph below.
\begin{center}
\begin{center}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
@ -128,15 +123,15 @@
(B) edge node[label] {$1$} (T)
;
\end{tikzpicture}
\end{center}
\end{center}
\vfill
\vfill
\problem{}
Find a maximal flow on the graph below. \\
\hint{The total capacity coming out of $S$ is 3, so any flow must have magnitude $\leq 3$.}
\problem{}
Find a maximal flow on the graph below. \\
\hint{The total capacity coming out of $S$ is 3, so any flow must have magnitude $\leq 3$.}
\begin{center}
\begin{center}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
@ -155,18 +150,18 @@
(B) edge node[label] {$1$} (T)
;
\end{tikzpicture}
\end{center}
\end{center}
\vfill
\pagebreak
\vfill
\pagebreak
\section{Combining Flows}
It is fairly easy to combine two flows on a graph. All we need to do is add the flows along each edge. For example, consider the following flows:
\section{Combining Flows}
It is fairly easy to combine two flows on a graph. All we need to do is add the flows along each edge. For example, consider the following flows:
\vspace{2ex}
\vspace{2ex}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\begin{tikzpicture}
% Nodes
@ -192,11 +187,11 @@
-- node[above right, flow] {$(1)$} (T)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\begin{tikzpicture}
% Nodes
@ -224,13 +219,13 @@
-- node[above right, flow] {$(1)$} (T)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\end{center}
\end{minipage}
\vspace{1cm}
\vspace{1cm}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
Combining these, we get the following:
\vspace{2ex}
@ -262,10 +257,10 @@
-- node[above left, flow] {$(1)$} (A)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\raggedright
When adding flows, we must respect edge capacities.
@ -276,19 +271,19 @@
\vspace{1ex}
This is because the capacity of the top-right edge is 2, and $2 + 1 > 2$.
\end{minipage}
\end{minipage}
\vspace{2ex}
\hrule
\vspace{2ex}
\vspace{2ex}
\hrule
\vspace{2ex}
\problem{}
Combine the following flows and ensure that the flow along all edges remains within capacity.
\problem{}
Combine the following flows and ensure that the flow along all edges remains within capacity.
\vspace{2ex}
\vspace{2ex}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\begin{tikzpicture}[node distance = 20mm]
% Nodes
\begin{scope}[layer = nodes]
@ -319,11 +314,11 @@
-- node[above right, flow] {$(2)$} (T)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
\begin{tikzpicture}[node distance = 20mm]
% Nodes
\begin{scope}[layer = nodes]
@ -354,10 +349,8 @@
-- node[below right, flow] {$(2)$} (T)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\end{center}
\end{minipage}
\vfill
\pagebreak
\end{document}
\vfill
\pagebreak

View File

@ -1,19 +1,14 @@
\documentclass[../main.tex]{subfiles}
\section{Residual Graphs}
As our network gets bigger, finding a maximum flow by hand becomes much more difficult. It will be convenient to have an algorithm that finds a maximal flow in any network.
\vspace{1ex}
\begin{document}
The first thing we'll need to construct such an algorithm is a \textit{residual graph}.
\section{Residual Graphs}
As our network gets bigger, finding a maximum flow by hand becomes much more difficult. It will be convenient to have an algorithm that finds a maximal flow in any network.
\vspace{2ex}
\hrule
\vspace{1ex}
The first thing we'll need to construct such an algorithm is a \textit{residual graph}.
\vspace{2ex}
\hrule
\begin{center}
\begin{center}
\begin{minipage}[t]{0.48\textwidth}
We'll start with the following network and flow:
\begin{center}
@ -66,11 +61,11 @@
\end{tikzpicture}
\end{center}
\end{minipage}
\end{center}
\end{center}
\hrule
\hrule
\begin{center}
\begin{center}
\begin{minipage}[t]{0.48\textwidth}
Then, we'll add the unused capacity of \say{used} edges: (Note that $3 - 1 = 2$)
\begin{center}
@ -118,31 +113,31 @@
\end{tikzpicture}
\end{center}
This graph is the residual of the original flow.
\end{minipage}
\end{center}
\end{minipage}
\end{center}
\hrule
\vspace{3ex}
\hrule
\vspace{3ex}
You can think of the residual graph as a \say{list of possible changes} to the original flow. \\
There are two ways we can change a flow:
\begin{itemize}
You can think of the residual graph as a \say{list of possible changes} to the original flow. \\
There are two ways we can change a flow:
\begin{itemize}
\item We can add flow along a path
\item We can remove flow along another path
\end{itemize}
\end{itemize}
\vspace{1ex}
\vspace{1ex}
A residual graph captures both of these actions, showing us where we can add flow (forward edges) and where we can remove it (reverse edges). Note that \say{removing} flow along an edge is equivalent to adding flow in the opposite direction.
A residual graph captures both of these actions, showing us where we can add flow (forward edges) and where we can remove it (reverse edges). Note that \say{removing} flow along an edge is equivalent to adding flow in the opposite direction.
\vfill
\pagebreak
\vfill
\pagebreak
\problem{}<FindResidual>
Construct the residual of this flow.
\problem{}<FindResidual>
Construct the residual of this flow.
\begin{center}
\begin{center}
\begin{tikzpicture}[node distance = 25mm]
% Nodes
\begin{scope}[layer = nodes]
@ -169,9 +164,9 @@
-- node[below right, flow] {$(2)$} (T)
;
\end{tikzpicture}
\end{center}
\end{center}
\begin{solution}
\begin{solution}
\begin{center}
\begin{tikzpicture}[node distance = 25mm]
% Nodes
@ -193,27 +188,25 @@
;
\end{tikzpicture}
\end{center}
\end{solution}
\end{solution}
\vfill
\problem{}
Is the flow in \ref{FindResidual} maximal? \\
If it isn't, find a maximal flow. \\
\hint{Look at the residual graph. Can we add flow along another path?}
\vfill
\problem{}
Is the flow in \ref{FindResidual} maximal? \\
If it isn't, find a maximal flow. \\
\hint{Look at the residual graph. Can we add flow along another path?}
\vfill
\pagebreak
\vfill
\pagebreak
\problem{}
Show that...
\begin{enumerate}
\problem{}
Show that...
\begin{enumerate}
\item A maximal flow exists in every network with integral\footnotemark{} edge weights.
\item Every edge in this flow carries an integral amount of flow
\end{enumerate}
\end{enumerate}
\footnotetext{Integral = \say{integer} as an adjective.}
\footnotetext{Integral = \say{integer} as an adjective.}
\vfill
\end{document}
\vfill
\pagebreak

View File

@ -1,12 +1,8 @@
\documentclass[../main.tex]{subfiles}
\begin{document}
\section{The Ford-Fulkerson Algorithm}
We now have all the tools we need to construct an algorithm that finds a maximal flow. \\
It works as follows:
\begin{enumerate}
\section{The Ford-Fulkerson Algorithm}
We now have all the tools we need to construct an algorithm that finds a maximal flow. \\
It works as follows:
\begin{enumerate}
\item[\texttt{00}] Take a weighted directed graph $G$.
\item[\texttt{01}] Find any flow $F$ in $G$
\item[\texttt{02}] Calculate $R$, the residual of $F$.
@ -14,13 +10,13 @@
\item[\texttt{04}] Otherwise, find another flow $F_0$ in $R$.
\item[\texttt{05}] Add $F_0$ to $F$
\item[\texttt{06}] \texttt{GOTO 02}
\end{enumerate}
\end{enumerate}
\problem{}
Run the Ford-Fulkerson algorithm on the following graph. \\
There is extra space on the next page.
\problem{}
Run the Ford-Fulkerson algorithm on the following graph. \\
There is extra space on the next page.
\begin{center}
\begin{center}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
@ -58,17 +54,17 @@
;
\end{tikzpicture}
\end{center}
\end{center}
\begin{solution}
\begin{solution}
The maximum flow is $17$.
\end{solution}
\end{solution}
\vspace{5mm}
\vspace{5mm}
\pagebreak
\pagebreak
\begin{center}
\begin{center}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
@ -106,23 +102,22 @@
;
\end{tikzpicture}
\end{center}
\end{center}
\vfill
\pagebreak
\vfill
\pagebreak
\problem{}
You are given a large network. How would you quickly find an upper bound for the number of iterations the Ford-Fulkerson algorithm will need to find a maximum flow?
\problem{}
You are given a large network. How would you quickly find an upper bound for the number of iterations the Ford-Fulkerson algorithm will need to find a maximum flow?
\begin{solution}
\begin{solution}
Each iteration adds at least one unit of flow. So, we will find a maximum flow in at most $\min(\text{flow out of } S,~\text{flow into } T)$ iterations.
\vspace{2ex}
A simpler answer could only count the flow on $S$.
\end{solution}
\end{solution}
\vfill
\pagebreak
\end{document}
\vfill
\pagebreak

View File

@ -0,0 +1,187 @@
\section{Applications}
\problem{Maximum Cardinality Matching}
A \textit{matching} is a subset of edges in a bipartite graph. Nodes in a matching must not have more than one edge connected to them. \\
A matching is \textit{maximal} if it has more edges than any other matching.
\vspace{5mm}
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
Initial Graph \\
\vspace{2mm}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
\node[main] (A1) at (0mm, 24mm) {};
\node[main] (A2) at (0mm, 18mm) {};
\node[main] (A3) at (0mm, 12mm) {};
\node[main] (A4) at (0mm, 6mm) {};
\node[main] (A5) at (0mm, 0mm) {};
\node[main] (B1) at (20mm, 24mm) {};
\node[main] (B2) at (20mm, 18mm) {};
\node[main] (B3) at (20mm, 12mm) {};
\node[main] (B4) at (20mm, 6mm) {};
\node[main] (B5) at (20mm, 0mm) {};
\end{scope}
% Edges
\draw
(A1) edge (B2)
(A1) edge (B3)
(A2) edge (B1)
(A2) edge (B4)
(A4) edge (B3)
(A2) edge (B3)
(A5) edge (B3)
(A5) edge (B4)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\hfill
\begin{minipage}[t]{0.48\textwidth}
\begin{center}
Maximal Matching \\
\vspace{2mm}
\begin{tikzpicture}
% Nodes
\begin{scope}[layer = nodes]
\node[main] (A1) at (0mm, 24mm) {};
\node[main] (A2) at (0mm, 18mm) {};
\node[main] (A3) at (0mm, 12mm) {};
\node[main] (A4) at (0mm, 6mm) {};
\node[main] (A5) at (0mm, 0mm) {};
\node[main] (B1) at (20mm, 24mm) {};
\node[main] (B2) at (20mm, 18mm) {};
\node[main] (B3) at (20mm, 12mm) {};
\node[main] (B4) at (20mm, 6mm) {};
\node[main] (B5) at (20mm, 0mm) {};
\end{scope}
% Edges
\draw[opacity = 0.4]
(A1) edge (B2)
(A1) edge (B3)
(A2) edge (B1)
(A2) edge (B4)
(A4) edge (B3)
(A4) edge (B3)
(A5) edge (B3)
(A5) edge (B4)
;
\draw
(A1) edge (B2)
(A2) edge (B1)
(A4) edge (B3)
(A5) edge (B4)
;
\end{tikzpicture}
\end{center}
\end{minipage}
\vspace{5mm}
Devise an algorithm to find a maximal matching in any bipartite graph. \\
Find an upper bound for its runtime.
\begin{solution}
Turn this into a maximum flow problem and use FF. \\
Connect a node $S$ to all nodes in the left group and a node $T$ to all nodes in the right group. All edges have capacity 1.
\vspace{2ex}
Just like FF, this algorithm will take at most $\min(\# \text{ left nodes}, \# \text{ right nodes})$ iterations.
\end{solution}
\vfill
\pagebreak
\problem{Circulations with Demand}
Say we have a network of cities and power stations. Stations produce power; cities consume it.
Each station produces a limited amount of power, and each city has limited demand.
\vspace{2ex}
We can represent this power grid as a graph, with cities and stations as nodes and transmission lines as edges.
\vspace{2ex}
A simple example is below. There are two cities ($2$ and $4$) and two stations (both $-3$).
We'll represent station capacity with a negative number, since they \textit{consume} a negative amount of energy.
\begin{center}
\begin{tikzpicture}[
node distance = 25mm,
main/.style = {
draw,
circle,
fill = white,
minimum size = 8mm
},
]
% Nodes
\begin{scope}[layer = nodes]
\node[main] (S1) {$-3$};
\node[main] (S2) [below left of = S1] {$-3$};
\node[main] (C1) [below right of = S1] {$2$};
\node[main] (C2) [below right of = S2] {$4$};
\end{scope}
% Edges
\draw[->]
(S1) edge node[label] {$3$} (S2)
(S1) edge node[label] {$3$} (C1)
(S2) edge node[label] {$2$} (C1)
(S2) edge node[label] {$2$} (C2)
(C1) edge node[label] {$2$} (C2)
;
\end{tikzpicture}
\end{center}
We'd like to know if there exists a \textit{feasible circulation} in this network---that is, can we supply our cities with the energy they need without exceeding the capacity of power plants or transmission lines?
\vspace{2ex}
\textbf{Your job:} Devise an algorithm that solve this problem.
\vspace{2ex}
\note{\textbf{Bonus:} Say certain edges have a lower bound on their capacity, meaning that we must send \textit{at least} that much flow down the edge. Modify your algorithm to account for these additional constraints.}
\begin{solution}
Create a source node $S$, and connect it to each station with an edge. Set the capacity of that edge to the capacity of the station. \\
Create a sink node $T$ and do the same for cities.
\vspace{2ex}
This is now a maximum-flow problem with one source and one sink. Apply FF.
\linehack{}
To solve the bonus problem, we'll modify the network before running the algorithm above.
\vspace{2ex}
Say an edge from $A$ to $B$ has minimum capacity $l$ and maximum capacity $u \geq l$. Apply the following transformations:
\begin{itemize}
\item Add $l$ to the capacity of $A$
\item Subtract $l$ from the capacity of $B$
\item Subtract $l$ from the total capacity of the edge.
\end{itemize}
Do this for every edge that has a lower bound then apply the algorithm above.
\end{solution}
\vfill
\pagebreak

View File

@ -0,0 +1,52 @@
\usetikzlibrary{arrows.meta}
\usetikzlibrary{shapes.geometric}
% We put nodes in a separate layer, so we can
% slightly overlap with paths for a perfect fit
\pgfdeclarelayer{nodes}
\pgfdeclarelayer{path}
\pgfsetlayers{main,nodes}
% Layer settings
\tikzset{
% Layer hack, lets us write
% later = * in scopes.
layer/.style = {
execute at begin scope={\pgfonlayer{#1}},
execute at end scope={\endpgfonlayer}
},
%
% Arrowhead tweaks
>={Latex[ width=2mm, length=2mm ]},
label/.style = {
circle,
% For automatic red background in solutions
fill = \ORMCbgcolor,
draw = none
},
%
% Nodes
main/.style = {
draw,
circle,
fill = white
},
%
% Flow annotations
flow/.style = {
opacity = 1,
thin,
inner xsep = 2.5mm,
inner ysep = 2.5mm
},
%
% Paths
path/.style = {
line width = 4mm,
draw = black,
% Lengthen paths so they're
% completely under nodes.
line cap = rect,
opacity = 0.3
}
}