다루기 힘든 문제 : NP- 완전 문제


43

내가 프로그래머이고 문제를 해결해야하는 NP-complete 문제가 있다고 가정합니다. NPC 문제를 처리하기 위해 어떤 방법을 사용할 수 있습니까? 이 주제에 대한 설문 조사 또는 유사한 것이 있습니까?


4
어떤 문제가 있는지 알려주는 것이 좋습니다.
Dave Clarke

2
이 질문은 특정 문제에 관한 것이 아닙니다. 필요한 경우 나중에 적용 할 수 있도록 기술을 알고 싶습니다.
익명

1
이것은 묻는 것과 같습니다. 일반적으로 다항식 시간의 문제를 어떻게 해결합니까? 수많은 문제가 있으며 각각 고유 한 솔루션이 있습니다.
Dave Clarke

3
@DaveClarke : 확립 된 기술이 있으므로 질문이 유효한 것으로 생각합니다. 그러나 더 집중된 질문이 더 나을 수도 있습니다.
Raphael

답변:


54

잘 연구 된 여러 전략이 있습니다. 응용 프로그램에서 가장 좋은 것은 환경에 따라 다릅니다.

  • 최악의 런타임 개선
    문제 별 통찰력을 사용하여 종종 순진한 알고리즘을 개선 할 수 있습니다. 예를 들어, c < 1.3 [1] 인Vertex Cover에 대한 알고리즘이 있습니다. 이는순진한 Ω ( 2 n )에 비해 크게 개선 되었으며인스턴스 크기를 다루기 쉬운 것으로 만들 수 있습니다.O(cn)c<1.3Ω(2n)

  • 예상 런타임 향상
    휴리스틱을 사용하여 많은 인스턴스에서 빠른 알고리즘을 고안 할 수 있습니다. 실제로 당신이 만나는 대부분을 포함한다면, 당신은 황금입니다. 예를 들어, 상당히 관여 된 솔버가 존재하는 SAT 및 다항식 문제를 해결하지만 여전히 단순한 Simplex 알고리즘이 있습니다. 종종 도움이되는 기본 기술 중 하나는 branch와 bound 입니다.

  • 문제 제한
    입력에 대해 더 많은 가정을 할 수 있으면 문제가 쉬워 질 수 있습니다.

    • 구조적 특성
      입력 값에는 평면성,이 분성 또는 그래프에 대한 마이너 누락과 같은 문제 해결을 단순화하는 특성이있을 수 있습니다. CLIQUE가 쉬운 그래프 클래스의 예는 여기 를 참조 하십시오 .

    • O(2knm)kmkn
    • 입력량 경계
      또한, 몇 가지 문제에 실행하는 것이 인정 알고리즘을 의사 다항식 시간은 , 그 자신의 실행은 다항 함수에 의해 제한된다 번호 입력의 일부이고; 순진한 우선 순위 점검이 예입니다. 즉, 인스턴스에 인코딩 된 수량의 크기가 합리적이라면 간단한 알고리즘이 적합 할 수 있습니다.
  • 결과 약화
    이는 잘못되었거나 불완전한 결과를 허용한다는 의미입니다. 두 가지 주요 맛이 있습니다.

철저한 치료는 Hromkovič의 어려운 문제대한 알고리즘을 참조하십시오 .


  1. 단순함은 아름다움입니다 : Chen Jianer, Iyad A. Kanj, Ge Xia (2005)

4
물론 몬테 카를로 또는 라스베가스 알고리즘은 NP-어려운 문제에 polytime에서 실행하기가 매우 어렵다
Sasho 니콜 로프

12

다른 답변은보다 이론적 인 관점 에서이 문제를 해결했습니다. 보다 실용적인 접근법이 있습니다.


"일반적인"NP- 완전 결정 문제 ( "이러한 제약 조건을 모두 만족시키는 것이 있습니까?" )의 경우, 이것이 항상 먼저 시도하는 것입니다.

  1. 문제 인스턴스를 SAT 인스턴스 로 인코딩하는 간단한 프로그램을 작성하십시오 .

  2. 그런 다음 좋은 SAT 솔버를 사용하여 (가장 빠른 멀티 코어 컴퓨터를 사용하여) 실행하고 어떤 일이 발생하는지 확인하십시오.

더 작은 인스턴스를 먼저 사용하여 시간이 얼마나 걸릴지 알 수 있습니다.


놀랍게도이 방법은 현재 문제에 대해 고유 한 솔버를 구현하는 것보다 훨씬 낫습니다.

  • SAT 솔버는 매우 영리하고 최적화되어 있습니다. 코드 최적화에 시간이 많이 걸리더라도 역 추적 검색 구현보다 성능이 뛰어납니다. 또한 정수 선형 프로그래밍 솔버와 같은 여러 가지 대안을 쉽게 능가합니다.

  • 이것은 매우 적은 프로그래밍이 필요합니다. 1 단계는 비교적 간단하며 성능이 중요하지 않습니다. Python과 같은 스크립팅 언어를 사용할 수 있습니다. 다른 사람이 이미 2 단계에 필요한 모든 것을 구현했습니다.


전형적인 NP-hard 최적화 문제 ( "이러한 모든 제약 조건을 만족시키는 가장 작은 것을 찾으십시오" )의 경우,이 접근법은 작동하거나 작동하지 않을 수 있습니다.

결정 문제쉽게 전환 할 수 있다면 ( "이러한 모든 제약 조건을 만족시키는 크기 4의 것이 있습니까?" , "크기 3은 어떻습니까?" ) 위와 같은 결정 접근 방식을 따르십시오.

그렇지 않으면 작은 솔루션 ( 가장 작은 솔루션 일 필요는 없음) 을 찾으려고하는 휴리스틱 솔버에 의존 할 수 있습니다 . 예를 들면 다음과 같습니다.

  1. 문제를 (가중치) MAX-SAT 인스턴스 로 인코딩하십시오 .

  2. UBCSAT 패키지 의 휴리스틱 솔버를 사용하십시오 . 휴리스틱 솔버는 사소하게 병렬화됩니다. 수백 대의 컴퓨터가있는 컴퓨터 클러스터를 찾으십시오. 원하는만큼 솔버를 실행 한 다음 지금까지 찾은 최고의 솔루션을 사용할 수 있습니다.


8

매개 변수화 된 복잡성

난 수성을 공격하는 한 가지 방법은 매개 변수화 된 복잡성 맥락에서 문제를 생각하는 것입니다.

kf(k)p(n)kf(k)

O(nf(k))

다음은 W 계층의 다른 클래스에있는 일부 샘플입니다.

  1. 정점 커버는 FPT입니다 (그래서 무 방향 그래프의 정점 분리 경로)
  2. 독립 세트와 Clique는 모두 W [1] 완료
  3. 지배 세트는 W [2]-완료입니다.

이는 NP 문제를보다 정확하게 분류하기위한 또 다른 수준의 복잡성이며, 더 원하는 경우 Downey et al (1998)의 Parameterized Circuit Complexity 및 W Hierarchy 를 볼 수 있습니다 .

그리고 더 많은 것을 원한다면 Flum and Grohe의 Parameterized Complexity Theory 를 읽는 것이 좋습니다 .

그리고 마지막으로:

매개 변수화 된 복잡성 대 근사화 알고리즘 :

문제에 FPTAS (완전 다항식 근사법 )가 있으면 FPT이기도합니다 (반드시). 역방향으로 잘 알려진 것은 없으며 PTAS와 XP의 관계에 대한 연구도 있습니다. PTAS와 W 계층 구조 사이의 밀접한 관계가 아닙니다 (적어도 나는 지금은 모릅니다).

또한 경우에 따라 그래프에서 가장 긴 경로의 길이가 제한되고 솔루션의 크기가 제한됩니다 (예 : 피드백 정점 세트).

실제 사용법 샘플 :

일부 사람들은 매개 변수화 된 복잡성이 실제로는 쓸모 없다고 생각할 수 있습니다. 그러나 이것은 잘못입니다. 매개 변수가있는 많은 알고리즘이 실제 응용 프로그램에서 발견되며 일부 매개 변수를 수정할 수있는 경우는 다음과 같습니다.

  1. 2...2O(n)2O(k)k=10

  2. TSP에 대한 가장 빠르고 정확한 휴리스틱 알고리즘 중 하나는 다음 같습니다. Tour merging and branch decomposition . 문제의 매개 변수화를 사용합니다 (직접적인 것이 아니라 분기 분해 및 이들이 사용한 동적 프로그래밍 방식은 몇 가지 좋은 가정을 기반으로 함).


5

NP 완성도는 최악의 난도에 관한 것입니다. 어떤 문제를 해결하고 있는지에 따라 많은 인스턴스 클래스가 합리적인 시간에 실제로 해결 될 수 있습니다 (좋은 런타임을 얻으려면보다 전문화 된 알고리즘이 필요할 수 있음).

Boolean Satisfiability 또는 Integer Linear Programming과 같은 유용한 솔버 문제로 문제를 효율적으로 줄일 수 있는지 살펴보십시오.


4

vivjvkGG허용 가능한 알고리즘을 사용하여 기하 급수적으로 문제를 해결하십시오 . 지수 알고리즘 중에서 문제의 입력 크기가 특정 값보다 작 으면 일부 알고리즘의 실행 시간을 견딜 수 있습니다.


2

일부 답변에서 간단히 살펴 보았지만 실제로 NP- 완전 문제는 항상 해결되거나 근사치임을 강조하겠습니다. 실제로 NP 완료 문제를 해결할 수있는 주된 이유는 다음과 같습니다.

실제로 발생하는 인스턴스는 "최악의 경우"가 아닙니다.

불일치의 또 다른 이유는 다음과 같습니다.

휴리스틱 알고리즘을 공식적으로 분석하기는 어렵습니다.

실제로 휴리스틱 알고리즘을 사용하여 NP 완료 문제를 해결하고 최선을 다하겠습니다. 결과는 종종 충격적입니다.

다른 답변에서 다룬 다른 문제는 다음과 같습니다.

때로는 지수 알고리즘이 충분히 빠릅니다.

물론 문제에 달려 있습니다. 빅 데이터가 관련 될 때 우리는 반대의 최대 값을 갖습니다.

때로는 유일하게 실행 가능한 알고리즘이 준 선형입니다.


나는 여기 군중이 이론적으로 다소 기울어 질까 두렵다. 기본 스택 교환 사이트에서 더 나은 답변을 얻을 수 있습니다.

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