Content deleted Content added
it's older than 2000, c.f. Knuth's paper on dancing links among others (where k. refers to dlx being used in 1999). it's just knuth's name for "trial-and-error" |
→Example: Fixed typo Tags: Mobile edit Mobile web edit |
||
(46 intermediate revisions by 34 users not shown) | |||
Line 1:
{{Short description|Algorithm for exact cover problem}}
'''Algorithm X''' is an [[algorithm]] for solving the [[exact cover]] problem. It is a straightforward [[Recursion (computer science)|recursive]], [[Nondeterministic algorithm|nondeterministic]], [[depth-first]], [[backtracking]] algorithm used by [[Donald Knuth]] to demonstrate an efficient implementation called DLX, which uses the [[dancing links]] technique.<ref name="knuth">{{cite arXiv | author = Knuth, Donald | author-link = Donald Knuth | title = Dancing links | year = 2000 | eprint = cs/0011047 }}</ref><ref>{{Cite journal |last=Banerjee |first=Bikramjit |last2=Kraemer |first2=Landon |last3=Lyle |first3=Jeremy |date=2010-07-04 |title=Multi-Agent Plan Recognition: Formalization and Algorithms |url=https://ojs.aaai.org/index.php/AAAI/article/view/7746 |journal=Proceedings of the AAAI Conference on Artificial Intelligence |volume=24 |issue=1 |pages=1059–1064 |doi=10.1609/aaai.v24i1.7746 |issn=2374-3468|doi-access=free }}</ref>
The goal is to select a subset of the rows so that the digit 1 appears in each column exactly once.▼
==Algorithm
▲The exact cover problem is represented in Algorithm X by an [[incidence matrix]] ''A'' consisting of 0s and 1s. The goal is to select a subset of the rows
Algorithm X works as follows:
|▼
# If the matrix ''A''
# Otherwise choose a column ''c'' ([[deterministic algorithm|deterministically]]).
# Choose a row ''r'' such that ''A''<sub>''r'', ''c''</sub> = 1 ([[nondeterministic algorithm|nondeterministically]]).
Line 12 ⟶ 13:
# For each column ''j'' such that ''A''<sub>''r'', ''j''</sub> = 1,
#: for each row ''i'' such that ''A''<sub>''i'', ''j''</sub> = 1,
#:: delete row ''i'' from matrix ''A''
#: delete column ''j'' from matrix ''A''.
# Repeat this algorithm recursively on the reduced matrix ''A''.
|}▼
The nondeterministic choice of ''r'' means that the algorithm
If column ''c'' is entirely zero, there are no subalgorithms and the process terminates unsuccessfully.
Line 24 ⟶ 25:
Any systematic rule for choosing column ''c'' in this procedure will find all solutions, but some rules work much better than others.
To reduce the number of iterations,
==
For example, consider the exact cover problem specified by the universe ''U'' = {1, 2, 3, 4, 5, 6, 7} and the collection of sets
:* ''A'' = {1, 4, 7};
:* ''B'' = {1, 4};
Line 37 ⟶ 38:
This problem is represented by the matrix:
:{| class="wikitable"
! !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7
|-
Line 67 ⟶ 68:
Step 2—The lowest number of 1s in any column is two. Column 1 is the first column with two 1s and thus is selected (deterministically):
:{| class="wikitable"
! !!
|-
! ''A''
Line 99 ⟶ 100:
: Step 5—Row ''A'' has a 1 in columns 1, 4, and 7:
::{| class="wikitable"
! !! <span style="color:blue">1</span> !! 2 !! 3 !! <span style="color:blue">4</span> !! 5 !! 6 !! <span style="color:blue">7</span>
|-
Line 121 ⟶ 122:
|}
: Column 1 has a 1 in rows ''A'' and ''B''; column 4 has a 1 in rows ''A'', ''B'', and ''C''; and column 7 has a 1 in rows ''A'', ''C'', ''E'', and ''F''. Thus, rows ''A'', ''B'', ''C'', ''E'', and ''F'' are to be removed and columns 1, 4 and 7 are to be removed:
::{| class="wikitable"
! !! <span style="color:red">1</span> !! 2 !! 3 !! <span style="color:red">4</span> !! 5 !! 6 !! <span style="color:red">7</span>
|-
Line 145 ⟶ 146:
|}
: Row ''D'' remains and columns 2, 3, 5, and 6 remain:
::{| class="wikitable"
! !! 2 !! 3 !! 5 !! 6
|-
Line 158 ⟶ 159:
: Step 2—The lowest number of 1s in any column is zero and column 2 is the first column with zero 1s:
::{| class="wikitable"
! !! <span style="color:red">2</span> !! 3 !! 5 !! 6
|-
Line 174 ⟶ 175:
: Row ''B'' has a 1 in columns 1 and 4:
::{| class="wikitable"
! !! <span style="color:blue">1</span> !! 2 !! 3 !! <span style="color:blue">4</span> !! 5 !! 6 !! 7
|-
Line 196 ⟶ 197:
|}
: Column 1 has a 1 in rows ''A'' and ''B''; and column 4 has a 1 in rows ''A'', ''B'', and ''C''. Thus, rows ''A'', ''B'', and ''C'' are to be removed and columns 1 and 4 are to be removed:
::{| class="wikitable"
! !! <span style="color:red">1</span> !! 2 !! 3 !! <span style="color:red">4</span> !! 5 !! 6 !! 7
|-
Line 220 ⟶ 221:
|}
: Rows ''D'', ''E'', and ''F'' remain and columns 2, 3, 5, 6, and 7 remain:
::{| class="wikitable"
! !! 2 !! 3 !! 5 !! 6 !! 7
|-
Line 239 ⟶ 240:
: Step 2—The lowest number of 1s in any column is one. Column 5 is the first column with one 1 and thus is selected (deterministically):
::{| class="wikitable"
! !! 2 !! 3 !! <span style="color:red">5</span> !! 6 !! 7
|-
Line 262 ⟶ 263:
:: Step 5—Row ''D'' has a 1 in columns 3, 5, and 6:
:::{| class="wikitable"
! !! 2 !! <span style="color:blue">3</span> !! <span style="color:blue">5</span> !! <span style="color:blue">6</span> !! 7
|-
Line 275 ⟶ 276:
|}
:: Column 3 has a 1 in rows ''D'' and ''E''; column 5 has a 1 in row ''D''; and column 6 has a 1 in rows ''D'' and ''E''. Thus, rows ''D'' and ''E'' are to be removed and columns 3, 5, and 6 are to be removed:
:::{| class="wikitable"
! !! 2 !! <span style="color:red">3</span> !! <span style="color:red">5</span> !! <span style="color:red">6</span> !! 7
|-
Line 290 ⟶ 291:
|}
:: Row ''F'' remains and columns 2 and 7 remain:
:::{| class="wikitable"
! !! 2 !! 7
|-
Line 301 ⟶ 302:
:: Step 1—The matrix is not empty, so the algorithm proceeds.
:: Step 2—The lowest number of 1s in any column is one. Column 2 is the first column with one 1 and thus is selected (deterministically)
:::{| class="wikitable"
! !! <span style="color:red">2</span> !! 7
▲|-
! ''F''
| <span style="color:red;font-weight:bold">1</span> || 1
▲|}
:: Row ''F'' has a 1 in column 2 and thus is selected (nondeterministically).
Line 313 ⟶ 321:
::: Row ''F'' has a 1 in columns 2 and 7:
::::{|
! !! <span style="color:blue">2</span> !! <span style="color:blue">7</span>
|-
Line 320 ⟶ 328:
|}
::: Column 2 has a 1 in row ''F''; and column 7 has a 1 in row ''F''. Thus, row ''F'' is
::::{|
! !! <span style="color:red">2</span> !! <span style="color:red">7</span>
|-
! <span style="color:blue">''F''</span>
| <span style="color:red;font-weight:bold">1</span> || <span style="color:red;font-weight:bold">1</span>
|}
::: No rows and no columns remain:
::::{| class="wikitable"
!
|}
::: Step 1—The matrix is empty, thus this branch of the algorithm terminates successfully.
::: As rows ''B'', ''D'', and ''F''
::::{|
! !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7
|-
Line 356 ⟶ 370:
There are no branches at level 0, thus the algorithm terminates.
In summary, the algorithm determines there is only one exact cover:
==
==
*
*
==
{{Reflist}}
*{{citation
| first = Donald E. | last = Knuth |
| contribution = Dancing links
| title = Millennial Perspectives in Computer Science: Proceedings of the 1999 Oxford-Microsoft Symposium in Honour of Sir Tony Hoare
Line 373 ⟶ 388:
| pages = 187–214
| publisher = Palgrave
| isbn =
| editor1-first = Jim | editor1-last = Davies
| editor2-first = Bill | editor2-last = Roscoe
| editor3-first = Jim | editor3-last = Woodcock
|
==External links==
*[https://www.ocf.berkeley.edu/~jchu/publicportal/sudoku/0011047.pdf Knuth's paper] - PDF file (also {{ArXiv|cs/0011047}})
*[http://www-cs-faculty.stanford.edu/~uno/papers/dancing-color.ps.gz Knuth's Paper describing the Dancing Links optimization] - Gzip'd postscript file.
{{Donald Knuth navbox}}
[[Category:Search algorithms]]
|