내가 프로그래머이고 문제를 해결해야하는 NP-complete 문제가 있다고 가정합니다. NPC 문제를 처리하기 위해 어떤 방법을 사용할 수 있습니까? 이 주제에 대한 설문 조사 또는 유사한 것이 있습니까?
내가 프로그래머이고 문제를 해결해야하는 NP-complete 문제가 있다고 가정합니다. NPC 문제를 처리하기 위해 어떤 방법을 사용할 수 있습니까? 이 주제에 대한 설문 조사 또는 유사한 것이 있습니까?
답변:
잘 연구 된 여러 전략이 있습니다. 응용 프로그램에서 가장 좋은 것은 환경에 따라 다릅니다.
최악의 런타임 개선
문제 별 통찰력을 사용하여 종종 순진한 알고리즘을 개선 할 수 있습니다. 예를 들어, c < 1.3 [1] 인Vertex Cover에 대한 알고리즘이 있습니다. 이는순진한 Ω ( 2 n )에 비해 크게 개선 되었으며인스턴스 크기를 다루기 쉬운 것으로 만들 수 있습니다.
예상 런타임 향상
휴리스틱을 사용하여 많은 인스턴스에서 빠른 알고리즘을 고안 할 수 있습니다. 실제로 당신이 만나는 대부분을 포함한다면, 당신은 황금입니다. 예를 들어, 상당히 관여 된 솔버가 존재하는 SAT 및 다항식 문제를 해결하지만 여전히 단순한 Simplex 알고리즘이 있습니다. 종종 도움이되는 기본 기술 중 하나는 branch와 bound 입니다.
문제 제한
입력에 대해 더 많은 가정을 할 수 있으면 문제가 쉬워 질 수 있습니다.
결과 약화
이는 잘못되었거나 불완전한 결과를 허용한다는 의미입니다. 두 가지 주요 맛이 있습니다.
철저한 치료는 Hromkovič의 어려운 문제 에 대한 알고리즘을 참조하십시오 .
다른 답변은보다 이론적 인 관점 에서이 문제를 해결했습니다. 보다 실용적인 접근법이 있습니다.
"일반적인"NP- 완전 결정 문제 ( "이러한 제약 조건을 모두 만족시키는 것이 있습니까?" )의 경우, 이것이 항상 먼저 시도하는 것입니다.
문제 인스턴스를 SAT 인스턴스 로 인코딩하는 간단한 프로그램을 작성하십시오 .
그런 다음 좋은 SAT 솔버를 사용하여 (가장 빠른 멀티 코어 컴퓨터를 사용하여) 실행하고 어떤 일이 발생하는지 확인하십시오.
더 작은 인스턴스를 먼저 사용하여 시간이 얼마나 걸릴지 알 수 있습니다.
놀랍게도이 방법은 현재 문제에 대해 고유 한 솔버를 구현하는 것보다 훨씬 낫습니다.
SAT 솔버는 매우 영리하고 최적화되어 있습니다. 코드 최적화에 시간이 많이 걸리더라도 역 추적 검색 구현보다 성능이 뛰어납니다. 또한 정수 선형 프로그래밍 솔버와 같은 여러 가지 대안을 쉽게 능가합니다.
이것은 매우 적은 프로그래밍이 필요합니다. 1 단계는 비교적 간단하며 성능이 중요하지 않습니다. Python과 같은 스크립팅 언어를 사용할 수 있습니다. 다른 사람이 이미 2 단계에 필요한 모든 것을 구현했습니다.
전형적인 NP-hard 최적화 문제 ( "이러한 모든 제약 조건을 만족시키는 가장 작은 것을 찾으십시오" )의 경우,이 접근법은 작동하거나 작동하지 않을 수 있습니다.
결정 문제 로 쉽게 전환 할 수 있다면 ( "이러한 모든 제약 조건을 만족시키는 크기 4의 것이 있습니까?" , "크기 3은 어떻습니까?" ) 위와 같은 결정 접근 방식을 따르십시오.
그렇지 않으면 작은 솔루션 ( 가장 작은 솔루션 일 필요는 없음) 을 찾으려고하는 휴리스틱 솔버에 의존 할 수 있습니다 . 예를 들면 다음과 같습니다.
문제를 (가중치) MAX-SAT 인스턴스 로 인코딩하십시오 .
UBCSAT 패키지 의 휴리스틱 솔버를 사용하십시오 . 휴리스틱 솔버는 사소하게 병렬화됩니다. 수백 대의 컴퓨터가있는 컴퓨터 클러스터를 찾으십시오. 원하는만큼 솔버를 실행 한 다음 지금까지 찾은 최고의 솔루션을 사용할 수 있습니다.
난 수성을 공격하는 한 가지 방법은 매개 변수화 된 복잡성 맥락에서 문제를 생각하는 것입니다.
다음은 W 계층의 다른 클래스에있는 일부 샘플입니다.
이는 NP 문제를보다 정확하게 분류하기위한 또 다른 수준의 복잡성이며, 더 원하는 경우 Downey et al (1998)의 Parameterized Circuit Complexity 및 W Hierarchy 를 볼 수 있습니다 .
그리고 더 많은 것을 원한다면 Flum and Grohe의 Parameterized Complexity Theory 를 읽는 것이 좋습니다 .
그리고 마지막으로:
문제에 FPTAS (완전 다항식 근사법 )가 있으면 FPT이기도합니다 (반드시). 역방향으로 잘 알려진 것은 없으며 PTAS와 XP의 관계에 대한 연구도 있습니다. PTAS와 W 계층 구조 사이의 밀접한 관계가 아닙니다 (적어도 나는 지금은 모릅니다).
또한 경우에 따라 그래프에서 가장 긴 경로의 길이가 제한되고 솔루션의 크기가 제한됩니다 (예 : 피드백 정점 세트).
일부 사람들은 매개 변수화 된 복잡성이 실제로는 쓸모 없다고 생각할 수 있습니다. 그러나 이것은 잘못입니다. 매개 변수가있는 많은 알고리즘이 실제 응용 프로그램에서 발견되며 일부 매개 변수를 수정할 수있는 경우는 다음과 같습니다.
TSP에 대한 가장 빠르고 정확한 휴리스틱 알고리즘 중 하나는 다음 과 같습니다. Tour merging and branch decomposition . 문제의 매개 변수화를 사용합니다 (직접적인 것이 아니라 분기 분해 및 이들이 사용한 동적 프로그래밍 방식은 몇 가지 좋은 가정을 기반으로 함).
일부 답변에서 간단히 살펴 보았지만 실제로 NP- 완전 문제는 항상 해결되거나 근사치임을 강조하겠습니다. 실제로 NP 완료 문제를 해결할 수있는 주된 이유는 다음과 같습니다.
실제로 발생하는 인스턴스는 "최악의 경우"가 아닙니다.
불일치의 또 다른 이유는 다음과 같습니다.
휴리스틱 알고리즘을 공식적으로 분석하기는 어렵습니다.
실제로 휴리스틱 알고리즘을 사용하여 NP 완료 문제를 해결하고 최선을 다하겠습니다. 결과는 종종 충격적입니다.
다른 답변에서 다룬 다른 문제는 다음과 같습니다.
때로는 지수 알고리즘이 충분히 빠릅니다.
물론 문제에 달려 있습니다. 빅 데이터가 관련 될 때 우리는 반대의 최대 값을 갖습니다.
때로는 유일하게 실행 가능한 알고리즘이 준 선형입니다.
나는 여기 군중이 이론적으로 다소 기울어 질까 두렵다. 기본 스택 교환 사이트에서 더 나은 답변을 얻을 수 있습니다.