From d2e08fd61248279abe0062b3412217f6e6663db4 Mon Sep 17 00:00:00 2001 From: "Jip J. Dekker" Date: Tue, 13 Jul 2021 18:51:37 +1000 Subject: [PATCH] CML flow figure and more details when comparing languages --- assets/acronyms.tex | 6 +- assets/glossary.tex | 6 +- assets/img/back_cml_flow.pdf | Bin 0 -> 97007 bytes assets/{py => listing}/2_dyn_knapsack.py | 0 assets/{mzn => listing}/6_adaptive.mzn | 0 assets/{mzn => listing}/6_basic_complete.mzn | 0 .../6_basic_complete_transformed.mzn | 0 .../{mzn => listing}/6_gbac_neighbourhood.mzn | 0 assets/{mzn => listing}/6_lns_minisearch.mzn | 0 .../6_lns_minisearch_pred.mzn | 0 .../6_rcpsp_neighbourhood.mzn | 0 assets/{mzn => listing}/6_restart_ann.mzn | 0 assets/{mzn => listing}/6_round_robin.mzn | 0 assets/{mzn => listing}/6_sol_function.mzn | 0 assets/{mzn => listing}/6_state_access.mzn | 0 assets/{mzn => listing}/6_status.mzn | 0 .../6_steelmillslab_neighbourhood.mzn | 0 assets/{mzn => listing}/6_uniform_slv.mzn | 0 assets/listing/back_jsp.mod | 18 ++ assets/listing/back_jsp.mzn | 20 ++ assets/{mzn => listing}/back_knapsack.mzn | 0 assets/listing/back_sgp.essence | 11 + assets/listing/back_sgp.mzn | 25 ++ assets/listing/back_tsp.mod | 18 ++ assets/listing/back_tsp.mzn | 7 + assets/{misc => listing}/intro_open_shop.mod | 0 .../minilns/assign_random.mzn | 0 assets/{mzn => listing}/minilns/basic.mzn | 0 assets/{mzn => listing}/minilns/restart.mzn | 0 assets/{mzn => listing}/prize.mzn | 0 assets/{mzn => listing}/qcp_max.mzn | 0 assets/packages.tex | 1 + chapters/1_introduction.tex | 2 +- chapters/2_background.tex | 259 +++++++++--------- chapters/5_incremental.tex | 28 +- chapters/A2_benchmark.tex | 4 +- 36 files changed, 252 insertions(+), 153 deletions(-) create mode 100644 assets/img/back_cml_flow.pdf rename assets/{py => listing}/2_dyn_knapsack.py (100%) rename assets/{mzn => listing}/6_adaptive.mzn (100%) rename assets/{mzn => listing}/6_basic_complete.mzn (100%) rename assets/{mzn => listing}/6_basic_complete_transformed.mzn (100%) rename assets/{mzn => listing}/6_gbac_neighbourhood.mzn (100%) rename assets/{mzn => listing}/6_lns_minisearch.mzn (100%) rename assets/{mzn => listing}/6_lns_minisearch_pred.mzn (100%) rename assets/{mzn => listing}/6_rcpsp_neighbourhood.mzn (100%) rename assets/{mzn => listing}/6_restart_ann.mzn (100%) rename assets/{mzn => listing}/6_round_robin.mzn (100%) rename assets/{mzn => listing}/6_sol_function.mzn (100%) rename assets/{mzn => listing}/6_state_access.mzn (100%) rename assets/{mzn => listing}/6_status.mzn (100%) rename assets/{mzn => listing}/6_steelmillslab_neighbourhood.mzn (100%) rename assets/{mzn => listing}/6_uniform_slv.mzn (100%) create mode 100644 assets/listing/back_jsp.mod create mode 100644 assets/listing/back_jsp.mzn rename assets/{mzn => listing}/back_knapsack.mzn (100%) create mode 100644 assets/listing/back_sgp.essence create mode 100644 assets/listing/back_sgp.mzn create mode 100644 assets/listing/back_tsp.mod create mode 100644 assets/listing/back_tsp.mzn rename assets/{misc => listing}/intro_open_shop.mod (100%) rename assets/{mzn => listing}/minilns/assign_random.mzn (100%) rename assets/{mzn => listing}/minilns/basic.mzn (100%) rename assets/{mzn => listing}/minilns/restart.mzn (100%) rename assets/{mzn => listing}/prize.mzn (100%) rename assets/{mzn => listing}/qcp_max.mzn (100%) diff --git a/assets/acronyms.tex b/assets/acronyms.tex index 4300345..54c2cb9 100644 --- a/assets/acronyms.tex +++ b/assets/acronyms.tex @@ -24,6 +24,8 @@ \newacronym{cpu}{CPU}{Central Processing Unit} +\newacronym{jsp}{JSP}{Job Shop Problem} + \newacronym[see={[Glossary:]{gls-gbac}}]{gbac}{GBAC\glsadd{gls-gbac}}{Generalised Balanced Academic Curriculum} \newacronym[see={[Glossary:]{gls-lcg}}]{lcg}{LCG\glsadd{gls-lcg}}{Lazy Clause Generation} @@ -54,7 +56,9 @@ \newacronym[see={[Glossary:]{gls-sat}}]{sat}{SAT\glsadd{gls-sat}}{Boolean Satisfiability} +\newacronym{sgp}{SGP}{Social Golfer Problem} + \newacronym[see={[Glossary:]{gls-trs}}]{trs}{TRS\glsadd{gls-trs}}{Term Rewriting System} -\newacronym{tsp}{TSP\glsadd{gls-trs}}{Travelling Salesperson Problem} +\newacronym{tsp}{TSP}{Travelling Salesperson Problem} diff --git a/assets/glossary.tex b/assets/glossary.tex index 57b928b..5966d4d 100644 --- a/assets/glossary.tex +++ b/assets/glossary.tex @@ -466,11 +466,11 @@ \newglossaryentry{partial}{ name={partial}, - description={A function is said to be partial when it does not have a defined result for every possible input. Similarly, an \gls{assignment} is said to be partial when it maps only a subset of the \glspl{parameter} and \glspl{variable} in a }, + description={A function is said to be partial when it does not have a defined result for every possible input. Similarly, an \gls{assignment} is said to be partial when it maps only a subset of the \glspl{parameter} and \glspl{variable} in a \gls{model}.}, } \newglossaryentry{propagation}{ - name={constraint pro\-pa\-ga\-tion}, + name={constraint propagation}, description={}, } @@ -485,7 +485,7 @@ } \newglossaryentry{reif}{ - name={reif}, + name={reification}, description={A reification is a special form of a \gls{constraint} where, instead of the \gls{constraint} being enforced in the \glspl{sol}, it enforces that a \gls{cvar} represents whether the \gls{constraint} holds or not}, } diff --git a/assets/img/back_cml_flow.pdf b/assets/img/back_cml_flow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d9236cbccaf1a5dac8b71f6d08b3dcd9b09e434f GIT binary patch literal 97007 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 0;@\Vlabel{line:back:ampl:parend}@ + +var Take {Paths} binary;@\Vlabel{line:back:ampl:var}@ + +param n := card {Cities};@\Vlabel{line:back:ampl:compstart}@ +set SubSets := 0 .. (2**n - 1); +set PowerSet {k in SubSets} := {i in Cities: (k div 2**(ord(i)-1)) mod 2 = 1};@\Vlabel{line:back:ampl:compend}@ + +minimize TotalCost: sum {(i,j) in Paths} cost[i,j] * Take[i,j];@\Vlabel{line:back:ampl:goal}@ + +subj to Tour {i in S}:@\Vlabel{line:back:ampl:con1}@ + sum {(i,j) in Paths} Take[i,j] + sum {(j,i) in Paths} Take[j,i] = 2; + +subj to SubtourElimation {k in SubSet diff {0,2**n-1}}:@\Vlabel{line:back:ampl:con2}@ + sum {i in PowerSet[k], j in Cities diff PowerSet[k]: (i,j) in Paths} X[i,j] + + sum {i in PowerSet[k], j in Cities diff PowerSet[k]: (j,i) in Paths} X[j,i] >= 2; diff --git a/assets/listing/back_tsp.mzn b/assets/listing/back_tsp.mzn new file mode 100644 index 0000000..de8b681 --- /dev/null +++ b/assets/listing/back_tsp.mzn @@ -0,0 +1,7 @@ +enum CITIES; +array[CITIES, CITIES] of int: cost; + +array[CITIES] of var CITIES: next; +constraint circuit(next); + +solve minimize sum(i in CITIES) (cost[i, next[CITIES]]); diff --git a/assets/misc/intro_open_shop.mod b/assets/listing/intro_open_shop.mod similarity index 100% rename from assets/misc/intro_open_shop.mod rename to assets/listing/intro_open_shop.mod diff --git a/assets/mzn/minilns/assign_random.mzn b/assets/listing/minilns/assign_random.mzn similarity index 100% rename from assets/mzn/minilns/assign_random.mzn rename to assets/listing/minilns/assign_random.mzn diff --git a/assets/mzn/minilns/basic.mzn b/assets/listing/minilns/basic.mzn similarity index 100% rename from assets/mzn/minilns/basic.mzn rename to assets/listing/minilns/basic.mzn diff --git a/assets/mzn/minilns/restart.mzn b/assets/listing/minilns/restart.mzn similarity index 100% rename from assets/mzn/minilns/restart.mzn rename to assets/listing/minilns/restart.mzn diff --git a/assets/mzn/prize.mzn b/assets/listing/prize.mzn similarity index 100% rename from assets/mzn/prize.mzn rename to assets/listing/prize.mzn diff --git a/assets/mzn/qcp_max.mzn b/assets/listing/qcp_max.mzn similarity index 100% rename from assets/mzn/qcp_max.mzn rename to assets/listing/qcp_max.mzn diff --git a/assets/packages.tex b/assets/packages.tex index 3e29a36..2af828e 100644 --- a/assets/packages.tex +++ b/assets/packages.tex @@ -184,6 +184,7 @@ tabsize=2, ]{minizinc}}{\end{minted}} +\newcommand{\plainfile}[1]{\inputminted[autogobble=true,breaklines,breakindent=4em,numbers=left,escapeinside=@@,fontsize=\scriptsize,tabsize=2]{text}{#1}} \newenvironment{plain}{\VerbatimEnvironment{}\begin{minted}[ autogobble=true, breaklines, diff --git a/chapters/1_introduction.tex b/chapters/1_introduction.tex index 22ba317..8d2363a 100644 --- a/chapters/1_introduction.tex +++ b/chapters/1_introduction.tex @@ -52,7 +52,7 @@ We assume that each job has a task for every machine. As an \gls{opt-prb}, our goal is to find an schedule that minimises the finishing time of the last task. \begin{listing} - \pyfile{assets/misc/intro_open_shop.mod} + \pyfile{assets/listing/intro_open_shop.mod} \caption{\label{lst:intro-open-shop} An \glsxtrshort{ampl} model of the open shop problem} \end{listing} diff --git a/chapters/2_background.tex b/chapters/2_background.tex index d58bbf6..e06878a 100644 --- a/chapters/2_background.tex +++ b/chapters/2_background.tex @@ -31,10 +31,16 @@ Or, when this is not possible, prove that no such \gls{assignment} exists. Many \cmls{} also support the modelling of \gls{opt-prb}, where a \gls{dec-prb} is augmented with an \gls{objective}. In this case the goal is to find a \gls{sol} that satisfies all \constraints{} while minimising (or maximising) the value of the \gls{objective}. -\todo{figure that visualises how \cmodels{} + assignments becomes \instance{}, and then rewritten to \gls{slv-mod} and given to a solver.} - Although a \cmodel{} does not contain any instructions on how to find a suitable \gls{sol}, \instances{} of \cmodels{} can generally be given to a dedicated \solver{}. -The \solver{} uses a dedicated algorithm that finds a \gls{sol} that fits the requirements of the \instance{}. +To solve these \instances{}, however, they might have to go through a \gls{rewriting} process to arrive at a \gls{slv-mod}, input accepted by a \solver{}. +The \solver{} then uses a dedicated algorithm that finds a \gls{sol} that fits the requirements of the \instance{}. +This process of a \cml{} is visualised in \cref{fig:back-cml-flow}. + +\begin{figure} + \centering + \includegraphics[width=\columnwidth]{assets/img/back_cml_flow} + \caption{\label{fig:back-cml-flow}A flow diagram of typical process of a \cml{}.} +\end{figure} \begin{example}% \label{ex:back-knapsack} @@ -63,12 +69,12 @@ The \solver{} uses a dedicated algorithm that finds a \gls{sol} that fits the re Finally, the \parameter{} \(C\) gives the numeric value of the total space that is left in the car before packing the toys. This \cmodel{} gives an abstract mathematical definition of the \gls{opt-prb} that would be easy to adjust to changes in the requirements. - To solve \instances{} of this problem, however, these \instances{} have to be rewritten into input accepted by a \solver{}. + To solve \instances{} of this problem, however, the \instances{} have to be rewritten into input accepted by a \solver{}. \Cmls{} are designed to allow the modeller to express combinatorial problems similar to the above mathematical definition and generate input that can be directly used by dedicated \solvers{}. \end{example} % \begin{listing} -% \pyfile{assets/py/2_dyn_knapsack.py} +% \pyfile{assets/listing/2_dyn_knapsack.py} % \caption{\label{lst:2-dyn-knapsack} A Python program that solves a 0-1 knapsack problem using dynamic programming} % \end{listing} @@ -100,7 +106,7 @@ Its expressive language and extensive library of \glspl{global} allow users to e \end{example} \begin{listing} - \mznfile{assets/mzn/back_knapsack.mzn} + \mznfile{assets/listing/back_knapsack.mzn} \caption{\label{lst:back-mzn-knapsack} A \minizinc\ model describing a 0-1 knapsack problem} \end{listing} @@ -864,54 +870,56 @@ Different types of \solvers{} can also have access to different types of \constr \begin{example} - \todo{explain what the TSP problem actually is. Probably needs a reference} - If we consider the well-known travelling salesman problem, then we might model this problem in \gls{ampl} as follows. + Let us consider modelling in \gls{ampl} by considering the well-known \gls{tsp}. + In the \gls{tsp}, we are given a list of cities and the distances between all cities. + The goal of the problem is to find a shortest path that visits all the cities exactly once and returns to its origin. + A possible \cmodel{} for this problem in \gls{ampl} is shown in \cref{lst:back-ampl-tsp}. - \begin{ampl} - set Cities ordered; - set Paths := {i in Cities, j in Cities: ord(i) < ord(j)}; - param cost {Paths} >= 0; - var Take {Paths} binary; + \begin{listing} + \amplfile{assets/listing/back_tsp.mod} + \caption{\label{lst:back-ampl-tsp} An \gls{ampl} model describing the \gls{tsp}} + \end{listing} - param n := card {Cities}; - set SubSets := 0 .. (2**n - 1); - set PowerSet {k in SubSets} := {i in Cities: (k div 2**(ord(i)-1)) mod 2 = 1}; + \Lrefrange{line:back:ampl:parstart}{line:back:ampl:parend} declare the \parameters{} of the \cmodel{}. + The \gls{ampl} model requires a set of names of cities, \texttt{Cities}, as input. + From these cities it declares a set \texttt{Paths} that contain all possible paths between the different cities. + Note how its definition uses a \gls{comprehension} to eliminate symmetric paths. + For each possible paths the model also requires its cost. - minimize TotalCost: sum {(i,j) in Paths} cost[i,j] * Take[i,j]; + On \lref{line:back:ampl:var} we find the declaration for the \variables{} of the model. + For each possible path it decides whether the it is used, yes or no. + The \constraint{} on \lref{line:back:ampl:con1} ensures that for each city, one possible path to the city and one possible path from the city is taken. - subj to Tour {i in S}: - sum {(i,j) in Paths} Take[i,j] + sum {(j,i) in Paths} Take[j,i] = 2; + Crucially, this does yet enforce that the taken variables represent a single path. + It is still possible for so-called subtours to exist, multiple unconnected path that together span all the cities. + A naive way to eliminate these subtours is by forcing that any subset of the set of cities has at least an incoming and an outgoing path. + \Lrefrange{line:back:ampl:compstart}{line:back:ampl:compend} of the model compute all possible subsets of cities. + These are then used by the \constraint{} on \lref{line:back:ampl:con2} to ensure they have the required paths going in and out. - subj to SubtourElimation {k in SubSet diff {0,2**n-1}}: - sum {i in PowerSet[k], j in Cities diff PowerSet[k]: (i,j) in Paths} X[i,j] + - sum {i in PowerSet[k], j in Cities diff PowerSet[k]: (j,i) in Paths} X[j,i] >= 2; - \end{ampl} + Finally, \lref{line:back:ampl:goal} sets the goal of the \gls{ampl} model: to minimize the cost of all the paths taken. - - \todo{extend this paragraph, go over the ampl model, exactly explain what elements related to what part of the \minizinc{} syntax.} This model shows that the \gls{ampl} syntax has many features similar to \minizinc{}. Like \minizinc{}, \gls{ampl} has an extensive expression language, which includes \gls{generator} expressions and a vast collection of \glspl{operator}. The building block of the model are also similar: \parameter{} declarations, \variable{} declarations, \constraints{}, and a solving goal. - The same problem can be modelled in \minizinc\ as follows: + \begin{listing} + \mznfile{assets/listing/back_tsp.mzn} + \caption{\label{lst:back-mzn-tsp} An \minizinc{} model describing the \gls{tsp}} + \end{listing} - \begin{mzn} - enum CITIES; - array[CITIES, CITIES] of int: cost; + A \minizinc{} model for the same problem is shown in \cref{lst:back-mzn-tsp} - array[CITIES] of var CITIES: next; - - constraint circuit(next); - - solve minimize sum(i in CITIES) (cost[i, next[CITIES]]); - \end{mzn} - - Even though the \gls{ampl} is similar to \minizinc{}, the models could not be more different. + Even though the \gls{ampl} has a similar syntax to \minizinc{}, the models could not be more different. The main reason for this difference is the level at which these models are written. + The \gls{ampl} model is written to target a \gls{mip} solver. In the \gls{ampl} language this means that you are required to use the language functionality that is compatible with the targeted \solver{}; in this case, all expression have to be linear equations. + In \minizinc{} the modeller is not constrained in the same way. - The modeller is always encouraged to create high-level \cmodels{}. + It can use the viewpoint of choosing, from each city, to which city to go next. + A \mzninline{circuit} \gls{global} is then used to enforce that these decisions form a single path over all cities. + + In \minizinc{}, the modeller is always encouraged to create high-level \cmodels{}. \minizinc{} then rewrites these models into compatible \glspl{slv-mod}. \end{example} @@ -929,63 +937,57 @@ When solving a scheduling problem, the \gls{opl} makes use of specialised interv \begin{example} - \todo{explain what the job shop problem actually is. Probably needs a reference} - For example the \variable{} declarations and \constraints{} for a job shop problem would look like this in an \gls{opl} model: + Let us consider modelling in \gls{opl}, by considering the well-known \gls{jsp}. + The \gls{jsp} is similar to the open shop problem discussed in the introduction. + Like the open shop problem, we are tasked with scheduling jobs with multiple tasks. + Each task must be performed by an assigned machine. + A machine can only perform one task at the same time. + And, only one task of the same job can be scheduled at the same time. + However, in the \gls{jsp}, the tasks within a job also have a specified order. + Abstracting from the \parameter{} declarations, the possible formulation of the \variable{} declarations and \constraints{} for the \gls{jsp} in \gls{opl} is shown in \cref{lst:back-opl-jsp}. - \begin{plain} - ScheduleHorizon = sum(j in Jobs, t in Tasks) duration[j, t]; - Activity task[j in Jobs, t in Tasks] (duration[j,t]); - Activity makespan; - UnaryResource tool[Machines]; + \begin{listing} + \plainfile{assets/listing/back_jsp.mod} + \caption{\label{lst:back-opl-jsp} An \gls{opl} model describing the \gls{jsp}, abstracting from \parameter{} declarations.} + \end{listing} - minimize makespan.end - subject to { - forall (j in Jobs) - task[j,nbTasks] precedes makespan; + \Lref{line:back:opl:task} declares the \texttt{task} \variables{}, the main \variable{} of in model. + These \variables{} have the type \texttt{Activity}, a special type used to declare any scheduling event with a begin and end time. + \Variables{} of this type are influence by the \texttt{ScheduleHorizon} \parameter{} defined on \lref{line:back:opl:horizon} of the model. + This \parameter{} restricts the time span in which all activities in the \cmodel{} must be scheduled. + On \lref{line:back:opl:con2}, we enforce the order between the different tasks for the same job. + The \constraint{} uses the \texttt{precedes} operator to enforce one activity takes places before another. - forall (j in Jobs) - forall (t in 1..nbTasks-1) - task[j, t] precedes task[j, t+1]; + Another activity is declared on \lref{line:back:opl:makespan}. + The \texttt{makespan} \variable{} represents the time spanned by all tasks. + This is enforced by the \constraint{} on \lref{line:back:opl:con1}. + \Lref{line:back:opl:goal} set the minimisation of \texttt{makespan} to be the goal of the model. - forall (j in Jobs) - forall (t in Tasks) - task[j, t] requires tool[resource[j, t]]; - }; - \end{plain} + Resources are important notions in \gls{opl}. + A resource can be any requirement of an activity. + On \lref{line:back:opl:resources} a \texttt{UnaryResource} is declared for every machine. + A \texttt{UnaryResource} can be used by at most one activity at a time. + The \constraint{} on \lref{line:back:opl:con3} ensures that at most one task activity can use same machine at the same time. + The \constraint{} uses the \texttt{requires} operator to bind an activity to a resource. - \todo{extend this paragraph, go over the opl model, exactly explain what elements related to what part of the \minizinc{} syntax.} - The equivalent declarations and \constraints{} would look like this in \minizinc{}: + \begin{listing} + \mznfile{assets/listing/back_jsp.mzn} + \caption{\label{lst:back-mzn-jsp} An \minizinc{} model describing the \gls{jsp}, abstracting from \parameter{} declarations.} + \end{listing} - \begin{mzn} - int: horizon = sum(j in Jobs, t in Tasks)(duration[j,t]); - var 0..horizon: makespan; - array[JOB,TASK] of var 0..maxt: start; + A fragment of a \minizinc{} model modelling the same parts of \gls{jsp} is shown in \cref{lst:back-mzn-jsp}. + + Notably, \minizinc{} does not have explicit activity \variables{}. + It instead uses integer \variables{} that represent the start times of the tasks and the time at which all tasks are finished. + This means that much of the implicit behaviour of the \texttt{Activity} \variables{} has to be defined explicitly. + Where in the \gls{opl} model we could just state a global scheduling horizon, in \minizinc{} it has to be explicitly included in the \domains{} of the time \variables{}. + And, instead of a \texttt{precedes} operator, we have to explicitly enforce the precedence of tasks using linear \constraints{}. - constraint forall(j in Jobs, t in 1..nbTasks-1) ( - start[j,t] + duration[j,t] <= start[j,t+1] - ); - - constraint forall(j in Jobs) ( - start[j, nbTasks] + duration[j, nbTasks] <= makespan - ); - - constraint forall(m in Machines) ( - disjunctive( - [start[j,t] | j in Jobs, t in Tasks where resource[j,t] == m], - [duration[j,t] | j in Jobs, t in Tasks where resource[j,t] == m], - ) - ); - - solve minimize makespan; - \end{mzn} - - Note that the \minizinc{} model does not have explicit Activity \variables{}. - It must instead use \variables{} that represent the start times of the activity and a \variable{} to represent the time at which all activities are finished. - The \gls{opl} model also has the advantage that it first states the resource objects and then uses the \texttt{requires} keyword to force tasks on the same machine to be mutually exclusive. + The \gls{opl} model also has the advantage of its resource syntax. + It first states the resource objects and then merely has to use the \texttt{requires} keyword to force tasks on the same machine to be mutually exclusive. In \minizinc{} the same requirement is implemented through the use of \mzninline{disjunctive} constraints. Although this has the same effect, all mutually exclusive jobs have to be combined in a single statement in the model. This might make it harder in \minizinc{} to write the correct \constraint{} and its meaning might be less clear. - \end{example} The \gls{opl} also contains a specialised search syntax that is used to instruct its solvers \autocite{van-hentenryck-2000-opl-search}. @@ -1025,64 +1027,57 @@ Partitions are defined for finite types: Booleans, enumerated types, or a restri \begin{example} - \todo{explain what the job shop problem actually is. Probably needs a reference} - Consider, for example, the Social Golfers Problem, can be modelled in \gls{essence} as follows: + Let us consider modelling in \gls{essence} by considering the well-known \gls{sgp}. + The \gls{sgp} considers a community of golfers that plans games of golf for a set number of weeks. + Every week all the golfers are split into groups of equal size and each group plays a game of golf. + The goals of the problem is find a way to split the groups different every week, such that no two golfers will meet each other twice. + Two golfers can only be part of the same group once. + A \cmodel{} for the \gls{sgp} in \gls{essence} can be seen in \cref{lst:back-essence-sgp}. - \begin{plain} - language Essence 1.3 + \begin{listing} + \plainfile{assets/listing/back_sgp.essence} + \caption{\label{lst:back-essence-sgp} An \gls{essence} model describing the \gls{sgp}} + \end{listing} - given w, g, s : int(1..) + The \gls{essence} model starts with the preamble declaring the version of the language that is used. + All the \parameters{} of the \cmodel{} are declared on line \lref{line:back:essence:pars}: \texttt{weeks} is the number of weeks to be considered, \texttt{groups} is the number of groups of golfers, and \texttt{size} is the size of each group. + The input for the \parameters{} is checked to ensure that they take a value that is one or higher. + \Lref{line:back:essence:ntype} then uses the \parameters{} to declares a new type to represent the golfers. - letting Golfers be new type of size g * s + Most of the problem is modelled in the \variable{} declared on \lref{line:back:essence:var}. + It declares a \variable{} that is a set of partitions of the golfers. + The choice in \variable already contains some of the implied constraints. + Because the \variable{} reasons about partitions of the golfers, a correct assignment is already guaranteed to correctly split the golfers into groups. + The usage of a set of size \texttt{weeks} means that we directly reason about that number of partitions that have to be unique. - find sched : set (size w) of - partition (regular, numParts g, partSize s) from Golfers + The type of the \variable{} does, however, not guarantee that the no two golfers will not meet each other twice. + Therefore, a \constraint{} that enforces this is found on \lref{line:back:essence:con}. + Notably, the \texttt{together} function tests whether two elements are in the same part of a partition. - such that - - forAll g1, g2 : Golfers, g1 < g2 . - (sum week in sched . toInt(together({g1, g2}, week))) <= 1 - \end{plain} - - \todo{extend this paragraph, go over the opl model, exactly explain what elements related to what part of the \minizinc{} syntax.} - In \minizinc{} the same problem could be modelled as: - - \begin{mzn} - include "globals.mzn"; - - int: g; - int: w; - int: s; - - enum: golfers = anon_enum(g * s); - - set of int: groups = 1..g; - set of int: rounds = 1..w; - array [rounds, groups] of var set of golfers: group; - - constraint forall (r in rounds, g in groups) ( - card(group[r, g]) = s - ); - - constraint forall(r in rounds) ( - all_disjoint(g in groups)(group[r, g]) - ); - - constraint forall (a, b in golfers where a < b) ( - sum (r in rounds, g in groups) ( - {a, b} subset group[r, g] - ) <= 1 - ); - \end{mzn} + A \minizinc{} the same problem could be modelled can be found in \cref{lst:back-mzn-sgp}. + The \minizinc{} model start similar to the essence model, in the declaration of the \parameters{} and a type for the golfers. + The differences start from the declaration of the \variables{}. + The \minizinc{} model is unable to use a set of partitions and instead uses a array of sets. + Each set represents a single group in a single week. Note that, through the \gls{essence} type system, the first two \constraints{} in the \minizinc{} are implied in the \gls{essence} model. This is an example where the use of high-level types helps give the modeller create more concise models. + Apart from syntax and the \variable{} viewpoint, the \constraint{} that enforces that golfers only occur in the same group once is identical. + + \begin{listing} + \mznfile{assets/listing/back_sgp.mzn} + \caption{\label{lst:back-mzn-sgp} An \minizinc{} model describing the \gls{sgp}} + \end{listing} \end{example} -The high-level \variables{} available in \gls{essence} are often not \gls{native} to \solvers{}. -To solve an \instance{}, not only do the \constraints{} have to be translated to \constraints{} \gls{native} to the \solver{}, but also all \variables{} have to be translated to a combination of \constraints{} and \variables{} \gls{native} to the \solver{}. -\todo{This needs a note that though \minizinc{} might also need transformation of the \variables{}, \gls{essence} will need to make more decisions along the way. It is generally easier to turn for example a integer into Booleans than the high-level transformations that they do.} +\Gls{essence} allows the use of many high-level \variable{} and \constraints{} on these \variables{}. +Since these types of \variables{} are often not \gls{native} to the \solver{}. +\Gls{rewriting} will translate these types into \gls{native} \variables{} and \constraints{}. +However, along the way there can be many decisions about the representation used for the \solver{}. +There are often multiple ways to represent a high-level \variable{}, or how to enforce its implicit \constraints{}. +Unlike \minizinc{}, \Gls{essence} does not allow modellers or \solvers{} to influence this process directly. +The process is internal to the \gls{essence} compiler. \section{Term Rewriting}% \label{sec:back-term} diff --git a/chapters/5_incremental.tex b/chapters/5_incremental.tex index 892da84..3029cdc 100644 --- a/chapters/5_incremental.tex +++ b/chapters/5_incremental.tex @@ -30,12 +30,12 @@ For each decision variable \mzninline{x[i]}, it draws a random number from a uni For example, \mzninline{uniform_neighbourhood(x, 0.2)} would result in each variable in the array \mzninline{x} having a 20\% chance of being unconstrained, and an 80\% chance of being assigned to the value it had in the previous solution. \begin{listing} - \mznfile{assets/mzn/6_lns_minisearch_pred.mzn} + \mznfile{assets/listing/6_lns_minisearch_pred.mzn} \caption{\label{lst:6-lns-minisearch-pred} A simple random \gls{lns} predicate implemented in \minisearch{}} \end{listing} \begin{listing} - \mznfile{assets/mzn/6_lns_minisearch.mzn} + \mznfile{assets/listing/6_lns_minisearch.mzn} \caption{\label{lst:6-lns-minisearch} A simple \gls{lns} \gls{meta-search} implemented in \minisearch{}} \end{listing} @@ -81,7 +81,7 @@ The other \mzninline{restart_X} annotations define different strategies for rest The \mzninline{timeout} annotation gives an overall time limit for the search, whereas \mzninline{restart_limit} stops the search after a fixed number of restarts. \begin{listing} - \mznfile{assets/mzn/6_restart_ann.mzn} + \mznfile{assets/listing/6_restart_ann.mzn} \caption{\label{lst:6-restart-ann} New annotations to control the restarting behaviour} \end{listing} @@ -106,7 +106,7 @@ Function \mzninline{status} returns the status of the previous restart, namely: Function \mzninline{last_val} (which, like \mzninline{sol}, has versions for all basic variable types) allows modellers to access the last value assigned to a variable (the value is undefined if \mzninline{status()=START}). \begin{listing} - \mznfile{assets/mzn/6_state_access.mzn} + \mznfile{assets/listing/6_state_access.mzn} \caption{\label{lst:6-state-access} Functions for accessing previous solver states} \end{listing} @@ -132,7 +132,7 @@ Therefore, users have to define their overall strategy in a new predicate. \Cref{lst:6-basic-complete} shows a complete example of a basic \gls{lns} model. \begin{listing} - \mznfile{assets/mzn/6_basic_complete.mzn} + \mznfile{assets/listing/6_basic_complete.mzn} \caption{\label{lst:6-basic-complete} Complete \gls{lns} example} \end{listing} @@ -147,7 +147,7 @@ In any following restart, \mzninline{select} is incremented modulo \mzninline{N} \noindent{}This will activate a different neighbourhood for each restart (\lref{line:6:roundrobin:post}). \begin{listing} - \mznfile{assets/mzn/6_round_robin.mzn} + \mznfile{assets/listing/6_round_robin.mzn} \caption{\label{lst:6-round-robin} A predicate providing the round-robin meta-heuristic} \end{listing} @@ -158,7 +158,7 @@ For adaptive \gls{lns}, a simple strategy is to change the size of the neighbour \Cref{lst:6-adaptive} shows an adaptive version of the \mzninline{uniform_neighbourhood} that increases the number of free variables when the previous restart failed, and decreases it when it succeeded, within the bounds \([0.6,0.95]\). \begin{listing} - \mznfile{assets/mzn/6_adaptive.mzn} + \mznfile{assets/listing/6_adaptive.mzn} \caption{\label{lst:6-adaptive} A simple adaptive neighbourhood} \end{listing} @@ -309,7 +309,7 @@ We can compile models that contain the new built-ins by extending the \minizinc\ It simply replaces the functional form by a predicate \mzninline{status} (declared in \lref{line:6:status}), which constrains its local variable argument \mzninline{stat} to take the status value. \begin{listing} - \mznfile{assets/mzn/6_status.mzn} + \mznfile{assets/listing/6_status.mzn} \caption{\label{lst:6-status} MiniZinc definition of the \mzninline{status} function} \end{listing} @@ -323,7 +323,7 @@ Otherwise, we replace the function call with a type specific \mzninline{int_sol} \begin{listing} - \mznfile{assets/mzn/6_sol_function.mzn} + \mznfile{assets/listing/6_sol_function.mzn} \caption{\label{lst:6-int-sol} MiniZinc definition of the \mzninline{sol} function for integer variables} \end{listing} @@ -340,7 +340,7 @@ The MiniZinc definition of the \mzninline{uniform_nbh} function is shown in \Cre Note that the function accepts variable arguments \mzninline{l} and \mzninline{u}, so that it can be used in combination with other functions, such as \mzninline{sol}. \begin{listing} - \mznfile{assets/mzn/6_uniform_slv.mzn} + \mznfile{assets/listing/6_uniform_slv.mzn} \caption{\label{lst:6-int-rnd} MiniZinc definition of the \mzninline{uniform_nbh} function for floats} \end{listing} @@ -402,7 +402,7 @@ We have omitted the similar code generated for \mzninline{x[2]} to \mzninline{x[ Note that the \flatzinc\ shown here has been simplified for presentation. \begin{listing} - \mznfile{assets/mzn/6_basic_complete_transformed.mzn} + \mznfile{assets/listing/6_basic_complete_transformed.mzn} \caption{\label{lst:6-flat-pred} \flatzinc{} that results from compiling \\ \mzninline{basic_lns(uniformNeighbourhood(x,0.2))}.} \end{listing} @@ -648,7 +648,7 @@ The restart strategy is % GBAC \begin{listing}[b] - \mznfile{assets/mzn/6_gbac_neighbourhood.mzn} + \mznfile{assets/listing/6_gbac_neighbourhood.mzn} \caption{\label{lst:6-free-period}\texttt{gbac}: neighbourhood freeing all courses in a period.} \end{listing} @@ -677,7 +677,7 @@ However, \gls{lns} again significantly improves over standard Chuffed. \subsubsection{\texttt{steelmillslab}} \begin{listing} - \mznfile{assets/mzn/6_steelmillslab_neighbourhood.mzn} + \mznfile{assets/listing/6_steelmillslab_neighbourhood.mzn} \caption{\label{lst:6-free-bin}\texttt{steelmillslab}: Neighbourhood that frees all orders assigned to a selected slab.} \end{listing} @@ -711,7 +711,7 @@ Still, \chuffedMzn\ outperforms \chuffedStd\ by always finding an optimal soluti \subsubsection{\texttt{rcpsp-wet}} \begin{listing} - \mznfile{assets/mzn/6_rcpsp_neighbourhood.mzn} + \mznfile{assets/listing/6_rcpsp_neighbourhood.mzn} \caption{\label{lst:6-free-timeslot}\texttt{rcpsp-wet}: Neighbourhood freeing all tasks starting in the drawn interval.} \end{listing} diff --git a/chapters/A2_benchmark.tex b/chapters/A2_benchmark.tex index 10391d7..9de7c0a 100644 --- a/chapters/A2_benchmark.tex +++ b/chapters/A2_benchmark.tex @@ -276,7 +276,7 @@ The data and original model are available at: \end{center} \begin{listing} - \mznfile{assets/mzn/prize.mzn} + \mznfile{assets/listing/prize.mzn} \caption{\label{lst:bench-prize} A \minizinc{} model for the Prize Collecting Path problem} \end{listing} @@ -291,7 +291,7 @@ The data and original model are available at: \end{center} \begin{listing} - \mznfile{assets/mzn/qcp_max.mzn} + \mznfile{assets/listing/qcp_max.mzn} \caption{\label{lst:bench-qcpmax} A \minizinc{} model for the QCP-Max problem} \end{listing}