크누스의 알고리즘 X

Knuth's Algorithm X

알고리즘 X정확한 커버 문제를 해결하기 위한 알고리즘이다.도날드 크누스댄싱 링크 기법을 사용하는 DLX라는 효율적인 구현을 시연하기 위해 사용하는 간단한 재귀성, 비결정성, 깊이 우선의 역추적 알고리즘이다.[1]

정확한 커버 문제는 알고리즘 X에 0s와 1s로 구성된 매트릭스 A로 표시된다.목표는 각 열에 숫자 1이 정확히 한 번 나타나도록 행의 하위 집합을 선택하는 것이다.

알고리즘 X는 다음과 같이 기능한다.

# 매트릭스 A에 열이 없는 경우, 현재의 부분 솔루션은 유효한 솔루션이며, 성공적으로 종료된다.
  1. 그렇지 않으면 c 열을 선택하십시오(결정적으로).
  2. Ar, c = 1(비정규적으로)과 같은 r을 선택하십시오.
  3. 부분 용액에 r 행을 포함하십시오.
  4. Ar, j = 1과 같은 각 열 j에 대해,
    Ai, j = 1과 같은 각 행 i에 대해,
    행렬 A에서 행 i를 삭제한다.
    행렬 A에서 열 j를 삭제한다.
  5. 감소된 매트릭스 A에 대해 이 알고리즘을 반복한다.

r의 비결정론적 선택은 알고리즘이 독립적인 하위 알고리즘에 대해 반복된다는 것을 의미한다. 각 하위 알고리즘은 현재 행렬 A를 상속하지만 다른 행 r에 대해서는 이를 감소시킨다.c 열이 완전히 0이면 하위 알고리즘이 없고 프로세스가 성공적으로 종료되지 않는다.

서브알고리즘은 원래 문제가 근본에 있고 레벨 k선택된 행에 해당하는 각 서브알고리즘을 포함하는 자연적인 방법으로 검색 트리를 형성한다.역추적이란 먼저 나무를 선주문, 깊이부터 가로지르는 과정이다.

이 절차에서 c 컬럼을 선택하기 위한 어떤 체계적인 규칙은 모든 해결책을 찾을 것이지만, 어떤 규칙은 다른 규칙보다 훨씬 더 잘 작동한다.Knuth는 반복 횟수를 줄이기 위해 컬럼 선택 알고리즘이 가장 적은 1s의 열을 선택할 것을 제안한다.

예를 들어 우주 U = {1, 2, 3, 4, 5, 6, 7} 및 = {A, B, C, D, E, F} 집합에서 지정한 정확한 커버 문제를 고려하십시오. 여기서:

  • A = {1, 4, 7};
  • B = {1, 4};
  • C = {4, 5, 7};
  • D = {3, 5, 6};
  • E = {2, 3, 6, 7} 및
  • F = {2, 7}.

이 문제는 다음 행렬로 나타난다.

1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1

Knuth가 제안하는 칼럼 선택용 휴리스틱을 가진 알고리즘 X는 다음과 같이 이 문제를 해결한다.

레벨 0

1단계—매트릭스가 비어 있지 않으므로 알고리즘이 계속 진행하십시오.

2단계—모든 열에서 가장 낮은 1초 수는 2이다.1열은 두 개의 1초를 가진 첫 번째 열이므로 (결정적으로) 선택된다.

1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1

3단계—A열B열은 각각 1열로 되어 있으므로(비교적) 선택된다.

알고리즘은 레벨 1에서 첫 번째 분기로 이동한다.

레벨 1: A행 선택
4단계—A행은 부분 솔루션에 포함되어 있다.
5단계—A열은 1, 4, 7열에 1이 있음:
1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1
1열은 A열B열에 1이 있고, 4열은 A열, B열, C열에 1이 있으며, 7열A열, C열, E열, F열에 1이 있다.따라서 A, B, C, E, F 행을 제거하고 1, 4, 7 열을 제거한다.
1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1
D행은 남고 2, 3, 5, 6열은 남는다.
2 3 5 6
D 0 1 1 1
1단계—매트릭스가 비어 있지 않으므로 알고리즘이 계속 진행하십시오.
2단계—모든 열의 최저 1초 수는 0이고 2열은 0초인 첫 번째 열:
2 3 5 6
D 0 1 1 1
따라서 알고리즘의 이 분기는 성공적으로 종료되지 않는다.
알고리즘은 레벨 1에서 다음 분기로 이동한다.
레벨 1: B행 선택
4단계—B행은 부분 용액에 포함된다.
B행은 1열과 4열에 1이 있다.
1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1
1열은 A열B열에 1이 있고, 4열은 A열, B열, C열에 1이 있다.따라서 A, B, C 행을 제거하고 1열과 4열을 제거한다.
1 2 3 4 5 6 7
A 1 0 0 1 0 0 1
B 1 0 0 1 0 0 0
C 0 0 0 1 1 0 1
D 0 0 1 0 1 1 0
E 0 1 1 0 0 1 1
F 0 1 0 0 0 0 1
D, E, F 행은 남고 2, 3, 5, 6 및 7 열은 남는다.
2 3 5 6 7
D 0 1 1 1 0
E 1 1 0 1 1
F 1 0 0 0 1
1단계—매트릭스가 비어 있지 않으므로 알고리즘이 계속 진행하십시오.
2단계—모든 열에서 가장 낮은 1초 수는 1이다.5열은 1이 1인 첫 번째 열이므로(결정적으로):
2 3 5 6 7
D 0 1 1 1 0
E 1 1 0 1 1
F 1 0 0 0 1
3단계—D행은 5열에 1이 있으므로 (비정상적으로) 선택된다.
알고리즘은 레벨 2에서 첫 번째 분기로 이동한다.
레벨 2: D행 선택
4단계—D행은 부분 솔루션에 포함되어 있다.
5단계—D행 3, 5, 6열에 1이 있음:
2 3 5 6 7
D 0 1 1 1 0
E 1 1 0 1 1
F 1 0 0 0 1
3열은 D열E열에 1이 있고, 5열은 D열에 1이 있으며, 6열은 D열E열에 1이 있다.따라서 D행과 E행은 제거되고 3, 5, 6열은 제거된다.
2 3 5 6 7
D 0 1 1 1 0
E 1 1 0 1 1
F 1 0 0 0 1
F열은 남고 2열과 7열은 남는다.
2 7
F 1 1
1단계—매트릭스가 비어 있지 않으므로 알고리즘이 계속 진행하십시오.
2단계—모든 열에서 가장 낮은 1초 수는 1이다.2열은 1이 1인 첫 번째 열이므로 (결정적으로) 선택된다.
F행은 2열에 1이 있으므로 (비교적으로) 선택된다.
알고리즘은 레벨 3에서 첫 번째 분기로 이동한다.
레벨 3: F행 선택
4단계—F행은 부분 솔루션에 포함되어 있다.
F행은 2열과 7열에 1이 있다.
2 7
F 1 1
2열은 F열에 1개, 7열은 F열에 1개 있다.따라서 F열은 제거되고 2열과 7열은 제거된다.
2 7
F 1 1
1단계—매트릭스가 비어 있으므로 알고리즘의 이 분기가 성공적으로 종료된다.
B행, D행, F행 등이 선택됨에 따라 최종 해결책은 다음과 같다.
1 2 3 4 5 6 7
B 1 0 0 1 0 0 0
D 0 0 1 0 1 1 0
F 0 1 0 0 0 0 1
즉, 모든 원소가 정확히 B = {1, 4, D = {3, 5, 6} 또는 F = {2, 7} 세트 중 하나에 포함되기 때문에 하위 집합 {B, D, F}은 정확한 표지다.
레벨 3에는 더 이상 선택된 행이 없으므로 알고리즘은 레벨 2에서 다음 분기로 이동한다.
레벨 2에는 더 이상 선택된 행이 없으므로 알고리즘은 레벨 1에서 다음 분기로 이동한다.
레벨 1에는 더 이상 선택된 행이 없으므로 알고리즘은 레벨 0에서 다음 분기로 이동한다.

레벨 0에는 분기가 없으므로 알고리즘은 종료된다.

요약하면 알고리즘은 한 표지가 S = {B, D, F} 하나만 있다고 판단한다.

구현

알고리즘 X를 설명하는 도널드 크누스의 주된 목적은 댄스 링크의 유용성을 증명하는 것이었다.크누스는 크누스가 "DLX"라고 부르는 과정에서 알고리즘 X가 춤추는 링크를 사용하여 컴퓨터에서 효율적으로 구현될 수 있다는 것을 보여주었다.DLX는 매트릭스 1s의 이중 연계 목록으로 구현된 정확한 커버 문제의 매트릭스 표현을 사용한다. 각 1개 요소는 위, 아래, 왼쪽 및 자신의 오른쪽에 다음 1에 대한 링크를 가지고 있다.(기술적으로, 리스트는 순환적이기 때문에, 이것은 토러스(torus)를 형성한다.)정확한 표지 문제는 희박한 경향이 있기 때문에, 이 표현은 일반적으로 크기와 필요한 처리 시간 모두에서 훨씬 더 효율적이다.그런 다음 DLX는 댄스 링크를 사용하여 가능한 해결책으로 행의 순열을 신속하게 선택하고 잘못된 추측을 효율적으로 역추적(undo)한다.[1]

참고 항목

참조

  1. ^ a b Knuth, Donald (2000). "Dancing links". arXiv:cs/0011047.

외부 링크