나는이 문제를 발견하고 그것에 접근하는 방법을 찾기 위해 고심하고 있습니다. 어떤 생각이라도 대단히 감사하겠습니다!
예를 들어, 행렬이 있다고 가정합니다 .
모든 단일 순열을 시도하지 않고 0이 아닌 첫 번째 요소가 인 행 수를 최대화하는 열 순서를 찾으십시오 .
위의 예에서, 그러한 고유 한 순서는 유일하지 않습니다!)는 . 즉,
여기서, 행 중 행에서 0이 아닌 첫 번째 요소는 입니다.
나는이 문제를 발견하고 그것에 접근하는 방법을 찾기 위해 고심하고 있습니다. 어떤 생각이라도 대단히 감사하겠습니다!
예를 들어, 행렬이 있다고 가정합니다 .
모든 단일 순열을 시도하지 않고 0이 아닌 첫 번째 요소가 인 행 수를 최대화하는 열 순서를 찾으십시오 .
위의 예에서, 그러한 고유 한 순서는 유일하지 않습니다!)는 . 즉,
여기서, 행 중 행에서 0이 아닌 첫 번째 요소는 입니다.
답변:
열 순서를 지정하기 위해 CO라고 부르는이 문제는 NP-hard 입니다. 다음은 NP-hard 문제 버텍스 커버 (VC)가 줄어든 것입니다.
입력 VC 인스턴스를 . 이 문제를 나타낸다 : "그래프 주어 , 그 최대의 세트를 선택할 수있다 의 정점 모든 에지되도록 적어도 하나 개의 선택된 정점에 입사?" 우리는 다음과 같은 질문을 나타내는 CO 의 인스턴스 를 구성 할 것입니다 . " 요소로 행렬 를 주면 의 열을 1로 개 이상의 행 에서 -1 앞에 표시 됩니까? " 이 두 가지 문제는 의사 결정 문제에 명시되어 있습니다형식적으로, 각각에 대한 대답은 예 또는 아니오입니다 : 공식적으로 말하면, NP- 완전한 (또는 그렇지 않은) 문제의 형태입니다. OP의 질문에 언급 된 보다 자연스러운 최적화 문제 형식이 복잡성 측면에서 대략 동등한 것으로 보는 것은 그리 어렵지 않습니다 . 임계 값 매개 변수에 대한 이진 검색은 의사 결정 문제 해결사를 사용하여 최적화 문제를 해결하는 데 사용될 수 있습니다. 최적화 문제 해결사를 호출하고 단일 비교를 수행하면 의사 결정 문제를 해결하기에 충분합니다.
하자그리고. 행과 열로 행렬 를 작성 합니다. 맨 위 행은 각각 행 의 블록으로 구성되며 각 블록은 포함 해야하는 가장자리를 나타냅니다 . 맨 아래 행에는 정점 "플래그"가 포함되어 있는데,이 열은 정점에 포함 된 정점에 해당하는 CO 솔루션의 왼쪽에 포함 된 열 (정점에 해당)에 고정 비용이 발생합니다. VC 용액의 덮개).
각 정점 에 대해 다음을 포함하는 열을 만듭니다.
하나 이상의 구성 "펜스"열 생성 다음의 복사본 -1, +1 사본.
마지막으로 생성 된 CO 인스턴스에 대한 임계 값 를 설정하십시오 .. 다시 말해, 우리는 최대 허용+1 앞에 -1이 나타나는 행 이 위반 행을 CO 솔루션의 "비용"이라고합니다.
CO 인스턴스에 대한 솔루션과 원래 VC 인스턴스의 정점 세트 간의 대응 관계는 다음과 같습니다. 펜스 왼쪽의 모든 열은 세트에있는 정점에 해당하고 펜스 오른쪽의 모든 열은 그렇지 않은 정점
직관적으로, "울타리"열의 상단에있는 -1은 왼쪽에 배치되어 모든 위치에서 +1을 포함하는 열의 하위 집합을 선택합니다. 모든 정점의 하위 집합에 해당합니다. 가장자리. "울타리"의 왼쪽에 나타나는 각 열은 아래쪽 어딘가에 별개의 행에 -1이 있습니다.1의 비용이 발생하는 행; "울타리"의 맨 아래에있는 +1은 오른쪽에 배치 된 모든 열에 그러한 비용이 발생하지 않도록합니다.
기껏해야 사용하는 VC 솔루션 정점은 최대 비용으로 구성된 CO 인스턴스에 대한 솔루션을 생성합니다 : 정점 커버의 정점에 해당하는 열을 임의로 정렬 한 다음 펜스 열, 나머지 모든 열을 순서대로 정렬하십시오.
최대 비용으로 CO 인스턴스에 대한 솔루션을 보여줍니다 기껏해야 정점 표지에 해당 정점.
반대로 비용이 최대 인 CO 인스턴스에 대한 솔루션이 있다고 가정하십시오. 맨 위에 몇 줄을 남깁니다. +1 앞에 -1이있는 행 이 행은 특정 모서리에 해당하는 행 . 원래 인스턴스에서이 블록의 모든 행구조상 동일하다; 순열 열은 이러한 행을 변경할 수 있지만 동일한 행에는 영향을 미치지 않습니다. 따라서 이들 각각 동일한 행은 솔루션에서 +1 앞에 -1이 있으므로 최소 비용이 든다 . 그러나: 모순.
각각의 이후 상단의 행 블록 행은 -1 이전에 +1을 가지며, 각 해당 모서리는 펜스 왼쪽의 열에 해당하는 정점으로 덮여 있습니다. 즉,이 정점 하위 집합은 정점 덮개를 구성합니다. 최고가 없기 때문에 행에 +1 앞에 -1이 있습니다. 솔루션에서 비용이 발생할 수있는 유일한 곳은 맨 아래입니다. 울타리 왼쪽에 배치 된 열부터 행까지. 각 열의 비용은 정확히 1이므로 비용이 최대, 최대가 있어야합니다 그런 열, 그리고 따라서 최대 표지의 정점.
마지막으로, CO 인스턴스가 VC 인스턴스에서 다항식 시간으로 구성 될 수 있음이 분명합니다. 즉, CO를 해결하기 위해 다항식 시간 알고리즘이 존재하는 경우 먼저 설명 된대로 CO 인스턴스를 구성하여 다항식 시간으로 모든 VC 인스턴스를 해결할 수 있습니다. 위와 해결. VC는 NP-hard이기 때문에 CO도 마찬가지입니다.
실제로 다항식 솔루션이 있는지 모르겠습니다. 그럼에도 불구하고 Pål GD의 의견을 바탕으로 단순화 기능을 구축 할 수 있습니다. 출력 시퀀스를 빌드 할 때 초기 행렬이 단순화됩니다..
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가 주석에서 설명했듯이)
이 방법을 매우 비효율적으로 만드는 행렬은 정확히 1과 1, 행 / 열당 -1을 가질 것이라고 생각합니다.
그럼에도 불구하고 단순화는 여전히 탐색 단계의 절반 정도를 차지합니다. 그리고이 유형의 행렬은 여러 개의 독립적 인 하위 행렬로 나눌 수 있습니다.