Fix the diagonals for the MIP N-Queens

This commit is contained in:
Jip J. Dekker 2021-05-18 19:33:16 +10:00
parent df40f93cf1
commit b3a497f71d
No known key found for this signature in database
GPG Key ID: 517DF4A00618C9C3

View File

@ -842,11 +842,14 @@ can then be rewritten as linear \glspl{constraint} using the \glspl{variable}
following model shows a integer program of this problem.
\begin{align}
\text{given} \hspace{2em} & N = {1,\ldots,n} & \\
\text{maximise} \hspace{2em} & 0 & \\
\text{subject to} \hspace{2em} & q_{i} \in \{1,\ldots{},n\} & \forall_{i=1}^{n} \\
& y_{ij} \in \{0,1\} & \forall_{i=1}^{n} \forall_{j=1}^{n} \\
\label{line:back-mip-channel} & x_{i} = \sum_{j=1}^{n} j * y_{ij} & \forall_{i=1}^{n} \\
\label{line:back-mip-row} & \sum_{i=1}^{n} y_{ij} \leq 1 & \forall_{j=1}^{n}
\text{subject to} \hspace{2em} & q_{i} \in N & \forall_{i \in N} \\
& y_{ij} \in \{0,1\} & \forall_{i,j \in N} \\
\label{line:back-mip-channel} & x_{i} = \sum_{j \in N} j * y_{ij} & \forall_{i \in N} \\
\label{line:back-mip-row} & \sum_{i \in N} y_{ij} \leq 1 & \forall_{j \in N} \\
\label{line:back-mip-diag1} & \sum_{i,j \in N. i + j =k} y_{ij} \leq 1 & \forall_{k=3}^{2n-1} \\
\label{line:back-mip-diag2} & \sum_{i,j \in N. i - j =k} y_{ij} \leq 1 & \forall_{k=2-n}^{n-2}
\end{align}
@ -857,10 +860,8 @@ can then be rewritten as linear \glspl{constraint} using the \glspl{variable}
\(q\). The \cref{line:back-mip-channel} is used to connect the \(q\) and \(y\)
\glspl{variable} and make sure that their values correspond.
\Cref{line:back-mip-row} ensures that only one queen is placed in the same
row.
\jip{TODO: Fix diagonals}
row. Finally, \cref{line:back-mip-diag1,line:back-mip-diag2} constrain all
diagonals to contain only one queen.
\end{example}
\subsection{Boolean Satisfiability}%
@ -900,13 +901,13 @@ most efficient way to solve the problem.
\gls{sat} encoding for this problem is the following.
\begin{align}
\text{given} \hspace{2em} & n & \\
\text{find} \hspace{2em} & q_{ij} \in \{\text{true}, \text{false}\} & \forall_{i=1}^{n}\forall_{j=1}^{n} \\
\label{line:back-sat-at-least}\text{subject to} \hspace{2em} & \exists_{j=1}^{n} q_{ij} & \forall_{i=1}^{n} \\
\label{line:back-sat-row}& \neg q_{ij} \lor \neg q_{ik} & \forall_{i=1}^{n} \forall_{j=1}^{n} \forall_{k=j}^{n}\\
\label{line:back-sat-col}& \neg q_{ij} \lor \neg q_{kj} & \forall_{i=1}^{n} \forall_{j=1}^{n} \forall_{k=i}^{n}\\
\label{line:back-sat-diag1}& \neg q_{ij} \lor \neg q_{(i+k)(j+k)} & \forall_{i=1}^{n} \forall_{j=1}^{n} \forall_{k=1}^{min(n-i, n-j)}\\
\label{line:back-sat-diag2}& \neg q_{ij} \lor \neg q_{(i+k)(j-k)} & \forall_{i=1}^{n} \forall_{j=1}^{n} \forall_{k=1}^{min(n-i, j)}
\text{given} \hspace{2em} & N = {1,\ldots,n} & \\
\text{find} \hspace{2em} & q_{ij} \in \{\text{true}, \text{false}\} & \forall_{i,j \in N} \\
\label{line:back-sat-at-least}\text{subject to} \hspace{2em} & \exists_{j \in N} q_{ij} & \forall_{i \in N} \\
\label{line:back-sat-row}& \neg q_{ij} \lor \neg q_{ik} & \forall_{i,j \in N} \forall_{k=j}^{n}\\
\label{line:back-sat-col}& \neg q_{ij} \lor \neg q_{kj} & \forall_{i,j \in N} \forall_{k=i}^{n}\\
\label{line:back-sat-diag1}& \neg q_{ij} \lor \neg q_{(i+k)(j+k)} & \forall_{i,j \in N} \forall_{k=1}^{min(n-i, n-j)}\\
\label{line:back-sat-diag2}& \neg q_{ij} \lor \neg q_{(i+k)(j-k)} & \forall_{i,j \in N} \forall_{k=1}^{min(n-i, j)}
\end{align}
The encoding of the problem uses a Boolean \gls{variable} for every position