Dominosa NP-Hard입니까?


26

Dominosa는 ​​비교적 새로운 퍼즐 게임입니다. 이는 온 재생 격자. 게임이 시작되기 전에 도미노 본 이 그리드에 배치됩니다 (완벽한 타일링 구성) ). 다음 단계에서는 도미노 뼈가 숨겨져 있으며 숫자 만 공개됩니다. 이 게임의 목적은 도미노 본의 원래 배열을 복구하는 것입니다. 여기서 게임을 할 수 있습니다 : http://www.puzzle-dominosa.com/ :(n+1)×(n+2)(0,0),(0,1),,(n,n)

규칙 :

규칙은 간단합니다. 그리드에서 모든 도미노의 위치를 ​​찾아야합니다. 도미노는 숫자 쌍입니다. 각 쌍 중 하나만 가질 수 있습니다.

퍼즐의 상대적으로 작은 부분을 해결하는 다항식 알고리즘이 있습니다. 또한 일반적인 Dominosa 그리드에는 적어도 솔루션이 있음을 보여줄 수 있습니다 .2n2+o(n)

Dominosa NP-Hard입니까?


"퍼즐은 SAT 나 ILP 문제로 쉽게 줄어들 수 있습니다." NP- 완전성을 증명하기 위해 다른 방법을 원하지 않습니까?
Dennis Meng

1
@DennisMeng이 질문에 언급 된 감축의 핵심은 문제가 NP에 있다는 것을 확립하는 것입니다. 남은 것은 NP가 어렵다는 것을 증명하는 것입니다. 또한 문제가 NP에 있음을 알기 위해 축소가 필요하지 않습니다. 도미노의 배열은 그 자체로 해결 가능성에 대한 다항식 크기의 증인입니다.

NP- 완전성이 문제가되는 문제는 숫자의 배열이 주어지면 도미노의 배열에서 비롯된 것이라고 가정합니다. 문제가 실제로 도미노의 배열을 나타내는 것이라면 (있는 경우), 결정적인 문제가 아니며 "NP complete"는 의미가 없습니다.

소정 : @AndreasBlass 하나는 큰 문제를 고려할 수 중 라이더의 집합 소자 에 하고, 그래프 와 표시된 정점 로 ,이 지정된 라이더로 커버 할 수 있는지 결정한다. 이 문제가 P에있는 경우 원래 타일을 복구하는 P- 시간 알고리즘이 있습니다. 에지를 제거하고 그리드를 완성 할 수 있는지 P- 시간으로 테스트 할 수 있기 때문입니다. 1 N G 2 K를 1 N을k1nG2k1n

1
G. Nordh의 논문에 따르면 일반화 된 다중 Skolem 시퀀스의 NP- 완전성 (NP-completeness)이라고하는 NP-complete는 다음과 같습니다. 인스턴스 : 그래프 , 모서리를 분리 된 세트로 분할 : 함께 되도록 동일한 라벨 주 아니 두 가장자리 정점. 질문 : 두 모서리가 공통 정점을 공유하지 않고 M이 각 에서 최대 하나의 모서리를 포함 하도록 의 하위 집합 가 있습니까? ? E (1) , E (2) , . . . , E m , | m | | V | / 2 | E 내가 | 2 , i = 1 , , m M E | | = | V | / 2 E i , i = 1G=(V,E)E1,E2,...,Em,|m||V|/2|Ei|2, i=1,,mME|M|=|V|/2Ei, i=1,,m
Yoav bar sinai

답변:


9

참고 : 이것은 내 다른 대답 의 지속 및 개정입니다 .

축소 문제

의사 결정 문제를 상기하십시오.

고유 타일 로 주어진 그리드를 덮는 완벽한 타일링이 있습니까?n(n+1)×(n+2)n

따라서 그리드의 경우 변수 만 사용할 수 있습니다 .n(n+1)×(n+2)n

그러나:

  • 우리의 감소는 필요 훨씬 더 이상의 고유 변수를 .O(n)
  • 또한 전선이 개방되어있어 다음과 같은 결과가 발생합니다.
    • 열린 공간을 타일링 할 수 있다는 것을 어떻게 알 수 있습니까?

첫 번째 문제를 해결하기 위해 게임 보드를 인위적으로 크게 만듭니다. 본질적으로 우리 는 실제로 필요한 변수의 수와 동일하게 한 다음 크기 의 그리드를 만들고 그리드를 왼쪽 아래 모서리에 놓습니다. 이것은 2 차 폭발로 이어질 것입니다.( n + 1 ) × ( n + 2 )n(n+1)×(n+2)

두 번째 문제는 가제트를 다시 생각해야합니다.

규칙에 따라 보드의 나머지 부분을 성공적으로 타일링 할 수 있음을 증명하는 것은 약간 어려워 보일 수 있습니다. 따라서 우리는 실제로 크기의 게임 보드를 생성하는 데 사용하는 것과 동일한 전략으로 시작합니다 .(n+1)×(n+2)

먼저 가능한 모든 타일 세트를 생성합니다. 이 타일들은 모두 보드 위에 놓아야합니다. 그런 다음 타일을 제거하고 사각형을 남겨 둡니다.

그러나 Google 가젯은 특정 타일 세트가 배치 될 것이라고 보장하지 않습니다. 배치 된 타일은 상태에 따라 다릅니다. 우리가주의 깊게하는 가젯을 수정해야합니다 그래서 보장 특히 타일, 상태가 선택에 상관없이 삭제됩니다.

가제트를 살펴 보겠습니다.

와이어 및 절 게이트는 두 가지 이유로 문제가 있습니다.

  1. 우리는 와이어 또는 절 게이트를 둘러싼 정사각형이 올바르게 바둑판 식으로 배열 될 수 있다는 것을 모른다. 결국 일부 와이어는 왼쪽으로 밀고 다른 와이어는 오른쪽으로 밀 수 있으며 나머지 공백 사각형을 타일링하는 것은 쉽지 않습니다. 이 문제를 "흐름"문제라고합니다.
  2. 타일 ​​세트에서 제거 타일을 알 수 있는 방법은 없습니다 . 한 상태에서는 와이어 또는 절 게이트의 한 사각형 집합이 타일링되고 다른 상태에서는 완전히 다른 사각형 집합이 타일링됩니다.

이러한 문제를 해결하려면

  • 먼저 가능한 모든 타일 세트를 생성합니다. 이 타일들은 모두 보드 위에 놓아야합니다. 보드 위에 놓으면 타일이 세트에서 제거됩니다. 처음 에는 알지 못할 수도 있지만 공식을 아직 완전히 설명하지 않았으므로 필요에 따라 을 증가시키면서 새로운 타일 가능성을 모두 추가 할 수 있습니다 . 이 세트에서 제거하는 모든 타일은 배치 가능해야합니다 (적어도 수식이 만족스러운 경우 배치 가능해야합니다). 우리는 타일을 타일에서 제거하고 타일을 타일에서 "배출"하기 위해 타일을 게임 보드에 배치해야하는 의무를 이행 할 것을 요구합니다.nnn
  • 우리는 신중하게하는 가젯을 디자인해야 보장 , 특히 타일이 제거됩니다 상태가 선택에 상관없이.
  • 장치의 상태에 따라 보드 주위로 타일을 밀지 않도록 가제트를 닫아야합니다. 오히려 모든 주가 잘 정의 된 특정 영역 만 차지해야합니다.
    • 대안 적으로, 모든 주가 잘 정의 된 영역을 차지할 있도록 보장 되어야합니다 . 이는 만족스러운 타일링을 보장하지만 특정 타일링이 발생한다고 보장하지는 않습니다. 이것은 Dominosa 게임과 같은 방식입니다.
      • 먼저 타일이 세트로 생성됩니다.
      • 그런 다음 타일을 임의의 구성으로 배치합니다.
      • 각 타일이 배치되면 타일 세트에서 제거됩니다.
      • 그런 다음 타일을 보드에서 제거하고 사각형을 남깁니다.
      • 이것은 의도 된 구성 선택 것을 보장하지는 않습니다 .
      • 오히려 의도 된 구성 을 선택할 있으므로 솔루션이 존재합니다. 여기서도 같은 일을 할 수 있습니다.
  • 기본적으로 고유 한 정사각형 (예 : 모든 "공백") 을 배치하는 대신 공식의 모든 가제트를 배치 한 후 공백이 하나의 차원이있는 직사각형 영역인지 확인하거나 공백을 사용하여 사각형으로 구분합니다. 하나의 차원으로, 타일 세트의 나머지 타일과 함께 공백을 바둑판 식으로 배열합니다.
  • 세트에서 모든 타일을 배치하면 모든 것이 배치 가능하다는 것을 알 수 있습니다.
    • 일부 타일은 벽에있는 타일과 같이 분명히 배치 가능하고 다른 타일은 가제트 간의 관계 특성으로 인해 수식을 만족할 수있는 경우에만 배치 할 수 있습니다.
  • 그런 다음 타일을 제거하고 사각형을 남겨 둡니다.

가제트를 살펴 보겠습니다.

가제트 강제

우리는 각자 자신과 쌍을 이룰 수 없도록하여 임의의 수의 빌딩 블록을 만들 수 있습니다.

예를 들어 타일 을 강제로 사용하여 를 빌딩 블록. (참고로 는 임의의 변수로, 이전에 값을 사용했을 때 반드시 빌딩 블록 일 필요는 없습니다.1 1 1(1,1)111

-building-block reserve 를 보장하기 위해 바닥의 바닥 벽에 배치합니다. 다음과 같은 구성 : 예약 번호를 배치합니다. 을 벽에 대고 위로 붙입니다 ( 모양 ). 벽에 개, 가운데 2 열에 1 개. 그런 다음 다른 두 개의 숫자를 배치하고 및 ; 이들은이 가제트에 고유합니다. 우리는 이것을 왼쪽과 오른쪽의 합니다.( 1 , 1 ) 1 3 231 1(1,1)13231

아래 그림에서 공유 된 검은 색 테두리는 게임 보드의 하단이며 왼쪽에서 오른쪽으로 설명됩니다.

  • 가제트 구성 여기의 각 및 는이 가젯에 고유합니다.323
  • 센터 의 3 가지 가능한 상태입니다 .1

여기에 이미지 설명을 입력하십시오

이 일 후에, 우리는 우리의 가제트는 것을 보장 할 수 있습니다 우리의 가제트는 것을 보장하면서, 타일의 특정 세트 바둑판 식으로 배열 할 수 있어야 힘 쌍 .(1,1)

  • 우리는 알고 때문에 낮은 중간의 3 개 가능한 타일링 상태, 발생해야 , 타일로 위의 오른쪽 그림과 같이1 ( 1 , 1 )(1,1)1(1,1)
  • 나머지 타일 가젯을 포함하여 및 로 바둑판 식으로 배열 할 수 있습니다 . 따라서 전역 타일 세트에서 해당 타일을 제거 할 수 있습니다. 아래 그림이 있습니다.( 1 , 3 )(1,2)(1,3)

설명, 왼쪽에서 오른쪽으로 :

  • 왼쪽, 위 : 왼쪽 상태, 왼쪽, 아래 : 나머지 사각형의 유효한 타일링.
  • 중간, 상단 : 중간 상태, 중간, 하단 : 나머지 사각형의 유효한 타일링.
  • 오른쪽, 위쪽 : 오른쪽 상태, 오른쪽, 아래쪽 : 나머지 사각형의 유효한 타일링.

여기에 이미지 설명을 입력하십시오

나머지 사각형의 타일링은 대신 근처의 이웃 타일로 타일링 할 수 있기 때문에 강제 되지 않지만 모든 주에서 게임 보드의 유효한 타일링이므로 타일 ​​세트에서 그것들을 제거하고 정확하게 타일링 될 것이라고 가정합니다. 유효한 타일링이 있음을 알고 있으므로 수식이 만족스러운 경우 게임 보드의 타일링이 적어도 하나는 있어야합니다. 이러한 방식으로 타일링 될 것이라는 보장은 없지만 타일이 강제로 적용 된다는 보장 은 없습니다.( 1 , 1 )1(1,1)

참고 : 이것에 만족하지 않거나 "타일링 가능"과 "타일링 강제"의 차이로 혼동되는 경우 , 같은 방식으로 가젯 주위에 벽을 놓을 수 있습니다. 우리는 가제트를 위해 벽을 만듭니다.3 × 23×23×2

이 가젯은 꼭 필요한 것은 아니기 때문에 닫히지 않았습니다. 타일 ​​세트에서 제거 할 수있는 구성이 가능하기 때문에 필요하지 않습니다. 다른 구성을 수행 할 수도 있지만 이는 문제의 만족도에 영향을 미치지 않습니다.

다음 타일은 바둑판 식으로 배열됩니다 (따라서 타일 세트에서 제거 가능) : (1,1)

다음 타일은 바둑판 식으로 배열 될 있습니다 (따라서 타일 세트에서 제거 가능) : (1,2),(1,3)

이 가제트를 벽으로 닫으면 도 보장된다.(1,2),(1,3)

새로운 와이어 및 조항 게이트

흐르는 문제와 타일 세트를 비우기 때문에 와이어를 약간 다시 디자인해야합니다.

흐름 문제를 해결하는 한 가지 방법은 단순한 왼쪽 오른쪽 상태 대신 와이어를 회로로 만드는 것입니다. 즉, 선이 아닌 원형이므로 원의 윗부분을 오른쪽으로 밀면 아래쪽이 왼쪽으로 밀립니다. 이것은 흐름 문제를 해결합니다.

이 경로를 따라 와이어 및 절 게이트를 변경하여 두 문제를 모두 해결할 수 있습니다.

및 예약FTF

두 개의 새로운 범용 값인 와 소개하겠습니다 . 이 두 값은 보편적입니다. 정사각형 값 및 (규칙에 따라 을 벽의 빌딩 블록으로 예약 함 )과 같이 그리드의 실제 값 또는 선택한 값 그것들은 각각 참과 거짓을 나타냅니다.F 2 3 1TF231

우리는 다음과 같이 , , 강제 예약합니다 . 아래 그림, 왼쪽에서 오른쪽으로 설명 :( T , T ) ( F , F )(T,F)(T,T)(F,F)

  • 우리는 를 로 사용하여 타일 을 강제하는 것과 동일한 체계를 사용합니다 . 여기의 각 및 는이 가젯에 고유합니다.T 1 23(1,1)T123
  • 우리는 를 로 사용하여 타일 을 강제하는 것과 동일한 체계를 사용합니다. 각 및 는이 가젯에 고유합니다.F 1 23(1,1)F123
  • 중앙에서 를 로 사용하여 타일 을 강제하는 것과 동일한 체계를 사용합니다. 사용 상향 압정의 다른 위치에. 이렇게하면 바둑판 식으로 배열됩니다. 및 는 로 타일링 할 수 있으므로 타일 세트에서 제거합니다. 여기의 각 및 는이 가젯에 고유합니다.F 1 T ( F , T ) 23T 23(1,1)F1T(F,T)23T23

여기에 이미지 설명을 입력하십시오

철사

각 와이어는 값으로 시작하고 끝나므로 . 이는 고유 한 와이어입니다. 와이어가 참여하는 각 절에 대해 와이어에는 두 개의 와이어 값 및 가 있으며 각 와이어마다 고유하며 동일한 절에 참여합니다. 왼쪽에서 오른쪽으로 설명과 함께 아래 그림.x x Axx

  • 하나의 조항에 참여하는 와이어. 와이어의 높이는 이고 길이는 . 여기서 는 와이어가 참여하는 절 수입니다. 와이어는 왼쪽 에 두 개의 사각형으로 채워집니다. 오른쪽에 2 개. 물론 파란색 벽으로 표시된 모든면의 벽으로 둘러싸여 있습니다. 참고, 그 이 와이어에 고유 한, 오직 와이어에 사용되며 절은에 참여하고 있습니다.2 * p + 3 p A 1 22p+3pA1

여기에 이미지 설명을 입력하십시오

아래는 왼쪽에서 오른쪽으로 설명되는 두 가지 상태입니다.

  • 실제 상태에서 한 절에 참여하는 와이어. 사각형이 사각형 과 쌍을 이루고 사각형이 사각형 과 쌍을 이루면 와이어가 참으로 간주됩니다 . 타일링이 반전 된 다른 상태에서는 거짓으로 간주됩니다. 타일을 선택한 후에는 타일링을 강제하는 방법에 유의하십시오 . 는 이미 먼저 강제 적용되므로 나머지 타일은 수평이어야합니다.T x 'F A ( T , F )xTxFA(T,F)
  • 거짓 상태의 동일한 와이어.

여기에 이미지 설명을 입력하십시오

더 많은 조항에 참여할 경우 와이어가 참여하는 각 조항에 대해 한 쌍씩 더 많은 및 이 있습니다. 와 마찬가지로 위와 아래에 교대로 표시됩니다. 각 쌍 을 구분하는 및 제곱 .x 'T F x , x xxTFx,x

여기에 이미지 설명을 입력하십시오

두 개의 해당 상태.

여기에 이미지 설명을 입력하십시오

이 가젯은 닫혀 있으므로 '흐름 문제'가 없습니다.

: 주 중 상태에서, 우리는 다음과 같은 타일을 수집하는 방법, 어떤 국가 중요하지 않습니다 , , .( A , T ) ( A , F )(A,A)(A,T)(A,F)

그러나 우리가 확신하지 못하는 타일이 있습니다. 한 상태에서 타일 ​​세트에서 다른 상태에서는 타일 ​​세트에서 실제로 제거 하시겠습니까? 정답은 다음과 같습니다. 절 게이트에는 동일한 문제가 있지만 반대 타일 세트가 있습니다. 다음 섹션에서 볼 수 있듯이 항상 나머지, 반대쪽 및 수집되지 않은 타일을 수집합니다. 이들 각각은 조항 게이트와 쌍을 이루므로 둘 다 제거 할 수 있습니다.( 1 , F ) , ( 1 ' , T ) , ( 2 , F ) , ( 2 , T )(1,T),(1,F),(2,T),(2,F)...(1,F),(1,T),(2,F),(2,T)...

다음으로 새로운 조항 게이트의 첫 번째 반복을 만듭니다. 벽으로 둘러싸인 가젯으로 구성됩니다 . 가제트 안에서, 우리 는 상단 중앙에 하나의 를, 하단에 두 개의 사각형을 배치합니다; 하나는 왼쪽 아래에 있고 다른 하나는 오른쪽 아래에 있습니다. 나머지 사각형은 세 가지 다른 와이어의 와이어 변수를 나타내는 값입니다. 이것을 및 하겠습니다 . 와이어 변수 중 하나와 한 쌍의 강제 될 것이고, 나머지 와이어 변수는 페어링한다 값. 아래 그림, 왼쪽에서 오른쪽으로 설명합니다.F T a , b , c F T2×3FTa,b,cFT

  • 왼쪽 : 새 조항 게이트의 첫 번째 반복에 대한 구성입니다.
  • 오른쪽 타일링 의 세 가지 가능한 상태 .F

여기에 이미지 설명을 입력하십시오

이 세 가지 상태는 세 가지 가능한 타일링으로 이어집니다. 아래 그림은 왼쪽에서 오른쪽으로 설명합니다.

  • 왼쪽, 위 : 타일 ​​왼쪽, 왼쪽, 아래 : 나머지 사각형 타일.F
  • 가운데, 위 : 타일 ​​오른쪽, 가운데, 아래 : 나머지 사각형 타일.F
  • 오른쪽 위 : 아래로 바둑판 식으로 배열, 오른쪽 아래 : 나머지 사각형 타일링.F

여기에 이미지 설명을 입력하십시오

절의 와이어 변수 중 하나와 쌍을 이루 므로 해당 와이어 변수는 더 이상 와이어의 와 쌍을 이룰 수 없습니다 . 따라서 와이어를 사실로 강제합니다. 반대로, 타일링하는 나머지 와이어 변수는 와이어 내에서 로 타일링해야합니다 . 이것은 절 과 정확히 동일한 제약 조건 입니다.F T F 1 -in- 3 - S TFF TF1-in-3-SAT

참고, 및 와이어 변수이다, 그러나 각각은 참조 있었다 또는 와이어 변수; 사용 본질적 와이어 변수를 무효화한다.c x x x a,b,cxxx

한 가지 추가 사항 : 어떤 타일이 타일 세트에서 제거 될 수 있는지 알아야 할 의무를 없애려면 조항을 "이중 및 반대"해야합니다. 이것이 의미하는 바 는 및 의 부정을 나타내는 추가 변수 를 사용하여 또 다른 가젯 을 만드는 것 입니다. 이것을 및 하겠습니다 . 이는 및 의 부정 변수 변수 값 이어야합니다 . 이 가젯은 중앙에 가 있고 두 개가 다르다는 점에서 다릅니다.3×23a,b,ca,b,ca,b,c3×2TF모서리의 값; 지금까지 설명한 절 가젯과 정반대입니다. 이와 같은 절을 "배가"함으로써 위에서 설명한 가젯과 동일한 제약 조건을 다시 추가합니다. 그러나 를 타일 세트에서 각 변수에 대해 (따라서 및 역시 와이어 변수이므로). 왼쪽에서 오른쪽으로 설명합니다.(T,x),(T,x),(F,x),(F,x)a,b,c

  • "이중 및 반대"절. 하단 섹션은 위에서 설명한 절입니다. 상단 섹션은 새로 설명 된 상반된 조항입니다. 새 절은 논리적으로 동일한 제약 조건을 갖습니다. 그것은 최하위 조항의 반대이다. 이러한 결합 된 가제트와 와이어는 절에 참여하는 각 와이어 변수에 대해 타일 세트의 .(T,x),(F,x),(T,x),(F,x)
  • 가장 왼쪽 그림 중간에있는 파란색 선은보기 쉽도록 표시되어 있습니다. 실제로는 더 이상 상태를 허용하지 않고 제거 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

예를 들어 모든 타일이 약속대로 방전되었음을 보여 드리겠습니다. 왼쪽에서 오른쪽으로 설명합니다.

  • 단일 조항에 참여하는 와이어 그림. 절에 대한 상태가 선택됩니다. 여기서는 를 사용하는 반면 및 는이 절에서 다른 와이어 값을 나타냅니다.1=bab
  • 절에서 주어진 상태에 대해 값은 이웃하는 와 쌍을 이루어야합니다 .1T
  • 이로 인해 와이어가 실제 값으로 설정됩니다 (위의 설명에 따라 와이어의 양의 변수가 와 강제로 연결 되고 음의 변수가 와 강제 로 연결됨을 알 수 있습니다) ).TF
  • 이로 인해 상반되는 절 (절의 상단 섹션)의 가 절의 와 쌍을 이룹니다 . 이제 와이어를 보면 와이어 내부의 모든 타일이 방전됩니다. 와이어 자체 또는 해당 절 가제트에서 방전됩니다. 이 상태에는 타일 , , , , , 및 입니다.1T(A,A)(A,T)(A,F)(1,T)(1,F)(1,F)(1,T)

여기에 이미지 설명을 입력하십시오

다른 상태를 시도하면 왼쪽에서 오른쪽으로 아래 그림이 나타납니다.

  • 이 절은 다른 두 가지 방법 중 하나로 타일링 입니다.(1,T
  • 따라서 는 와이어에 강제로 적용됩니다.(1,F
  • 와이어의 나머지 부분을 해당 타일로 연결하고 와이어를 false로 평가합니다.
  • 마지막으로, 가제트의 반대 / 상위 섹션에서 는 가 철사. 이 상태에는 타일 , , , , , 및 입니다. 이것들은 다른 상태에서와 동일한 타일이 배출됩니다 .(1,F)(1,T)(A,A)(A,T)(A,F)(1,T)(1,F)(1,F)(1,T)

여기에 이미지 설명을 입력하십시오

따라서 어느 상태에서든 동일한 타일을 방전합니다. 따라서, 만족스러운 할당이있는 경우 와이어 및 절이 함께 특정 타일을 성공적으로 방전합니다.

이 가젯은 닫혀 있으므로 흐름 문제가 없습니다. 와이어 가제트와 함께가제트 는 항상 동일한 타일 쌍 값을 방출하도록 보장 하므로 타일링 방법을 모를 경우에도이를 방출 할 수 있습니다.

이제 모든 가제트가 기준을 충족합니다.

공식화

마지막 공식에서는 가로 행으로 구분 된 3 개의 가젯 행을 만듭니다.

  • 바닥에는 두 개의 타일 높이 인 가제트를 놓습니다. 빌딩 블록과 와 조합을위한 강제 가제트가 필요합니다 . 우리는 강제 가제트를 서로 바로 옆에 배치합니다.TF
  • 가운데 줄에는 와이어 가젯을 두 개의 타일 높이로 수평으로 배치합니다. 와이어 가젯은 수직 벽으로 서로 분리되어야합니다.
  • 맨 윗줄에는 키가 4 개인 타일 가제트를 배치합니다. 조항 가젯은 수직 벽으로 서로 분리되어야합니다.

각 그림 위의 설명과 그림이 이어집니다. 전체 해상도를 보려면 이미지를 클릭하십시오. 이미지를 재생산 / 생성하는 소스 코드는 페이지 하단에 나열되어 있습니다.

수식 를 예로 사용하면 만족스러운 결과를 증인으로서 솔루션 .Φ(x)=(x1,¬x2,x3)(x2,¬x3,x4)(x1,x2,¬x4)(¬x1,x2,x3,¬x4)

먼저 가로 줄로 시작하여 가젯 행을 분리합니다. 우리는 사각형과 벽 내에서 타일을 붙인 쌍을 보여줍니다.

여기에 이미지 설명을 입력하십시오

다음으로 가젯을 보여줍니다. 파란색 윤곽선은 가제트의 테두리를 나타냅니다. 강제 가제트는 벽으로 둘러싸이지 않기 때문에 파란색으로 파선으로 표시됩니다. 조항 가제트 중간에있는 선은 벽으로 둘러싸여 있지 않습니다. 보기 쉬움이 있습니다. 선을 제거해도 위에서 설명한 것처럼 더 이상 상태가 발생하지 않지만이 데모에서는 파란색 선이 표시됩니다. 참고 : 우리는 해당하는 경우 숫자 의미 가독성을 제공하기 위해 사각형 이름을 사용합니다. 각 이름은 숫자 값을 나타냅니다.

여기에 이미지 설명을 입력하십시오

여기서 우리는 수직 벽을 채 웁니다.

여기에 이미지 설명을 입력하십시오

여기서 우리는 증거 솔루션을 작성합니다. 즉, SAT 솔루션을 사용하여 생성하는 경우 타일링 솔루션입니다.

여기에 이미지 설명을 입력하십시오

다음으로 필러 영역을 타일링합니다. 보드의 나머지 부분은 필요에 따라 크게, 까지는 타일까지 필요합니다. 따라서 타일 세트의 나머지 쌍을 방전합니다. 여기서 점선은 유효하지만 강제되지 않은 타일링을 나타냅니다. 이들을 타일링하는 다른 방법이있을 수 있습니다. 여기 왼쪽 하단을 보여줍니다.n

여기에 이미지 설명을 입력하십시오

여기서 우리는 남은 사각형을 사소한 유효한 타일링으로 채 웁니다.

여기에 이미지 설명을 입력하십시오

여기에 그리드의 오른쪽 하단 코너가 표시됩니다.

여기에 이미지 설명을 입력하십시오

여기에 그리드의 오른쪽 상단이 표시됩니다. 수직 타일이 더 이상 맞지 않는 것에 주목하십시오. 필요한 경우 상단 행을 가로로 바둑판 식으로 배열합니다.

여기에 이미지 설명을 입력하십시오

그리고 마지막으로 왼쪽 상단.

여기에 이미지 설명을 입력하십시오

TeX를 통해 전체 게임 보드를 한 번에 생성하면 pdflatex의 메모리 부족 오류가 발생하므로 클립을 생성하고 함께 패치해야합니다. 노트북 뷰어 를 확인하십시오 .


TikZ 소스

게임 생성기 :

  • graphtex.py

    pdflatex, pdfcairo (poppler) 및 rsvg-convert (libsvg)를 사용하여 TeX를 svg로 변환

  • dominosa.py

    변환 논리, 게임 솔루션 검증 및 그리기 논리를 포함합니다

  • dominosa_demo.py

    위의 답변에 사용 된 이미지를 생성하는 실행 가능한 데모. 현재 작업중인 디렉토리에 이미지를 덤프합니다.

  • dominosa_demo.ipynb

    위의 답변에 사용 된 이미지를 생성하는 ipython 데모.


1
이것은 매우 훌륭합니다. 대단히 감사합니다.
Yoav bar sinai

2
arXiv 버전이 있다고 알려주십시오. 이 플랫폼이 대략적인 스케치를 포함하고 전체 용지에 연결하는 것이 더 합리적 일 있습니다.
Raphael

22

DOMINOSA 는 NP-hard입니다


게임을하는 것은 최적화 문제입니다. 모든 사각형을 덮을 수있는 유효한 도미노 타일링을 찾습니다. 이 문제의 결정 버전은 다음과 같습니다.

고유 타일 로 주어진 그리드를 덮는 완벽한 타일링이 있습니까?(n+1)×(n+2)n

분명히, 최적화 문제, 실제로 게임에 대한 해결책을 찾는 문제는 결정 문제보다 적어도 어렵거나 어렵다.

우리는 변환됩니다 에만 coverable 될 것입니다 해당 그리드에 공식 IFF 공식에 만족할 할당이있다. 또한, 커버링은 실제로 만족스러운 할당을 복구하는데 사용될 수있다.1-3-in-SAT

따라서 제시된 구성이 정확하고 DTM 에서 다항식 시간으로 게임을 해결할 수 있다면 합니다. 이는 가 NP-hard 임을 의미합니다 .P=NPDOMINOSA

발 감소 에1-3-in-SATDOMINOSA

소개

대부분의 문제 / 변형은 와 상당히 일치합니다 . 문제를 동시에 생각하는 것이 중요 할 수 있습니다. 이들이 서로 관련되어 있기 때문에 한 문제의 거의 모든 것이 다른 문제와 관련 될 수 있습니다.3-SATCIRCUITSAT

CIRCUITSAT 에는 라고하는 평면 변형이 있습니다. . 이 변환은 매우 우아하며 기본적으로 모든 평면 임베딩을 수행하고 나머지 교차 와이어를 찾은 다음 "가제트"를 사용하여 평면 "게이트"(입력 및 출력 와이어가있는 가제트 모음)를 통해 와이어를 교차시킵니다. .PLANAR-CIRCUITSAT

편리하게도 대부분의 변형은 평면 변형을 축소하여 이며 매우 관련이 있습니다. 서로 쉽게 환원 될 수 있으며 추론하기 쉽습니다. 따라서 NP가 어려운 평면 문제가 발생할 때마다 의 평면 변형 과 .3-SATPLANAR-CIRCUITSAT3-SATPLANAR-CIRCUITSAT

평면 변형은 Euclidean TSP와 같이 평면 / 기하학적 문제를 줄이는 데 도움이되기 때문에 알아야합니다. 따라서 및 감소를 돕기 위해PLANAR-3-SATPLANAR-CIRCUITSAT

다른 변형은 일부가 약하기 때문에 알아야합니다. 즉, "더보기 쉬운"것처럼 보이지만 여전히 NP가 완전합니다. 그들은 첫눈에 해결하기 쉽게 - 그리고 그들은 훨씬 간단 - 아직 여전히 NP-완료되었습니다. NP- 완전하지만 더 단순합니다. 따라서 많은 경우에 쉽게 줄일 수 있습니다.3-SAT

예를 들어 있습니다. 일부 문제의 경우 표준 와 같이 정확하게 가젯을 쉽게 만들 면서 "3에서 1 이상"을 만들 수 있습니다. 사용하는 것은 명백하지 않으며 거대한 구조를 만듭니다.1-in-3-SAT1-in-33-SAT

다른 예로는 입니다. 모노톤은 값을 쉽게 무시할 수없는 구성이있을 때 일을 훨씬 간단하게 만듭니다.MONOTONE-1-in-3-SAT

P L N R - M O N O T O N E - 1 -in- 3 - S TMONOTONE-1-in-3-SATPLANAR-MONOTONE-1-in-3-SATCIRCUITSAT

PROBLEMMONOTONEPLANAR1-in-3NP-hard3-SATNoNoNoYesMONOTONE-3-SATYesNoNoNo1PLANAR-3-SATNoYesNoYes21-in-3-SATNoNoYesYes3PLANAR1-in-3-SATNoYesYesYes4MONOTONE-1-in-3-SATYesNoYesYes5PLANAR-MONOTONE-3-SATYesYesNoYes!6PLANAR-MONOTONE-1-in-3-SATYesYesYesYes7
  1. 순수한 문자 제거
  2. 쉐퍼 이분법 정리
  3. 호환되는 담당자의 문제
  4. 최소 중량 삼각 분할은 NP-Hard입니다.
  5. 쉐퍼 이분법 정리
  6. 완벽한 자동 파티션을 찾는 것은 NP-hard
  7. 평면에서 최적의 이진 공간 파티션

3-SAT

"가제트"란 무엇입니까? 가젯은 문제의 일부 구성으로, 게이트 / 와이어 / 절을 빌드하는 빌딩 블록으로 유용합니다. 일부 가제트에는 제한된 상태 세트가 있습니다. 예를 들어, 두 가지 상태의 가제트를 변수로 사용할 수 있습니다. 한 상태는 "true"이고 다른 상태는 "false"입니다. "길고"길고 구부러 질 수있는 두 가지 상태의 가제트는 변수와 상호 작용할 수 있고 변수의 상태를 다른 위치로 확장하도록 제한되는 경우 와이어로 유용합니다. 정확히 3 개의 상태를 가진 가젯이 절로 사용될 수 있습니다. 3 개 상태 중 하나를 통해 "3 개 중 하나"와이어를 구속하는 데 사용할 수있는 경우. 마찬가지로, 비가 제트, 가제트, xor- 가제트 등 모든 종류의 논리 게이트를 원할 수도 있습니다.

빌딩 블록

  • 11
  • 11
  • 1

여기에 이미지 설명을 입력하십시오

3   1(1,1) (1,1)

45(1,1)

4

왼쪽에서 오른쪽으로 아래 이미지 :

  1. 1
  2. 1
  3. 1
  4. 강조하기 위해 그린 벽 선.

여기에 이미지 설명을 입력하십시오

와이어의 초기 시도

1

벽 테두리 만 표시하면 아래 그림에서 볼 수 있습니다 (왼쪽에서 오른쪽으로).

  • 서로 마주 보는 두 벽을 배치합니다.
  • 내부에 고유 번호를 넣습니다.
  • 가장 오른쪽 2 개 : 전선의 두 가지 가능한 상태.

여기에 이미지 설명을 입력하십시오

작동 방식 :

하여 타일가 이동하는 경우, 그들은 따라서 튜브 / 전선의 모든 구멍이있을 수 없다 모두가 모든 튜브 함께 최대 이동해야한다; 그들이 아래로 이동하면, 그들 모두를 "빨리"떨어 뜨릴 것이다. 따라서 전선의 한쪽에서 다른쪽으로 "신호"를 보낼 수 있습니다. 즉, 값을 전파하십시오.

따라서 이제 장거리에 걸쳐 값을 전파 할 수 있습니다!

나머지 제한 사항은 다음과 같습니다.

  • 우리는 철사를 구부릴 수 없습니다.
  • 우리는 철사를 나눌 수 없습니다.
  • 우리는 전선을 넘을 수 없습니다
  • 와이어 길이 패리티에주의해야하므로 성가신 레이아웃 문제가있을 수 있습니다.

와이어 굽힘 , 1 부 : 벽 아래

다음 문제는 똑바로 가지 않고 전선을 구부릴 수 있어야한다는 것입니다 ...

그래서. 굽힘 부분을 두 부분으로 나눕니다. 상부와 하부. 먼저 하부. 굽힘의 윗부분을 무시하고 나중에 수행합니다.

아래 그림은 굽힘과 관련된 약간의 문제를 보여줍니다. 와이어의 상단이 "느슨한"상태에서 벽을 90도 회전시키는 것은 어렵습니다.

좌에서 우로:

  • 와이어의 상단은 "느슨합니다".
  • 구부리려고하면 어떻게됩니까? 파란색 선 사이에 있도록 와이어를 연결하려고합니다. 다시, 굽힘의 윗부분을 무시하고, 우리는 나중에 그렇게 할 것입니다.
  • 1

여기에 이미지 설명을 입력하십시오

한 가지 해결책은 다음과 같습니다.

  • (x,1)xqx1111

아래 그림, 왼쪽에서 오른쪽으로 설명 :

  • 문제가있는 상황.
  • q1
  • 1

여기에 이미지 설명을 입력하십시오

qq

왼쪽에서 오른쪽으로:

  • 현재 건축.
  • q

여기에 이미지 설명을 입력하십시오

11

(r,1)r1

왼쪽에서 오른쪽으로 아래 그림 :

  • 우리의 현재 건축.
  • 1
  • r1

여기에 이미지 설명을 입력하십시오

그리고 마침내 우리는 더 낮은 굴곡을 얻습니다. 아래 그림, 왼쪽에서 오른쪽으로 설명 :

  • 왼쪽 : 굽힘을위한 최종 시공.
  • 오른쪽 : 전선을 왼쪽으로 계속 연결하는 방법.

여기에 이미지 설명을 입력하십시오

와이어 굽힘 , 파트 2 : 벽 위

굽힘의 상단 모서리를 만드는 벽이 훨씬 간단합니다. 수직 벽을 수평 벽에 간단히 맞 춥니 다. 아래 그림, 왼쪽에서 오른쪽으로 설명 :

  • 우리가 만들고 싶은 와이어 벤드.
  • 벽 사각형의 수직 섹션을 아래로 놓습니다.
  • 수직 벽의 사각형을 바둑판 식으로 배열합니다.
  • 수평 벽의 배치 및 타일링; 수직 벽을 만나 코너를 형성 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

이제 와이어를 배치하고 구부릴 수 있음을 확신해야합니다. 그래도 나중에 와이어를 분리하거나 교차시킬 수는 없습니다.

나머지 제한 사항은 다음과 같습니다.

  • 우리는 철사를 구부릴 수 없습니다.
  • 우리는 철사를 나눌 수 없습니다.
  • 우리는 전선을 넘을 수 없습니다
  • 와이어 길이 패리티에주의해야하므로 성가신 레이아웃 문제가있을 수 있습니다.

소중한 와이어

7TFTF그들을 분리하는 광장. 아래에서 왼쪽에서 오른쪽으로 설명됩니다.

  • 왼쪽 : 전선.
  • 오른쪽 : 정사각형 구성.

여기에 이미지 설명을 입력하십시오

TF

  • 왼쪽, 오른쪽 : 가치 와이어 의 두 가지 상태 ;
  • 왼쪽 : 와이어 값이 true입니다.T
  • F

여기에 이미지 설명을 입력하십시오

3-SAT

나머지 제한 사항은 다음과 같습니다.

  • 우리는 철사를 나눌 수 없습니다.
  • 우리는 전선을 넘을 수 없습니다
  • 와이어 길이 패리티에주의해야하므로 성가신 레이아웃 문제가있을 수 있습니다.

노 게이트

Not -Gate 는 암시 적이므로 불필요합니다. 한 번에 하나씩 와이어 길이를 사용하면 와이어 값을 무시할 수 있습니다.

절 문

3

아래 그림, 왼쪽에서 오른쪽으로 설명 :

  • 조항 가젯의 와이어 레이아웃. "더하기"부호를 만듭니다. 한 지점에서 3 개의 와이어를 연결합니다.
  • 1-in-3-SAT

여기에 이미지 설명을 입력하십시오

이제 다른 상태를 살펴 보겠습니다. 아래 그림, 왼쪽에서 오른쪽으로 설명 :

  • 왼쪽 와이어가 중앙으로 당겨집니다. 다른 두 사람은 밀려납니다.
  • 하단 와이어가 중앙으로 당겨집니다. 다른 두 사람은 밀려납니다.
  • 오른쪽 아래 와이어가 중앙으로 당겨집니다. 다른 두 사람은 밀려납니다.

여기에 이미지 설명을 입력하십시오

31-in-3

나머지 제한 사항은 다음과 같습니다.

  • 우리는 철사를 나눌 수 없습니다.
  • 우리는 전선을 넘을 수 없습니다
  • 와이어 길이 패리티에주의해야하므로 성가신 레이아웃 문제가있을 수 있습니다.

와이어 분할

TTTT1T2a,b,ca,b,cTa,b,c

아래 그림, 왼쪽에서 오른쪽으로 설명 :

  • 와이어 레이아웃. 벽은 약간 두껍기 때문에 와이어는 설명을 위해 더 가깝게 그려져 있습니다. 실제로, 그들은 조금 더 떨어져 있습니다.
  • Ta,b,c

여기에 이미지 설명을 입력하십시오

a,ba,ba,b

  • 왼쪽 와이어의 상태 예, 값은 true입니다.
  • 두 번째 와이어의 나쁜 상태; 다르게 평가하려고 시도하지만 중복 쌍을 얻습니다.
  • 두 번째 와이어의 양호한 상태, 이제 동일한 값이며 중복 쌍이 없습니다.

여기에 이미지 설명을 입력하십시오

a,b,c

나머지 제한 사항은 다음과 같습니다.

  • 우리는 철사를 나눌 수 없습니다.
  • 우리는 전선을 넘을 수 없습니다
  • 와이어 길이 패리티에주의해야하므로 성가신 레이아웃 문제가있을 수 있습니다.

무선 와이어!

글쎄, 내 기쁨으로, 전선을 쪼개는 것이 무선으로 밝혀졌습니다! 즉, 위 그림에서 전선을 서로 옆에 놓았지만 그럴 이유가 없습니다! 우리는 와이어를 그리드의 어느 곳에 나 배치 할 수 있으며, 그렇게 말하기 위해 여전히 "얽혀"있습니다. 이렇게하면 많은 문제가 해결됩니다.

  • 우리는 와이어를 건너는 것에 대해 걱정할 필요조차 없습니다. 이를 통해 의 비평면 변형을 줄일 수 있습니다3-SAT
  • 우리는 성가신 레이아웃을 수행하고 전선을 해당 위치로 가져 가야합니다. 쉽습니다! 무선 전화기처럼! 자유!
  • 우리는 와이어 길이 패리티 / 자외 레이아웃에 대해 걱정할 필요가 없습니다.
  • 최소한의 축소도 가능합니다. 변수는 와이어를 따라 무선 연결이 많은 단일 긴 와이어 스트립 세트를 각각 갖습니다. 이러한 연결은 절의 게이트와 연결되며 그리드의 자체 위치에 있습니다. 조항은 이제 조항 가제트와 3 개의 무선 와이어로 구성됩니다.

나머지 제한 사항은 다음과 같습니다.

  • 우리는 전선을 넘을 수 없습니다
  • 와이어 길이 패리티에주의해야하므로 성가신 레이아웃 문제가있을 수 있습니다.

감소, 첫 번째 시도

Φ(x)=iCi1-in-3-SAT

  • xjx
  • CiΦ(x)
  • xjCi3a,b,c

다음과 같은 모습 :

  • a,b,c

여기에 이미지 설명을 입력하십시오

그리드는 다음과 같습니다.

  • 그림 : 게임 보드 결과. 변수는 맨 아래에 행으로 정렬됩니다. 조항은 상단에 퍼져 있습니다. 이 레이아웃은 2 차 폭발을 제공합니다. 더 스마트 한 레이아웃은 2 차 폭발을 피할 수 있습니다.

여기에 이미지 설명을 입력하십시오

마지막 순간 세부 사항

의사 결정 문제를 상기하십시오.

(n+1)×(n+2)n

(n+1)×(n+2)nO(n)

  • O(|x|×|Φ(x)|)O(n)n
  • 1O(n)

그래프 소스


[ai,bi]ai,bi=1..n

이 모든 의견을 제 답변으로 옮기고 다음 큰 개정판에서보다 포괄적으로 작성하겠습니다.
Realz Slaw

알았어, 기다릴게!
Vor

@RealzSlaw, 정말 고마워요! 나는 아직도 이것을 읽을 시간이 없었지만 아주 좋아 보인다.
Yoav bar sinai

@RealzSlaw, 직접 연락 할 수있는 방법이 있습니까?
Yoav bar sinai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.