Content deleted Content added
mNo edit summary |
→Example: Fixed typo Tags: Mobile edit Mobile web edit |
||
(10 intermediate revisions by 7 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>
==Algorithm==
The exact cover problem is represented in Algorithm X by
Algorithm X
# If the matrix ''A'' has no columns, the current partial solution is a valid solution; terminate successfully.
# Otherwise choose a column ''c'' ([[deterministic algorithm|deterministically]]).
Line 15 ⟶ 16:
#: delete column ''j'' from matrix ''A''.
# Repeat this algorithm recursively on the reduced matrix ''A''.
}}▼
The nondeterministic choice of ''r'' means that the algorithm recurses over independent subalgorithms; each subalgorithm inherits the current matrix ''A'', but reduces it with respect to a different row ''r''.
Line 27 ⟶ 28:
==Example==
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"
! !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7
|-
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 123 ⟶ 124:
: 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 147 ⟶ 148:
: 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 198 ⟶ 199:
: 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 222 ⟶ 223:
: 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 277 ⟶ 278:
:: 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 292 ⟶ 293:
:: 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 322 ⟶ 330:
::: Column 2 has a 1 in row ''F''; and column 7 has a 1 in row ''F''. Thus, row ''F'' is to be removed and columns 2 and 7 are to be removed:
::::{|
! !! <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:
==Implementations==
==See also==
|