사각형으로 그리드 커버링


15

우리는 N1×N2 그리드를 가지고 있습니다. 이 그리드에는 사각형 모음이 있으며 각 사각형은 N1 x N2 이진 행렬 로 나타낼 수 있습니다 R. 그리드를 사각형으로 덮고 싶습니다.

이 세트의 결정 버전은 NP-complete 문제입니까?

  • 입력 : 모눈에있는 사각형의 모음 C={R1,R2,,RL} (입력 크기 : ) 및N1N2LKN+
  • 출력 : 부분 와 및 S는 그것을 덮고 각 셀에 적어도 하나의 구형 함유.SC|S|KS

문제의 시각적 예

나는 동적 프로그래밍에 의해 다항식 시간에 1D 케이스 ( N2=1 )를 해결할 수 있음을 발견했다 . 최적의 커버는

  • 제 커버의 일부 하위 문제에 대한 최적의 커버 N1n1 세포.
  • 나머지 n1 셀을 덮는 1D 직사각형, 즉 간격 .

그러나 DP가 2D 문제에 대해 효과가 있다고 생각하지 않습니다 .1D 문제의 경우 해결할 하위 문제가 있지만 2D의 경우 ( N 1 + N 2N1하위 문제 (그리드의 동북 격자 경로 수).(N1+N2N2)

나는 문제가 NP라고 생각하지만 확실하지는 않지만 (P보다 어렵다고 생각하지만) NP- 완전 문제 (3-SAT, Vertex Cover, ...)에서 다항식 감소를 찾지 못했습니다.

도움이나 힌트를 환영합니다.


3
힌트 : Vertex Cover에서 축소 된 부분을 찾아 으로 | V | 각각의 매트릭스 요소의 3 x 3 블록 인 블록 그리드. 각 블록의 행은 모서리에 해당하며 끝점 정점에 해당하는 특별히 설계된 2 개의 블록을 포함합니다. 각 정점이있을 것 height- 3 | 전자 | , 해당 정점에 해당하는 3x3 블록 열의 가운데 열을 통과하는 너비 1 직사각형. 유효한 k- vertex 커버 의 총계를 정확히 비용으로 강제하는 방법 | 전자 | ( | V | + 3 )|E||V|3|E|k ? (다른 사각형이 필요합니다.)|E|(|V|+3)+k
j_random_hacker

나는 이것이 아마도 숙제 일 것이라고 생각한다. 그래서 나는 지금까지 그것보다 훨씬 더 많은 것을 말하는 것을 꺼려한다. 내가 준 비용 공식에는 몇 가지 단서가 있습니다. 행렬 요소를 덮는 유일한 직사각형으로 만들어서 여러 직사각형 중 적어도 하나를 강제로 수행 할 수 있습니다 (1 직사각형의 특수한 경우도 유용함). FWIW, 나는 또한 으로 | V | 그리드를 먼저 선택하면 정점을 선택하면 행과 해당 열을 "교차"하는 것과 일치하지만 i 번째 행을 선택할 때 i 번째 열을 선택 하는 방법을 알 수 없었습니다 . |V||V|나는나는
j_random_hacker

나는 같은 문제가 있었다 으로 | V | 그리드. 나는 당신이 어떤 종류의 솔루션을 염두에두고 있다고 생각합니다 (나는 정확히 같은 비용 공식이 없지만) 내 편집을 참조하십시오. 그건 그렇고, 숙제 운동이 아닙니다. 실제 공학 문제에서 나타난 조합 문제입니다. 우리는 MIP로 문제를 해결했지만 문제가 NP (다항식 솔루션이 아님)인지 확인하고 싶었습니다. 어쨌든 솔루션이 유효하다는 것을 확인하면 힌트로 답을 넣을 수 있으며 도움을 받으면 솔루션을 찾았으므로 유효성을 검사 할 것입니다. |V||V|
Yann

1
그렇습니다. 거의 정확히 줄어든 것입니다! :) 나는 당신의 "타입 4"사각형을 한쪽 끝에서 약간 더 길게 만들었습니다 : 당신의 블록 안에 2 개의 셀을 차지하고, 3 개를 모두 차지합니다. 경우 "type 2"사각형과 같습니다 . 마지막으로 각 왼쪽 끝 블록 내에서 가운데 ​​왼쪽 및 아래쪽 왼쪽 셀을 차지하는 사각형이 있습니다 (각 오른쪽 끝 블록마다 수평으로 뒤집힘). 따라서 또는 패턴을 사용하여 끝 블록을 포함하고 끝 블록 사이에있는 모든 블록의 아래쪽 2 행을 덮을 수 있습니다 . a<j<|==|
j_random_hacker

1
나는 당신을 좋아합니다 별로 3 | V | 감소 아이디어. 이것과는 달리 3 | 전자 | 별로 3 | V | 축소, 정점 커버에 해당하지 않는 최소 비용 솔루션이있을 수 있습니다. 그러나 이러한 모든 솔루션은 마지막 글 머리 기호와 동일한 인수를 사용하여 동일한 (최소) 비용 솔루션으로 전환 할 수 있으므로 이것이 아닙니다. 감소에 대한 문제 :)|이자형||V||이자형||V|
j_random_hacker

답변:


4

j_random_hacker의 힌트 덕분에 정점 커버를 그리드 문제로 줄이는 솔루션을 찾았습니다.

우리는 으로 | V | 3x3 블록의 그리드, 즉 3 | 전자 | 별로 3 | V | 정점은 열 { v 1 , , v N 1 }로 정렬되고 모서리는 행 { e 1 , , e N 2 } 로 정렬됩니다 . 이 그리드에 사각형을 만들 것입니다 (아래 그림은 사용 된 다른 사각형을 많이 이해하는 데 도움이됩니다)|이자형||V||이자형||V|{V1,,V1}{이자형1,,이자형2}

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

우리가 각각의 정점을 위해, 우리는 그 정점에 해당하는 블록의 열의 중앙 열을 포함 1 형의 사각형을 만들 유형 1의 사각형|V|

각 블록은 고유 한 쌍 해당하며 각 블록에 대해 e i = ( v a , v b ) 와 함께 2 유형의 사각형을 추가합니다.(이자형나는,V제이)이자형나는=(V,V)

  • 만약 또는 B < J , 이것은 전체 블록을 덮는 -3- 의해 -3- 직사각형이다.제이<<제이
  • 만약 (RESP. J = B에 )이 왼쪽으로 피복하여 3-1 직사각형 (RESP는. 오른쪽) 블록의 칼럼.제이=제이=
  • 만약 < J < B ,이 블록의 상부 행을 덮는 1 바이 3 직사각형이다.<제이<

그래서 우리는 유형이 2 인 사각형의 경우 사각형은 해당 블록의 왼쪽 위 (또는 오른쪽 위) 모서리에 대한 유일한 표지이므로 선택해야합니다.|이자형||V|

우리가 말했듯이, 각 모서리는 행에 해당하며 정점 ( e i , v b ) 의 끝점에 해당하는 두 개의 블록 (끝 블록이라고 함 ) 이 이제 사각형입니다. 삼:(이자형나는,V)(이자형나는,V)

  • endblock (resp. ( e i , v b ) )의 경우, endblock의 오른쪽 상단 (왼쪽 상단) 모서리를 덮는 1x2 직사각형이 있습니다.(이자형나는,V)(이자형나는,V)

우리는 유형 3의 직사각형은 다시 오른쪽 상단 모서리 (첫 번째 끝 블록 인 경우) 또는 왼쪽 위 모서리 (두 번째 끝 블록 인 경우)에 대한 유일한 표지이므로 각각 필수입니다.2|이자형|

이제 각 모서리에 대해 끝 블록 사이에 유형 4의 사각형을 구성하고 두 번째 행에 두 개의 사각형이 있습니다.

  • 첫 번째 블록의 중앙 사각형에서 두 번째 블록의 왼쪽 중앙 사각형으로 이동합니다.
  • 하나는 첫 번째 블록의 중앙 오른쪽 사각형에서 두 번째 블록의 중앙 사각형으로 이동합니다.
  • 그리고 세 번째 행에 대해 동일한 두 직사각형.

우리는 유형 4의 직사각형은 필수는 아닙니다.4|이자형|

이제 그리드를 덮으십시오.

  • |이자형|(|V|+2)|V|+4|이자형|

주어진 가장자리에 대해 아직 덮지 않은 가장자리 끝 블록 사이의 부분 (블록 행의 두 번째 및 세 번째 행)을 덮기 위해 다음 중 하나를 사용할 수 있습니다.

  • 타입 4의 사각형
  • 유형 1의 직사각형 하나와 유형 4의 직사각형 두 개

어쨌든 유형 4의 직사각형이 두 개 이상 필요합니다.

|이자형|(|V|+4)+케이

  • |이자형|(|V|+2)

  • |이자형|(|V|+4)+케이|이자형|(|V|+4)+케이

|이자형|(|V|+6)+|V|9|V||이자형|

추신 : 나는이 답변을 쓴 후에 많은 사각형이 실제로 쓸모가 없으며 별로 3 | V | 그리드 | V | + 4 ||이자형||V||V|+4|이자형||이자형|+케이

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.