Add partial draft for background chapter

This commit is contained in:
Jip J. Dekker 2021-02-04 15:35:06 +11:00
parent a15e017665
commit 56b891ccc9
No known key found for this signature in database
GPG Key ID: 517DF4A00618C9C3
8 changed files with 235 additions and 30 deletions

View File

@ -1,31 +1,36 @@
@book{marriott_programming_1998,
location = {Cambridge, Mass},
title = {Programming with constraints: an introduction},
isbn = {978-0-262-13341-8},
shorttitle = {Programming with constraints},
pagetotal = {467},
publisher = {{MIT} Press},
author = {Marriott, Kim and Stuckey, Peter J.},
date = {1998},
keywords = {Constraint programming (Computer science), Logic programming},
@article{freuder-1997-holygrail,
author = {Eugene C. Freuder},
title = {In Pursuit of the Holy Grail},
journal = {Constraints An Int. J.},
volume = 2,
number = 1,
pages = {57--61},
year = 1997,
url = {https://doi.org/10.1023/A:1009749006768},
doi = {10.1023/A:1009749006768},
timestamp = {Fri, 13 Mar 2020 10:58:24 +0100},
biburl = {https://dblp.org/rec/journals/constraints/Freuder97.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}
@incollection{hooker_solver-independent_2018,
location = {Cham},
title = {Solver-Independent Large Neighbourhood Search},
volume = {11008},
rights = {All rights reserved},
isbn = {978-3-319-98333-2 978-3-319-98334-9},
url = {http://link.springer.com/10.1007/978-3-319-98334-9_6},
pages = {81--98},
booktitle = {Principles and Practice of Constraint Programming},
publisher = {Springer International Publishing},
author = {Dekker, Jip J. and de la Banda, Maria Garcia and Schutt, Andreas and Stuckey, Peter J. and Tack, Guido},
editor = {Hooker, John},
urldate = {2020-12-22},
date = {2018},
langid = {english},
doi = {10.1007/978-3-319-98334-9_6},
note = {Series Title: Lecture Notes in Computer Science},
}
@book{marriott-1998-clp,
location = {Cambridge, Mass},
title = {Programming with constraints: an introduction},
isbn = {978-0-262-13341-8},
shorttitle = {Programming with constraints},
pagetotal = 467,
publisher = {{MIT} Press},
author = {Marriott, Kim and Stuckey, Peter J.},
date = 1998,
keywords = {Constraint programming (Computer science), Logic
programming},
}
@book{silvano-1990-knapsack,
author = {Martello, Silvano and Toth, Paolo},
title = {Knapsack Problems: Algorithms and Computer Implementations},
year = 1990,
isbn = 0471924202,
publisher = {John Wiley \& Sons, Inc.},
address = {USA}
}

View File

@ -8,3 +8,25 @@
% make use of the services and resources provided by another particular software
% program that implements that API},
% }
\newglossaryentry{constraint}{
name={constraint},
description={TODO},
}
\newglossaryentry{decision-variable}{
name={decision variable},
description={TODO},
}
\newglossaryentry{minizinc}{
name={MiniZinc},
description={TODO},
}
\newcommand{\minizinc}{\gls{minizinc}}
\newglossaryentry{solver}{
name={solver},
description={TODO},
}
\newglossaryentry{problem-parameter}{
name={problem parameter},
description={TODO},
}

15
assets/mzn/2_knapsack.mzn Normal file
View File

@ -0,0 +1,15 @@
% Problem parameters
enum TOYS = {football, tennisball, stuffed_lama, stuffed_elephant};
array[TOYS] of int: toy_joy = [63, 12, 50, 100];
array[TOYS] of int: toy_space = [32, 8, 16, 40];
int: space_left = 64;
% Decision variables
var set of TOYS: selection;
var int: total_joy = sum(toy in selection)(toy_joy[toy]);
% Constraints
constraint sum(toy in selection)(toy_space[toy]) < space_left;
% Goal
solve maximize total_joy;

View File

@ -0,0 +1,17 @@
\begin{Verbatim}[commandchars=\\\{\},numbers=left,firstnumber=1,stepnumber=1,codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8}]
\PY{c}{\PYZpc{} Problem parameters}
\PY{k+kt}{enum}\PY{l+s}{ }\PY{n+nv}{TOYS}\PY{l+s}{ }\PY{o}{=}\PY{l+s}{ }\PY{p}{\PYZob{}}\PY{n+nv}{football}\PY{p}{,}\PY{l+s}{ }\PY{n+nv}{tennisball}\PY{p}{,}\PY{l+s}{ }\PY{n+nv}{stuffed\PYZus{}lama}\PY{p}{,}\PY{l+s}{ }\PY{n+nv}{stuffed\PYZus{}elephant}\PY{g+gr}{\PYZcb{}}\PY{p}{;}
\PY{k+kt}{array}\PY{p}{[}\PY{n+nv}{TOYS}\PY{g+gr}{]}\PY{l+s}{ }\PY{k+kt}{of}\PY{l+s}{ }\PY{k+kt}{int}\PY{p}{:}\PY{l+s}{ }\PY{n+nv}{toy\PYZus{}joy}\PY{l+s}{ }\PY{o}{=}\PY{l+s}{ }\PY{p}{[}\PY{l+m}{63}\PY{p}{,}\PY{l+s}{ }\PY{l+m}{12}\PY{p}{,}\PY{l+s}{ }\PY{l+m}{50}\PY{p}{,}\PY{l+s}{ }\PY{l+m}{100}\PY{g+gr}{]}\PY{p}{;}
\PY{k+kt}{array}\PY{p}{[}\PY{n+nv}{TOYS}\PY{g+gr}{]}\PY{l+s}{ }\PY{k+kt}{of}\PY{l+s}{ }\PY{k+kt}{int}\PY{p}{:}\PY{l+s}{ }\PY{n+nv}{toy\PYZus{}space}\PY{l+s}{ }\PY{o}{=}\PY{l+s}{ }\PY{p}{[}\PY{l+m}{32}\PY{p}{,}\PY{l+s}{ }\PY{l+m}{8}\PY{p}{,}\PY{l+s}{ }\PY{l+m}{16}\PY{p}{,}\PY{l+s}{ }\PY{l+m}{40}\PY{g+gr}{]}\PY{p}{;}
\PY{k+kt}{int}\PY{p}{:}\PY{l+s}{ }\PY{n+nv}{space\PYZus{}left}\PY{l+s}{ }\PY{o}{=}\PY{l+s}{ }\PY{l+m}{64}\PY{p}{;}
\PY{c}{\PYZpc{} Decision variables}
\PY{k+kt}{var}\PY{l+s}{ }\PY{k+kt}{set}\PY{l+s}{ }\PY{k+kt}{of}\PY{l+s}{ }\PY{n+nv}{TOYS}\PY{p}{:}\PY{l+s}{ }\PY{n+nv}{selection}\PY{p}{;}
\PY{k+kt}{var}\PY{l+s}{ }\PY{k+kt}{int}\PY{p}{:}\PY{l+s}{ }\PY{n+nv}{total\PYZus{}joy}\PY{l+s}{ }\PY{o}{=}\PY{l+s}{ }\PY{n+nb}{sum}\PY{p}{(}\PY{n+nv}{toy}\PY{l+s}{ }\PY{o}{in}\PY{l+s}{ }\PY{n+nv}{selection}\PY{g+gr}{)}\PY{p}{(}\PY{n+nv}{toy\PYZus{}joy}\PY{p}{[}\PY{n+nv}{toy}\PY{g+gr}{]}\PY{g+gr}{)}\PY{p}{;}
\PY{c}{\PYZpc{} Constraints}
\PY{k}{constraint}\PY{l+s}{ }\PY{n+nb}{sum}\PY{p}{(}\PY{n+nv}{toy}\PY{l+s}{ }\PY{o}{in}\PY{l+s}{ }\PY{n+nv}{selection}\PY{g+gr}{)}\PY{p}{(}\PY{n+nv}{toy\PYZus{}space}\PY{p}{[}\PY{n+nv}{toy}\PY{g+gr}{]}\PY{g+gr}{)}\PY{l+s}{ }\PY{o}{\PYZlt{}}\PY{l+s}{ }\PY{n+nv}{space\PYZus{}left}\PY{p}{;}
\PY{c}{\PYZpc{} Goal}
\PY{k}{solve}\PY{l+s}{ }\PY{k}{maximize}\PY{l+s}{ }\PY{n+nv}{total\PYZus{}joy}\PY{p}{;}
\end{Verbatim}

View File

@ -44,12 +44,34 @@ Scale=1.4
\usepackage[
style=apa,
]{biblatex}
\usepackage{cleveref}
% Glossary / Acronyms
\usepackage[acronym]{glossaries}
\usepackage[acronym,toc]{glossaries}
\defglsentryfmt[main]{\ifglsused{\glslabel}{\glsgenentryfmt}{\textit{\glsgenentryfmt}}}
\makeglossaries{}
% Code formatting
\usepackage{fancyvrb}
\usepackage{color}
\input{assets/pygments_header.tex}
\DeclareNewTOC[
type=program,
float,
name=Program,
counterwithin=chapter,
atbegin={%
\scriptsize
}
]{program}
\crefname{program}{program}{programs}
\DeclareNewTOC[
type=model,
float,
name=Model,
counterwithin=chapter,
atbegin={%
\scriptsize
}
]{model}
\crefname{model}{model}{models}

View File

@ -0,0 +1,28 @@
toys_joy = [63, 12, 50, 100]
toys_space = [32, 8, 16, 40]
space_left = 64
num_toys = len(toys_joy)
# Initialise an empty table
table = [
[0 for x in range(space_left + 1)]
for x in range(num_toys + 1)
]
for i in range(num_toys + 1):
for j in range(space_left + 1):
# If we are out of space or toys we cannot choose a toy
if i == 0 or j == 0:
table[i][j] = 0
# If there is space for the toy, then compare the joy of
# picking this toy over picking the next toy with more
# space left
elif toys_space[i - 1] <= j:
table[i][j] = max(
toys_joy[i - 1] + table[i - 1][j - wt[i - 1]],
table[i - 1][j],
)
# Otherwise, consider the next toy
else:
table[i][j] = table[i - 1][j]
optimal_joy = table[num_toys][space_left]

View File

@ -0,0 +1,30 @@
\begin{Verbatim}[commandchars=\\\{\},numbers=left,firstnumber=1,stepnumber=1,codes={\catcode`\$=3\catcode`\^=7\catcode`\_=8}]
\PY{n}{toys\PYZus{}joy} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{63}\PY{p}{,} \PY{l+m+mi}{12}\PY{p}{,} \PY{l+m+mi}{50}\PY{p}{,} \PY{l+m+mi}{100}\PY{p}{]}
\PY{n}{toys\PYZus{}space} \PY{o}{=} \PY{p}{[}\PY{l+m+mi}{32}\PY{p}{,} \PY{l+m+mi}{8}\PY{p}{,} \PY{l+m+mi}{16}\PY{p}{,} \PY{l+m+mi}{40}\PY{p}{]}
\PY{n}{space\PYZus{}left} \PY{o}{=} \PY{l+m+mi}{64}
\PY{n}{num\PYZus{}toys} \PY{o}{=} \PY{n+nb}{len}\PY{p}{(}\PY{n}{toys\PYZus{}joy}\PY{p}{)}
\PY{c+c1}{\PYZsh{} Initialise an empty table}
\PY{n}{table} \PY{o}{=} \PY{p}{[}
\PY{p}{[}\PY{l+m+mi}{0} \PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n}{space\PYZus{}left} \PY{o}{+} \PY{l+m+mi}{1}\PY{p}{)}\PY{p}{]}
\PY{k}{for} \PY{n}{x} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n}{num\PYZus{}toys} \PY{o}{+} \PY{l+m+mi}{1}\PY{p}{)}
\PY{p}{]}
\PY{k}{for} \PY{n}{i} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n}{num\PYZus{}toys} \PY{o}{+} \PY{l+m+mi}{1}\PY{p}{)}\PY{p}{:}
\PY{k}{for} \PY{n}{j} \PY{o+ow}{in} \PY{n+nb}{range}\PY{p}{(}\PY{n}{space\PYZus{}left} \PY{o}{+} \PY{l+m+mi}{1}\PY{p}{)}\PY{p}{:}
\PY{c+c1}{\PYZsh{} If we are out of space or toys we cannot choose a toy}
\PY{k}{if} \PY{n}{i} \PY{o}{==} \PY{l+m+mi}{0} \PY{o+ow}{or} \PY{n}{j} \PY{o}{==} \PY{l+m+mi}{0}\PY{p}{:}
\PY{n}{table}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{[}\PY{n}{j}\PY{p}{]} \PY{o}{=} \PY{l+m+mi}{0}
\PY{c+c1}{\PYZsh{} If there is space for the toy, then compare the joy of}
\PY{c+c1}{\PYZsh{} picking this toy over picking the next toy with more}
\PY{c+c1}{\PYZsh{} space left}
\PY{k}{elif} \PY{n}{toys\PYZus{}space}\PY{p}{[}\PY{n}{i} \PY{o}{\PYZhy{}} \PY{l+m+mi}{1}\PY{p}{]} \PY{o}{\PYZlt{}}\PY{o}{=} \PY{n}{j}\PY{p}{:}
\PY{n}{table}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{[}\PY{n}{j}\PY{p}{]} \PY{o}{=} \PY{n+nb}{max}\PY{p}{(}
\PY{n}{toys\PYZus{}joy}\PY{p}{[}\PY{n}{i} \PY{o}{\PYZhy{}} \PY{l+m+mi}{1}\PY{p}{]} \PY{o}{+} \PY{n}{table}\PY{p}{[}\PY{n}{i} \PY{o}{\PYZhy{}} \PY{l+m+mi}{1}\PY{p}{]}\PY{p}{[}\PY{n}{j} \PY{o}{\PYZhy{}} \PY{n}{wt}\PY{p}{[}\PY{n}{i} \PY{o}{\PYZhy{}} \PY{l+m+mi}{1}\PY{p}{]}\PY{p}{]}\PY{p}{,}
\PY{n}{table}\PY{p}{[}\PY{n}{i} \PY{o}{\PYZhy{}} \PY{l+m+mi}{1}\PY{p}{]}\PY{p}{[}\PY{n}{j}\PY{p}{]}\PY{p}{,}
\PY{p}{)}
\PY{c+c1}{\PYZsh{} Otherwise, consider the next toy}
\PY{k}{else}\PY{p}{:}
\PY{n}{table}\PY{p}{[}\PY{n}{i}\PY{p}{]}\PY{p}{[}\PY{n}{j}\PY{p}{]} \PY{o}{=} \PY{n}{table}\PY{p}{[}\PY{n}{i} \PY{o}{\PYZhy{}} \PY{l+m+mi}{1}\PY{p}{]}\PY{p}{[}\PY{n}{j}\PY{p}{]}
\PY{n}{optimal\PYZus{}joy} \PY{o}{=} \PY{n}{table}\PY{p}{[}\PY{n}{num\PYZus{}toys}\PY{p}{]}\PY{p}{[}\PY{n}{space\PYZus{}left}\PY{p}{]}
\end{Verbatim}

View File

@ -1,3 +1,69 @@
%************************************************
\chapter{Modelling with Constraints}\label{ch:background}
%************************************************
A goal shared between all programming languages is to provide a certain level of
abstraction: an assembly language allows you to abstract from the binary
instructions and memory positions; Low-level imperial languages, like FORTRAN,
were the first to allow you to abstract from the processor architecture of the
target machine; and nowadays writing a program requires little knowledge of the
actual workings of the hardware. Freuder states that the ``Holy Grail'' of
programming languages would be where the user merely states the problem, and the
computer solves it and that constraint modelling is one of the biggest steps
towards this goal to this day \autocite*{freuder-1997-holygrail}. Different
from imperative (and even other declarative) languages, in a constraint
modelling language the modeller does not describe how to solve the problem, but
rather provides the problem requirements. You could say that a constraint model
actually describes the solution to the problem.
For example, let us consider the following scenario: Packing for a weekend trip,
I have to decide which toys to bring for my dog, Audrey. We only have a small
amount of space left in the car, so we cannot bring all the toys. Since Audrey
gets enjoys playing with some toys more than others, we can now try and pick the
toys that bring Audrey the most amount of joy, but still fit in the car.
\begin{program}[ht]
\input{assets/py/2_dyn_knapsack.pytex}
\caption{\label{prog:dyn-knapsack} A Python program that solves a 0-1 knapsack
problem using dynamic programming}
\end{program}
A well educated reader in optimisation problems might immediately recognise that
this is a variation on the widely known \textit{knapsack problem}, more
specifically a \textit{0-1 knapsack problem}
\autocite[13--67]{silvano-1990-knapsack}. A commonly used solution to this
problem is based on dynamic programming. An implementation of this approach is
shown in \cref{prog:dyn-knapsack}. In a naive recursive approach we would try
all different combinations of toys to find the combination that will give the
most joy, but using a dynamic programming approach this exponential behaviour
(on the number of toys) can be avoided.
\begin{model}[ht]
\input{assets/mzn/2_knapsack.mzntex}
\caption{\label{model:knapsack} A \minizinc\ model describing a 0-1 knapsack
problem}
\end{model}
A constraint model offers a different view of the problem. Instead of specifying
the manner in which we can find the solution, we give a concise description of
the problem in terms of what we already know, the \glspl{problem-parameter},
what we wish to know, the \glspl{decision-variable}, and the relationships that
should exists between them, the \glspl{constraint}. \Cref{model:knapsack} shows
a \minizinc\ model of the knapsack problem, where the different elements of the
constraint model are separated. Although a constraint model does not contain any
instructions to find a suitable solutions, these models can generally be given
to a dedicated solving program, or \gls{solver} for short, that can find a
solution that fits the requirements of the model.
\section{Constraint Modelling Basics}
\label{sec:2-constraint-modelling-basics}
\section{Solving Techniques}
\label{sec:2-solving-techniques}
\section{A Comparison of Constraint Modelling Languages}
\label{sec:2-different-languages}
\section{What Makes a ``Good'' Model?}
\label{sec:2-model-quality}