Content deleted Content added
m →Example |
→Example: Fixed typo Tags: Mobile edit Mobile web edit |
||
(48 intermediate revisions by 36 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]]
|