최적의 주문 찾기


9

나는이 문제를 발견하고 그것에 접근하는 방법을 찾기 위해 고심하고 있습니다. 어떤 생각이라도 대단히 감사하겠습니다!

예를 들어, 행렬이 있다고 가정합니다 .{1,0,1}n × k

[1010110001011011101110001]

모든 단일 순열을 시도하지 않고 0이 아닌 첫 번째 요소가 인 행 수를 최대화하는 열 순서를 찾으십시오 .ci1

위의 예에서, 그러한 고유 한 순서는 유일하지 않습니다!)는 . 즉,(c3,c4,c1,c2,c5)

[1010100101100110111100101]

여기서, 행 중 행에서 0이 아닌 첫 번째 요소는 입니다.451


어떤 알고리즘 접근법을 시도 했습니까? 이 문제는 어디서 발생 했습니까? 원본 출처를 인정할 수 있습니까? 상황이나 동기에 대해 무엇을 공유 할 수 있습니까? 이 페이지 는 질문 개선에 도움 될 수 있습니다 .
DW

1
전처리 단계를 제안하고 싶습니다. 반 양성 열 (각 행)을 0과 1 만있는 열 (각 행)으로하십시오. 모든 반 양성 열과 반 양성 열에 1이있는 행을 제거하는 것이 좋습니다. 귀하의 예에서 1, 3 및 4 행을 제거합니다. 이제 -1이 포함 된 행과 열이 남습니다. 도움이되지는 않지만 추론하기가 더 간단 할 수 있습니다.
Pål GD

행 수가 열 수보다 훨씬 적다고 가정 할 수 있습니까? 이렇게하면 문제가 더 쉬워 질 수 있습니다.
Angela Pretorius

1
@ Pål, 1을 포함하지 않는 행과 열을 사용하여 유사한 전처리가 가능합니다. 그러나 나는 그것이 더 작게 추론하기가 더 쉽다고 생각하지 않습니다.
피터 테일러

1
그러나 이것은 교차 포스트 입니다. haijo, 한 스택에서 답변을받지 못하고 다른 스택이 더 좋을 것이라고 생각되면이를 플래그 지정하고 마이그레이션을 요청할 수 있습니다. 답변자가 다른 사이트에서받은 답변을 알지 못하고 반복하는 데 시간을 낭비 할 수 있기 때문에 교차 게시는 좋은 예의가 아닙니다.
피터 테일러

답변:


4

열 순서를 지정하기 위해 CO라고 부르는이 문제는 NP-hard 입니다. 다음은 NP-hard 문제 버텍스 커버 (VC)가 줄어든 것입니다.

VC와 CO의 결정 문제 형태

입력 VC 인스턴스를 . 이 문제를 나타낸다 : "그래프 주어 , 그 최대의 세트를 선택할 수있다 의 정점 모든 에지되도록 적어도 하나 개의 선택된 정점에 입사?" 우리는 다음과 같은 질문을 나타내는 CO 의 인스턴스 를 구성 할 것입니다 . " 요소로 행렬 를 주면 의 열을 1로 개 이상의 행 에서 -1 앞에 표시 됩니까? " 이 두 가지 문제는 의사 결정 문제에 명시되어 있습니다(V,E,k)(V,E)kVE(A,k)A{1,0,1}Ak형식적으로, 각각에 대한 대답은 예 또는 아니오입니다 : 공식적으로 말하면, NP- 완전한 (또는 그렇지 않은) 문제의 형태입니다. OP의 질문에 언급 된 보다 자연스러운 최적화 문제 형식이 복잡성 측면에서 대략 동등한 것으로 보는 것은 그리 어렵지 않습니다 . 임계 값 매개 변수에 대한 이진 검색은 의사 결정 문제 해결사를 사용하여 최적화 문제를 해결하는 데 사용될 수 있습니다. 최적화 문제 해결사를 호출하고 단일 비교를 수행하면 의사 결정 문제를 해결하기에 충분합니다.

VC 인스턴스에서 CO 인스턴스 생성

하자그리고. 행과 열로 행렬 를 작성 합니다. 맨 위 행은 각각 행 의 블록으로 구성되며 각 블록은 포함 해야하는 가장자리를 나타냅니다 . 맨 아래 행에는 정점 "플래그"가 포함되어 있는데,이 열은 정점에 포함 된 정점에 해당하는 CO 솔루션의 왼쪽에 포함 된 열 (정점에 해당)에 고정 비용이 발생합니다. VC 용액의 덮개).n=|V|m=|E|A(n+1)m+nn+1(n+1)mmn+1n

각 정점 에 대해 다음을 포함하는 열을 만듭니다.vi

  • 상위 행 중 행 의 번째 블록은 모두 모서리 가 에 때 +1을 포함하고 그렇지 않으면 0을 포함합니다.(n+1)mjn+1ejvi
  • 맨 아래 행은 제외하고 모두 0 이며, -1입니다.ni

하나 이상의 구성 "펜스"열 생성 다음의 복사본 -1, +1 사본.(n+1)mn

마지막으로 생성 된 CO 인스턴스에 대한 임계 값 를 설정하십시오 .k(n+1)m+nk. 다시 말해, 우리는 최대 허용k+1 앞에 -1이 나타나는 행 이 위반 행을 CO 솔루션의 "비용"이라고합니다.

증명

CO 인스턴스에 대한 솔루션과 원래 VC 인스턴스의 정점 세트 간의 대응 관계는 다음과 같습니다. 펜스 왼쪽의 모든 열은 세트에있는 정점에 해당하고 펜스 오른쪽의 모든 열은 그렇지 않은 정점

직관적으로, "울타리"열의 상단에있는 -1은 왼쪽에 배치되어 모든 위치에서 +1을 포함하는 열의 하위 집합을 선택합니다. 모든 정점의 하위 집합에 해당합니다. 가장자리. "울타리"의 왼쪽에 나타나는 각 열은 아래쪽 어딘가에 별개의 행에 -1이 있습니다.n1의 비용이 발생하는 행; "울타리"의 맨 아래에있는 +1은 오른쪽에 배치 된 모든 열에 그러한 비용이 발생하지 않도록합니다.

기껏해야 사용하는 VC 솔루션 k 정점은 최대 비용으로 구성된 CO 인스턴스에 대한 솔루션을 생성합니다 k: 정점 커버의 정점에 해당하는 열을 임의로 정렬 한 다음 펜스 열, 나머지 모든 열을 순서대로 정렬하십시오.

최대 비용으로 CO 인스턴스에 대한 솔루션을 보여줍니다 k 기껏해야 정점 표지에 해당 k 정점.

반대로 비용이 최대 인 CO 인스턴스에 대한 솔루션이 있다고 가정하십시오. k 맨 위에 몇 줄을 남깁니다. (n+1)m+1 앞에 -1이있는 행 이 행은(n+1) 특정 모서리에 해당하는 행 uv. 원래 인스턴스에서이 블록의 모든 행A구조상 동일하다; 순열 열은 이러한 행을 변경할 수 있지만 동일한 행에는 영향을 미치지 않습니다. 따라서 이들 각각n+1 동일한 행은 솔루션에서 +1 앞에 -1이 있으므로 최소 비용이 든다 n+1. 그러나kn<n+1: 모순.

각각의 이후 m 상단의 행 블록 (n+1)m행은 -1 이전에 +1을 가지며, 각 해당 모서리는 펜스 왼쪽의 열에 해당하는 정점으로 덮여 있습니다. 즉,이 정점 하위 집합은 정점 덮개를 구성합니다. 최고가 없기 때문에(n+1)m 행에 +1 앞에 -1이 있습니다. 솔루션에서 비용이 발생할 수있는 유일한 곳은 맨 아래입니다. n울타리 왼쪽에 배치 된 열부터 행까지. 각 열의 비용은 정확히 1이므로 비용이 최대k, 최대가 있어야합니다 k 그런 열, 그리고 따라서 최대 k 표지의 정점.

마지막으로, CO 인스턴스가 VC 인스턴스에서 다항식 시간으로 구성 될 수 있음이 분명합니다. 즉, CO를 해결하기 위해 다항식 시간 알고리즘이 존재하는 경우 먼저 설명 된대로 CO 인스턴스를 구성하여 다항식 시간으로 모든 VC 인스턴스를 해결할 수 있습니다. 위와 해결. VC는 NP-hard이기 때문에 CO도 마찬가지입니다.


좋은 답변이있을 때마다 "핫 네트워크 질문"이 "Valuable Network Answers"와 같은 것으로 대체되거나 결합되어야하는지 궁금합니다.
John L.

답을 찾는 방법에 대해 좀 알려 주시겠습니까? 그것은 대답 자체보다 훨씬 더 깨달아야합니다.
John L.

1
@ Apass.Jack : 감사합니다! :) 나는 특별한 전략이 없으며 잘못된 방향으로 방황하는 데 오랜 시간을 보낼 수 있습니다. 예를 들어, 여기서는 건축에서 하위 지형에 해당하는 구성을 허용하므로 작동하지 않을 것이라는 사실을 깨닫기 전에 해밀턴 사이클 (요소 주문과 비슷한)을 줄일 수 있다고 생각했습니다. 일반적으로 항상 정점 덮개 또는 파티션에서 축소를 시도한 다음 어쩌면 Clique를 시도합니다. "Valuable Network Answers"는 훌륭한 아이디어처럼 들립니다 :)
j_random_hacker

1
@ Apass.Jack : 유용한 일반적인 아이디어 중 하나는 답변을 변경하지 않고 대상 문제 인스턴스를 "확대"하는 방법에 대해 생각하는 것입니다. 정수 r 그래프의 사본을 분리하고 임계 값을 곱 k 으로 r대답은 변경되지 않습니다. 종종 특정 위반 (유효한 소스 솔루션에 해당하지 않는 대상 솔루션)이 다른 특정 사용자를 "강제화"하기를 원하며,이 경우 더 중요한 위반에 해당하는 가젯을 "증가"할 수 있습니다.
j_random_hacker

1
내 대답을 줄이기 위해 두 가지 "힘"이있는 문제의 인스턴스를 인코딩하려고합니다. 모든 가장자리를 덮고 가능한 한 적은 꼭지점을 사용하십시오. 첫 번째는 여기에서 더 중요하므로 모서리에 해당하는 행을 "증가"했습니다. 이제 단일 모서리 위반 비용n+1즉, 모든 정점을 포함하는 것보다 단일 모서리를 놓치는 것이 더 나쁩니다. 그리고 이제 임계 값 매개 변수가 문제 인스턴스의 일부인이 두 가지 문제 의 결정 문제 버전을 다루고 있음을 분명히하기 위해 답을 편집해야한다는 것을 알았습니다 .
j_random_hacker

2

실제로 다항식 솔루션이 있는지 모르겠습니다. 그럼에도 불구하고 Pål GD의 의견을 바탕으로 단순화 기능을 구축 할 수 있습니다. 출력 시퀀스를 빌드 할 때 초기 행렬이 단순화됩니다.S.

function simplification:
while(true)
    if any row i$ has no 1 or no -1 left, remove it
    if any column j has no -1 then,
       remove it and put j on the leftmost available position in S,
       remove all rows where column j has 1.
    if any column j has no 1 then, 
       remove it and put j on the rightmost available position in S.
    if no modification has been done on this loop, break

그런 다음 기능 선택을 반복적으로 사용하여 조합기를 완전히 탐색해야합니다.

function pick(k):
    put column k on the leftmost available position in S
    remove any row where column k is -1 or 1

모든 선택 후 탐색 가능성을 줄이기 위해 단순화를 수행 할 수 있습니다. 나는 -1이 적은 컬럼부터 탐욕스럽게 탐구하는 것이 좋습니다. 따라서 하위 기준에 도달하여 정지 기준을 만들 수 있습니다.

주어진 예에서, 첫 번째 단순화는 (Pål GD가 주석에서 설명했듯이)

  • S[0]=c3r1, r3 제거
  • S[1]=c4r4 제거
  • S[2]=c2 이를 통해 간단한 매트릭스를 탐색 할 수 있습니다.
    [1111]

이 방법을 매우 비효율적으로 만드는 행렬은 정확히 1과 1, 행 / 열당 -1을 가질 것이라고 생각합니다.

[110000110000001100001100000011000011]

그럼에도 불구하고 단순화는 여전히 탐색 단계의 절반 정도를 차지합니다. 그리고이 유형의 행렬은 여러 개의 독립적 인 하위 행렬로 나눌 수 있습니다.


1
@ Apass.Jack 더 정확하게 편집했습니다. 예, 출력 순서에서 열 위치를 의미했습니다.
Optidad

단순화 단계가 실용적 목적 (예 : 온라인 프로그래밍 연습)에 충분할 정도로 상향 조정되었습니다.
John L.

사실, 상각 된 시간 비용을 추정하는 데 관심이 있었지만 어떻게해야할지 모르겠습니다. 이것이 가능한가 ? 아니면 많은 문제에 의존합니까?
Optidad

2
상각 시간 분석을 시도했지만 어려워 보입니다. NP 완전성이 의심 됩니다. 반면에 단순화 단계가 더 일반적 일 수 있습니다. 열ij 0이 아닌 공유 부분이 0이 아닌 부분이되도록 i, 열 j 0이 아닌 여분의 부분이 있으면 j 1을 포함하지 않으며 열 i 0이 아닌 여분의 부분이 있으면 j-1을 포함하지 않습니다.
John L.

1
또 다른 지배 규칙은 다음과 같습니다. 두 개의 열이있을 때마다 ij 적어도 하나의 행이 있도록 i -1이 있고 j +1이 있고 행이 없습니다. i +1이 있고 j -1을 가지므로 배치에 이점이 없습니다. i먼저. 그렇게 말합시다j 지배하다 i이 경우 pick 내부에서 이것을 구현할 수 있습니다.k)를 확인하여 k이미 배치 된 모든 열을 지배합니다. 그렇다면 검색 트리의이 분기를 제거 할 수 있습니다.
j_random_hacker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.