Commit 06f54e4b authored by Michael Keller's avatar Michael Keller
Browse files

LP Bound

parent c7a62181
No preview for this file type
......@@ -95,15 +95,23 @@ int *solve(int x, int y, double *R, int *dist, int crops)
double score = scorer(field, x, y, R, crops);
double maxScore = score;
int percent = 0;
printField(field, x, y);
for (unsigned long i = 0; i < iterations-1; i++)
{
if (iterations > 1000 && i % (iterations / 1000) == 0)
{
printf("%lf\% Done\n", ((double )percent)/10);
percent++;
}
// if (iterations > 1000 && i % (iterations / 1000) == 0)
// {
// printf("%lf\% Done\n", ((double )percent)/10);
// percent++;
// }
score += JohnsonTrotterIter(field, x, y, direction, R, crops);
// test if combo with opt sol is good
// double comboScore = multi_score([1, 8, 6, 0, 7, 3, 9, 2, 5, 4], field);
if(score == 14.5) {
printField(field, x, y);
}
if (score > maxScore)
{
maxScore = score;
......
......@@ -25,9 +25,26 @@ int main()
// {1, 1, 0, 0, 1, 0, 0, 0, 1, -0.5}};
// int distances[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
// char *name = "NONNEGATIVE Cotrini Data (No Kreuter)";
// int x = 15;
// int y = 15;
// int crops = 10;
// double R[10][10] = {
// {0, 1, 1, 1, 1, 1, 0, 0.5, 0.5, 1},
// {1, 0, 0, 1, 1, 0.5, 0, 1, 1, 1},
// {1, 0, 0, 0, 1, 0, 0.5, 0, 0, 0},
// {1, 1, 0, 0, 0, 0, 0, 1, 0, 0},
// {1, 1, 1, 0, 0, 0, 1, 1, 1, 1},
// {1, 0.5, 0, 0, 0, 0, 0, 0, 0, 0},
// {0, 0, 0.5, 0, 1, 0, 0, 0, 0.5, 0},
// {0.5, 1, 0, 1, 1, 0, 0, 0, 1, 0},
// {0.5, 1, 0, 0, 1, 0, 0.5, 1, 0, 1},
// {1, 1, 0, 0, 1, 0, 0, 0, 1, 0}};
// int distances[] = {23, 23, 23, 23, 23, 22, 22, 22, 22, 22};
char *name = "Agropol Data";
int x = 15;
int y = 15;
int x = 5;
int y = 2;
int crops = 10;
double R[10][10] = {
{-1, 0, 0.5, -0.5, 1, 0, 0.5, 1, 0.5, 0},
......@@ -40,7 +57,7 @@ int main()
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0.5, 0.5, 0, 1, 0, 0, 0.5, 0.5, -1, 0},
{0, 0, -0.5, 0.5, 0, 0, 1, 0.5, 0.5, -1}};
int distances[] = {23, 23, 23, 23, 23, 22, 22, 22, 22, 22};
int distances[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
// char *name = "Arnold (CAUTION, MATRIX DIFFERENT)";
// int x = 15;
......@@ -87,9 +104,9 @@ int main()
}
}
double maxScoreCalc = maxScoreGaertner(field, x, y, r, crops);
printf("maxScoreGaertner is: %lf\n", maxScoreCalc);
printf("regular maxscore is: %lf\n", maxScore(x, y));
// double maxScoreCalc = maxScoreGaertner(field, x, y, r, crops);
// printf("maxScoreGaertner is: %lf\n", maxScoreCalc);
// printf("regular maxscore is: %lf\n", maxScore(x, y));
printf("Started Solving...\n");
int *sol = solve(x, y, r, dist, crops);
......@@ -102,6 +119,8 @@ int main()
double score = scorer(sol, x, y, r, crops);
printf("Score: %lf, Relative Score: %lf", score, score / maxScore(x, y));
// cleanup allocated memory
free(r);
free(sol);
......
This diff is collapsed.
import random
from scipy.optimize import linprog
import copy
import multiprocessing as mp
def maxScore(R, sol):
xDim = len(sol)
yDim = len(sol[0])
return 8 * xDim * yDim - 6 * xDim - 6 * yDim + 4
# Toy Example
# x = 3
# y = 3
# R = lambda a, b: 1 if abs(a - b) <= 1 else 0
# dist = [1,1,1,1,1,1,1,1,1]
# larger example
# maxscore bounded by 950
x = 15
y = 15
R = lambda a, b: [[-1, 0, 0.5, -0.5, 1, 0, 0.5, 1, 0.5, 0],
[0, -1, 0, 1, 0, 0, 0.5, 0.5, 0.5, 0],
[0.5, 0, -1, 0, 0, 0, 0.5, 0.5, 0, -0.5],
[-0.5, 1, 0, -1, 0, 0, -1, 0.5, 0.5, 0.5],
[0, 0, 0, 0, -1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, -1, 1, 0.5, 0, 0],
[0.5, 0.5, 0.5, -0.5, 0, 0.5, -1, 0.5, 0.5, 0.5],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0.5, 0.5, 0, 1, 0, 0, 0.5, 0.5, -1, 0],
[0, 0, -0.5, 0.5, 0, 0, 1, 0.5, 0.5, -1]][a][b]
dist = [23, 23, 23, 23, 23, 22, 22, 22, 22, 22]
# Cotrini Data (Sum = 26)
# x = 15
# y = 15
# R = lambda a, b: [
# [-0.5, 1, 1, 1, 1, 1, -1, 0.5, 0.5, 1],
# [1, -0.5, -1, 1, 1, 0.5, -1, 1, 1, 1],
# [1, -1, -0.5, -1, 1, 0, 0.5, 0, 0, 0],
# [1, 1, -1, -0.5, 0, 0, -1, 1, -1, 0],
# [1, 1, 1, 0, -0.5, 0, 1, 1, 1, 1],
# [1, 0.5, 0, 0, 0, -0.5, 0, 0, 0, 0],
# [-1, -1, 0.5, -1, 1, 0, -0.5, 0, 0.5, 0],
# [0.5, 1, 0, 1, 1, 0, 0, -0.5, 1, 0],
# [0.5, 1, 0, -1, 1, 0, 0.5, 1, -0.5, 1],
# [1, 1, 0, 0, 1, 0, 0, 0, 1, -0.5]][a][b]
# dist = [23, 23, 23, 23, 23, 22, 22, 22, 22, 22]
# auto calculate some vars
numb_crops = len(dist)
#
# HELPERS
#
# i is x-coord, j is y coord, c is the crop
def get_ind(i, j, c):
if i < 0 or j < 0:
return -1
ind = int((i * y + j) * len(dist) + c)
if ind >= x * y * numb_crops:
return -1
return ind
def get_pos(var):
cPos = var % numb_crops
xPos = int(((var - cPos) / numb_crops) / y)
yPos = ((var - cPos) / numb_crops) % y
return [xPos, yPos, cPos]
def scorePixel(field, pixel):
score = 0
p_x = pixel[0]
p_y = pixel[1]
for n1 in range(-1, 2):
for n2 in range(-1, 2):
# not a neighbor
if n1 == 0 and n2 == 0:
continue
# test valid neighbor
if not (0 <= (p_x + n1) and (p_x + n1) < x):
continue
if not (0 <= (p_y + n2) and (p_y + n2) < y):
continue
# update score
numb_crops = len(dist)
for c1 in range(numb_crops):
for c2 in range(numb_crops):
indA = get_ind(p_x, p_y, c1)
indB = get_ind(p_x + n1, p_y + n2, c2)
if field[indA] > 0 and field[indB] > 0:
score += field[indA] * field[indB] * (R(c1, c2) + R(c2, c1)) /2
return score
def score(field):
score = 0
for i in range(x):
for j in range(y):
score += scorePixel(field, (i, j))
return score
def print_field(x0):
for i in range(x):
print("[", end="")
for j in range(y):
for c in range(numb_crops):
if x0[get_ind(i, j, c)] == 1:
print(c, end=" ")
print(", ", end="")
print("], ")
#
# END HELPERS
#
def main():
# generate objective function
obj = []
for i in range(numb_crops):
for j in range(i):
obj += [-(R(i, j) + R(j, i))]
# generate EQ constraints
lhs_eq = [[1 for _ in range(int(numb_crops * (numb_crops - 1) / 2))]]
rhs_eq = [maxScore(R, [[0] * 15] * 15) / 2]
# generate LEQ constraints
lhs_ub = []
rhs_ub = []
for c in range(numb_crops):
constrA = []
constrB = []
for i in range(numb_crops):
for j in range(i):
constrA += [1 if i == c or j == c else 0]
constrB += [-1 if i == c or j == c else 0]
lhs_ub += [constrA]
lhs_ub += [constrB]
rhs_ub += [8 * dist[c]]
rhs_ub += [-3 * dist[c]]
# generate variable bounds
bnd = [(0, None) for _ in range(len(obj))]
# ask the oracle
opt = linprog(c=obj, A_ub=lhs_ub, b_ub=rhs_ub, A_eq=lhs_eq, b_eq=rhs_eq, bounds=bnd, method="revised simplex", options={ "tol": 0.00000001 })
print("The optimal score is bounded by: ", abs(opt.fun))
print("The Proposed distribution is: ", opt.x)
main()
\ No newline at end of file
......@@ -165,6 +165,8 @@ def project(field):
def main():
best_x0_score = 658.0
while True:
# generate random 1d field
......@@ -188,21 +190,34 @@ def main():
iterations = 0
delta = 0.1
while prev_x0 != x0:
violations = 0
while violations < 4:
if prev_x0 != [] and score(prev_x0) > score(x0):
violations += 1
else:
violations = 0
prev_x0 = copy.deepcopy(x0)
x0 = iteration(x0, delta)
iterations += 1
# for i in range(len(x0)):
# x0[i] = round(x0[i], int(math.log10(1 / delta)))
if iterations % 1 == 0:
if iterations % 100 == 0:
print("Score: ", score(x0), "Gradient Sum: ", sum(gradient(x0)))
# print(x0)
if score(x0) > best_x0_score:
best_x0 = copy.deepcopy(x0)
best_x0_score = score(x0)
print("Write to file")
f = open("best-score.txt", "a")
f.write("Score: " + str(best_x0_score) + "\n x0 = " + str(best_x0) + "\n\n")
f.close()
print("Terminated")
print("Score: ", score(x0))
print("Relative Score: ", score(x0) / (8 * x * y - 6 * y - 6 * y + 4))
......
\chapter{Benchmark Problems}
We received two $R$ matrices from Agroscope. However,
the second matrix is the more interesting one for two
reasons:
\begin{itemize}
\item It turns out to be harder to optimize
\item Agroscope plans on conducting a field experiment with
the second matrix
\end{itemize}
Our goal is to develop methods that work well in
many or all cases. However, data that is based
on real observations is of particular interest.
Agroscope, the Swiss Federal Research center
for agriculture, nutrition and the environment,
has compiled some real world data. They have
kindly supplied us with the relationship matrices
so we can see how well our methods work on real data.
The first matrix is:
\FloatBarrier
\begin{figure}[h]
......@@ -50,10 +51,10 @@ where
\FloatBarrier
and the second matrix is:
\FloatBarrier
\begin{figure}
\begin{figure}[h]
\centering
\begin{tabular}{ c c c c c c c c c c c }
x & $c_1$ & $c_2$ & $c_3$ & $c_4$ & $c_5$ & $c_6$ & $c_7$ & $c_8$ & $c_9$ & $c_{10}$\\
& $c_1$ & $c_2$ & $c_3$ & $c_4$ & $c_5$ & $c_6$ & $c_7$ & $c_8$ & $c_9$ & $c_{10}$\\
$c_1$ & $-1$ & $0$ & $0.5$ & $-0.5$ & $1$ & $0$ & $0.5$ & $1$ & $0.5$ & $0$\\
$c_2$ & $0$ & $-1$ & $0$ & $1$ & $0$ & $0$ & $0.5$ & $0.5$ & $0.5$ & $0$\\
$c_3$ & $0.5$ & $0$ & $-1$ & $0$ & $0$ & $0$ & $0.5$ & $0.5$ & $0$ & $-0.5$\\
......@@ -85,4 +86,7 @@ where
$c_{10}$ & Randen \\ \bottomrule
\end{tabular}
\end{figure}
\FloatBarrier
\ No newline at end of file
\FloatBarrier
Throughout this thesis we will report for the presented
methods how well they work on these two matrices. Our
standard field size will be $15 \times 15$ pixels.
\ No newline at end of file
\chapter{Bounds}
To gage the effectiveness of our algorithms
we want to know how close to the optimal solution
we are. For this we present two bounds.
\section{Basic Bound}
\section{Gärtner Bound}
\ No newline at end of file
For this bound we assume every relationship
between neighboring crops has a score of $1$.
Then the maximum possible score is:
\begin{align*}
\text{Pixels with $8$ neighbors} & = (X-2) \cdot (Y-2) \\
\text{Pixels with $5$ neighbors} & = 2 \cdot (X-2) + 2 \cdot (Y-2) = 2X + 2Y - 8 \\
\text{Pixels with $3$ neighbors} & = 4 \\
\text{Maximum possible score} & = 8 \cdot (X-2) \cdot (Y-2)
+ 5 \cdot (2X + 2Y - 8)
+ 3 \cdot 4 \\
& = 8XY - 16X - 16Y + 32 + 10X + 10Y - 40 + 12 \\
& = 8XY -6X -6Y + 4
\end{align*}
which for our benchmark $15 \times 15$ field
results in an upper bound of $1624$.
\section{Gärtner Bound}
TODO: This is wrong? If a pixel has a negative
neighborhood the border leads to us underestimating.
Think of $R(c_1, c_2) = -1$.
The basic bound is rather optimistic. If
our $R$ function assigns no two crops
the value of $1$ the basic bound still assumes
it will. Instead we can take the $R$ function
into account when calculating a bound. Consider the
following $3 \times 3$ subfield:
\FloatBarrier
\begin{figure}[h]
\centering
\begin{tikzpicture}[auto,node distance=1cm,thick,main node/.style={circle,draw,font=\sffamily\Large}]
\node[main node] (1) {};
\node[main node] (2) [right of=1] {};
\node[main node] (3) [right of=2] {};
\node[main node] (4) [below of=1]{};
\node[main node] (5) [right of=4] {};
\node[main node] (6) [right of=5] {};
\node[main node] (7) [below of=4] {};
\node[main node] (8) [right of=7] {};
\node[main node] (9) [right of=8] {};
\path[every node/.style={font=\sffamily\small}] (1) edge[red] (2);
\path[every node/.style={font=\sffamily\small}] (2) edge[red] (3);
\path[every node/.style={font=\sffamily\small}] (4) edge[red] (5);
\path[every node/.style={font=\sffamily\small}] (5) edge[red] (6);
\path[every node/.style={font=\sffamily\small}] (7) edge[red] (8);
\path[every node/.style={font=\sffamily\small}] (8) edge[red] (9);
\path[every node/.style={font=\sffamily\small}] (1) edge[red] (4);
\path[every node/.style={font=\sffamily\small}] (4) edge[red] (7);
\path[every node/.style={font=\sffamily\small}] (2) edge[red] (5);
\path[every node/.style={font=\sffamily\small}] (5) edge[red] (8);
\path[every node/.style={font=\sffamily\small}] (3) edge[red] (6);
\path[every node/.style={font=\sffamily\small}] (6) edge[red] (9);
\path[every node/.style={font=\sffamily\small}] (1) edge[blue] (5);
\path[every node/.style={font=\sffamily\small}] (4) edge[blue] (2);
\path[every node/.style={font=\sffamily\small}] (2) edge[blue] (6);
\path[every node/.style={font=\sffamily\small}] (5) edge[blue] (3);
\path[every node/.style={font=\sffamily\small}] (4) edge[blue] (8);
\path[every node/.style={font=\sffamily\small}] (7) edge[blue] (5);
\path[every node/.style={font=\sffamily\small}] (5) edge[blue] (9);
\path[every node/.style={font=\sffamily\small}] (8) edge[blue] (6);
\end{tikzpicture}
\end{figure}
\FloatBarrier
where every vertex represents a pixel and edges represent
neighborhood relationships. Red edges are non-diagonal neighborhood
relationships, while blue edges are diagonal relationships.
Using exhaustive search we can find for each crop
an optimal solution where that crop is in the center
of the subfield above. Then we multiply the value
of all of the red edges with $\frac{1}{6}$ and that
of the blue edges with $\frac{1}{4}$. Then let
$b(c)$ denote the sum of all of the now multiplied
edges in the $3 \times 3$ field for crop $c$.
The optimal score is then bounded by the number
of pixels that are of this crop type multiplied by
$b(c)$.
\begin{displaymath}
\sum_{c \in \Cps} X \cdot Y \cdot D(c) \cdot b(x)
\end{displaymath}
The multipliers are chosen to ensure that all
edges/ crop relationships are counted. A red edge
could be counted by up to $6$ pixels, while a blue
edge could be counted by up to $4$. When they are
not counted $6$ respectively $4$ times, it is because
they no longer represent valid relationships
within our field.
This bound therefore takes into account that there
might be crop types that just do not have good
local neighborhood solutions. We do however count
some non-existant relationships over the field
border, but this may be offset by the other gains
the bound brings. This bound therefore performs well
for pixel farming problems that don't have solutions
with high scores relative to their field size.
Our first benchmark problem is bounded here by
.... while our second problem is bounded by
\section{LP bound}
We can also use the solution to the
following Linear Program as a bound:
\begin{align*}
x &= \begin{bmatrix}
x_{1, 1}\\
x_{1, 2}\\
\vdots\\
x_{1, C}\\
x_{2, 2}\\
\vdots\\
x_{C-1, C}
\end{bmatrix}
&
x_{i, j} &= \text{How much of crop } c_i \text{ is planted next to crop } c_j
\end{align*}
where the objective function is the sum of the relationship
function for both involved crops the variable has:
\begin{align*}
c &= \begin{bmatrix}
R(c_1, c_1) + R(c_1, c_1)\\
R(c_1, c_2) + R(c_2, c_1)\\
\vdots\\
R(c_1, c_C) + R(c_C, c_1)\\
R(c_2, c_2) + R(c_2, c_2)\\
\vdots\\
R(c_{C-1}, c_C) + R(c_C, c_{C-1})
\end{bmatrix}
\end{align*}
and we are trying to maximize $c^T \cdot x$ under the
constraints that we use the correct number of
total relationships between pixels:
\begin{align*}
\sum_{x_i \in x} 2 \cdot x_i = \text{Basic Bound}
\end{align*}
as well as that we don't plant too much of a
specific crop:
\begin{align*}
1
\end{align*}
\ No newline at end of file
......@@ -227,12 +227,13 @@ solution.
Now that we have a way to find the optimal multi-way swap
between pixels, how do we use it? We tried the following
procedure:
\FloatBarrier
\begin{algorithm}
\caption{Random LP Iteration Algorithm}
\begin{algorithmic}
\State $i \gets 0$
\State $x_0 \gets \text{Random initial valid field}$
\While{$i \leq \text{Max Iterations}$}
\While{$i \leq \text{Max Iterations}$ and $x_0$ not converged}
\State $P \gets \{\text{random set of non-neighboring pixels}\}$
\State $opt \gets solveLP(P, x_0)$
\State $x_0 \gets updateField(opt, x0)$
......@@ -241,3 +242,7 @@ procedure:
\Return $x_0$
\end{algorithmic}
\end{algorithm}
\FloatBarrier
After running this algorithm repeatedly for around 24h
on a standard Laptop we were able to generate the
following solutions for our benchmark problems:
\ No newline at end of file
......@@ -9,15 +9,16 @@
\BOOKMARK [0][-]{chapter.6}{\376\377\000B\000o\000u\000n\000d\000s}{}% 9
\BOOKMARK [1][-]{section.6.1}{\376\377\000B\000a\000s\000i\000c\000\040\000B\000o\000u\000n\000d}{chapter.6}% 10
\BOOKMARK [1][-]{section.6.2}{\376\377\000G\000\344\000r\000t\000n\000e\000r\000\040\000B\000o\000u\000n\000d}{chapter.6}% 11
\BOOKMARK [0][-]{chapter.7}{\376\377\000H\000e\000l\000p\000f\000u\000l\000\040\000S\000t\000a\000t\000e\000m\000e\000n\000t\000s}{}% 12
\BOOKMARK [1][-]{section.7.1}{\376\377\000G\000r\000o\000w\000i\000n\000g\000\040\000s\000o\000l\000u\000t\000i\000o\000n\000s}{chapter.7}% 13
\BOOKMARK [1][-]{section.7.2}{\376\377\000C\000r\000e\000a\000t\000i\000n\000g\000\040\000i\000n\000t\000e\000g\000e\000r\000\040\000s\000o\000l\000u\000t\000i\000o\000n\000s\000\040\000f\000r\000o\000m\000\040\000f\000r\000a\000c\000t\000i\000o\000n\000a\000l\000\040\000s\000o\000l\000u\000t\000i\000o\000n\000s}{chapter.7}% 14
\BOOKMARK [2][-]{subsection.7.2.1}{\376\377\000T\000h\000e\000\040\000s\000t\000a\000n\000d\000a\000r\000d\000\040\000m\000e\000t\000h\000o\000d}{section.7.2}% 15
\BOOKMARK [2][-]{subsection.7.2.2}{\376\377\000T\000h\000e\000\040\000a\000d\000v\000a\000n\000c\000e\000d\000\040\000m\000e\000t\000h\000o\000d}{section.7.2}% 16
\BOOKMARK [0][-]{chapter.8}{\376\377\000T\000h\000e\000\040\000L\000i\000n\000e\000a\000r\000\040\000P\000r\000o\000g\000r\000a\000m\000m\000i\000n\000g\000\040\000M\000e\000t\000h\000o\000d}{}% 17
\BOOKMARK [1][-]{section.8.1}{\376\377\000P\000r\000o\000b\000l\000e\000m\000\040\000S\000e\000t\000u\000p}{chapter.8}% 18
\BOOKMARK [1][-]{section.8.2}{\376\377\000M\000e\000t\000h\000o\000d}{chapter.8}% 19
\BOOKMARK [0][-]{chapter.9}{\376\377\000G\000r\000a\000d\000i\000e\000n\000t\000\040\000D\000e\000s\000c\000e\000n\000t}{}% 20
\BOOKMARK [0][-]{chapter.10}{\376\377\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 21
\BOOKMARK [0][-]{appendix.A}{\376\377\000C\000a\000l\000c\000u\000l\000a\000t\000i\000o\000n\000s\000\040\000A\000p\000p\000e\000n\000d\000i\000x}{}% 22
\BOOKMARK [0][-]{appendix*.4}{\376\377\000B\000i\000b\000l\000i\000o\000g\000r\000a\000p\000h\000y}{}% 23
\BOOKMARK [1][-]{section.6.3}{\376\377\000L\000P\000\040\000b\000o\000u\000n\000d}{chapter.6}% 12
\BOOKMARK [0][-]{chapter.7}{\376\377\000H\000e\000l\000p\000f\000u\000l\000\040\000S\000t\000a\000t\000e\000m\000e\000n\000t\000s}{}% 13
\BOOKMARK [1][-]{section.7.1}{\376\377\000G\000r\000o\000w\000i\000n\000g\000\040\000s\000o\000l\000u\000t\000i\000o\000n\000s}{chapter.7}% 14
\BOOKMARK [1][-]{section.7.2}{\376\377\000C\000r\000e\000a\000t\000i\000n\000g\000\040\000i\000n\000t\000e\000g\000e\000r\000\040\000s\000o\000l\000u\000t\000i\000o\000n\000s\000\040\000f\000r\000o\000m\000\040\000f\000r\000a\000c\000t\000i\000o\000n\000a\000l\000\040\000s\000o\000l\000u\000t\000i\000o\000n\000s}{chapter.7}% 15
\BOOKMARK [2][-]{subsection.7.2.1}{\376\377\000T\000h\000e\000\040\000s\000t\000a\000n\000d\000a\000r\000d\000\040\000m\000e\000t\000h\000o\000d}{section.7.2}% 16
\BOOKMARK [2][-]{subsection.7.2.2}{\376\377\000T\000h\000e\000\040\000a\000d\000v\000a\000n\000c\000e\000d\000\040\000m\000e\000t\000h\000o\000d}{section.7.2}% 17
\BOOKMARK [0][-]{chapter.8}{\376\377\000T\000h\000e\000\040\000L\000i\000n\000e\000a\000r\000\040\000P\000r\000o\000g\000r\000a\000m\000m\000i\000n\000g\000\040\000M\000e\000t\000h\000o\000d}{}% 18
\BOOKMARK [1][-]{section.8.1}{\376\377\000P\000r\000o\000b\000l\000e\000m\000\040\000S\000e\000t\000u\000p}{chapter.8}% 19
\BOOKMARK [1][-]{section.8.2}{\376\377\000M\000e\000t\000h\000o\000d}{chapter.8}% 20
\BOOKMARK [0][-]{chapter.9}{\376\377\000G\000r\000a\000d\000i\000e\000n\000t\000\040\000D\000e\000s\000c\000e\000n\000t}{}% 21
\BOOKMARK [0][-]{chapter.10}{\376\377\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n}{}% 22
\BOOKMARK [0][-]{appendix.A}{\376\377\000C\000a\000l\000c\000u\000l\000a\000t\000i\000o\000n\000s\000\040\000A\000p\000p\000e\000n\000d\000i\000x}{}% 23
\BOOKMARK [0][-]{appendix*.4}{\376\377\000B\000i\000b\000l\000i\000o\000g\000r\000a\000p\000h\000y}{}% 24
No preview for this file type
\contentsline {theorem}{{Theorem}{4.{1}}{}}{7}{theorem.4.2.1}%
\contentsline {proof}{{Proof}{1}{}}{7}{proof.1}%
\contentsline {theorem}{{Theorem}{7.{1}}{}}{17}{theorem.7.2.1}%
\contentsline {proof}{{Proof}{2}{}}{17}{proof.2}%
\contentsline {theorem}{{Theorem}{7.{2}}{}}{18}{theorem.7.2.2}%
\contentsline {proof}{{Proof}{3}{}}{19}{proof.3}%
\contentsline {theorem}{{Theorem}{8.{1}}{}}{23}{theorem.8.1.1}%
\contentsline {proof}{{Proof}{4}{}}{23}{proof.4}%
\contentsline {theorem}{{Theorem}{8.{2}}{}}{23}{theorem.8.1.2}%
\contentsline {proof}{{Proof}{5}{}}{23}{proof.5}%
\contentsline {theorem}{{Theorem}{7.{1}}{}}{19}{theorem.7.2.1}%
\contentsline {proof}{{Proof}{2}{}}{19}{proof.2}%
\contentsline {theorem}{{Theorem}{7.{2}}{}}{20}{theorem.7.2.2}%
\contentsline {proof}{{Proof}{3}{}}{21}{proof.3}%
\contentsline {theorem}{{Theorem}{8.{1}}{}}{25}{theorem.8.1.1}%
\contentsline {proof}{{Proof}{4}{}}{25}{proof.4}%
\contentsline {theorem}{{Theorem}{8.{2}}{}}{25}{theorem.8.1.2}%
\contentsline {proof}{{Proof}{5}{}}{25}{proof.5}%
......@@ -13,15 +13,16 @@
\contentsline {chapter}{\chapternumberline {6}Bounds}{15}{chapter.6}%
\contentsline {section}{\numberline {6.1}Basic Bound}{15}{section.6.1}%
\contentsline {section}{\numberline {6.2}Gärtner Bound}{15}{section.6.2}%
\contentsline {chapter}{\chapternumberline {7}Helpful Statements}{17}{chapter.7}%
\contentsline {section}{\numberline {7.1}Growing solutions}{17}{section.7.1}%
\contentsline {section}{\numberline {7.2}Creating integer solutions from fractional solutions}{17}{section.7.2}%
\contentsline {subsection}{\numberline {7.2.1}The standard method}{17}{subsection.7.2.1}%
\contentsline {subsection}{\numberline {7.2.2}The advanced method}{18}{subsection.7.2.2}%
\contentsline {chapter}{\chapternumberline {8}The Linear Programming Method}{21}{chapter.8}%
\contentsline {section}{\numberline {8.1}Problem Setup}{21}{section.8.1}%
\contentsline {section}{\numberline {8.2}Method}{24}{section.8.2}%
\contentsline {chapter}{\chapternumberline {9}Gradient Descent}{25}{chapter.9}%
\contentsline {chapter}{\chapternumberline {10}Conclusion}{27}{chapter.10}%
\contentsline {appendix}{\chapternumberline {A}Calculations Appendix}{29}{appendix.A}%
\contentsline {chapter}{Bibliography}{31}{appendix*.4}%
\contentsline {section}{\numberline {6.3}LP bound}{17}{section.6.3}%
\contentsline {chapter}{\chapternumberline {7}Helpful Statements}{19}{chapter.7}%
\contentsline {section}{\numberline {7.1}Growing solutions}{19}{section.7.1}%
\contentsline {section}{\numberline {7.2}</