최적화 알고리즘의 최적 성을 평가하는 일반적인 방법이 있습니까?


9

최적화 알고리즘의 최적 성을 평가하는 일반적인 방법, 예를 들어 NP-hard 또는 NP-complete 문제를 해결하는 알고리즘이 있습니까?

지금까지 내가 찾은 유일한 방법은 알고리즘 결과를 이미 알려진 최적 솔루션과 비교하는 것입니다.

그렇지 않은 경우 일부 특수한 문제에 대한 구체적인 방법이 있습니까?

편집 명확히하기 : 최적 성이란 결과가 최적 솔루션 결과에 얼마나 근접한지를 의미합니다.



최적화 알고리즘의 '최적화'를 어떻게 정의합니까? 소스 코드를 분석 한 다음 근사 계수가 무엇인지보고 하시겠습니까?
Alex ten Brink

"다양한 유형의 리소스 소비량과 관련하여 알고리즘의 속성을 설명하는 데"사용되는 알고리즘의 "효율"을 의미합니다. 알고리즘도 정확하고 휴리스틱으로 나뉩니다. 정확한 알고리즘은 최적의 솔루션을 찾도록 보장하지만 휴리스틱은보다 합리적인 시간에 글로벌 최적에 가까운 솔루션을 찾는 동안 수백 년의 CPU 시간 (실제 크기 NP- 하드 문제의 경우)이 소요될 수 있습니다. (입력 크기에 따라 분 또는 시간
Florents Tselai

답변:


3

문제의 종류에 따라 다릅니다.

문제에 대해 다항식 시간 근사법 (PTAS) 이있는 경우 (예 : Euclidian TSP) 다항식 시간에서 최적의 솔루션에 임의로 가까운 솔루션을 얻을 수 있습니다. 즉, 모든 e > 0에 대해 문제에 대한 대략적인 솔루션을 찾는 다항식 시간 알고리즘이 있으며 , 이는 최적 솔루션의 (1+ e ) 내에 있어야 합니다. 이 경우 동일한 e 값에 대해 두 알고리즘의 런타임 / 메모리 복잡성을 비교하면됩니다 . 한 알고리즘이 다른 알고리즘과 동일한 "최적 보장"을 수행 할 수 있지만 실행 시간 / 메모리 비용이 더 낮 으면 더 나은 알고리즘 일 것입니다.

문제가 APX이지만 PTAS가 아닌 경우, 즉 최적 솔루션의 상수 요소 내에 솔루션을 생성 할 수있는 다항식 시간 근사 알고리즘이있는 경우 해당 상수 요소를 비교할 수 있습니다. 요소가 적을수록 더 나은 솔루션을 얻을 수 있습니다 (그러나 종종 더 높은 실행 시간 / 메모리 비용으로)

문제가 해당 클래스 중 어느 쪽에도없는 경우 임의의 문제 세트 또는 알려진 최적 솔루션의 문제에 대한 솔루션을 비교하는 것이 최선의 방법이라고 생각합니다.


1

나는 그것을 하는 일반적인 방법 은 없다고 생각 하지만 확실히하는 방법이 있습니다.

예를 들어 SET-COVER 문제를 생각해보십시오. 문제를 모르는 사람들은 다음과 같습니다.

요소 B={1,2,...,m}집합과 S_1, S_2, ..., S_n합집합이 많은 하위 집합 이 주어 B집니다. 공용체가 여전히 유지되도록 이러한 하위 집합의 최소 수를 찾으려고합니다 B. 이 문제에 대한 실제 전형적인 예는 여러분이 이웃을 모으고 각 이웃이 d가장 가까운 학교에서 조금 떨어진 곳에서 서비스를받을 수 있도록 학교를 배치 할 최적의 장소를 찾으려고하는 것 입니다. 이 경우, B이웃 S_x집합 d이며 town 내의 모든 집합으로 구성됩니다 x.

이 문제는 NP-COMPLETE임을 증명합니다. 그러나 S_i가장 많은 수의 노출되지 않은 요소가 있는 세트를 반복해서 선택하는 간단한 탐욕스러운 솔루션이 있습니다 . 그리고이 알고리즘 이 잘 작동 한다는 것을 증명할 수 있습니다 .

최적 알고리즘이 k세트 로 구성되는 경우, 탐욕스러운 알고리즘은 k ln(n)ln이 자연 로그인 세트만으로 구성됩니다 .


1

프로그램이 '최적 성능'에 대한 정의에 대해 '최적 성능'A 또는 '최적 성능'B를 갖는지 여부를 결정하는 문제는 일반적으로 결정 불가능합니다 (아래 증명). 이것은 알고리즘이 얼마나 최적인지 항상 알려줄 수있는 단일 방법이 없음을 의미합니다.

그러나 근사 알고리즘을 분석 할 때 종종 적용되는 방법이 있습니다. 근사 알고리즘은 솔루션이 최적 솔루션에서 얼마나 멀리 떨어져 있는지에 대한 보증으로 평가되는 경우가 많습니다. 예를 들어 문제와 근사법을 설명하겠습니다. 비율을 증명하기 위해 가장 일반적으로 사용되는 '하한'방법을 사용하여 증명합니다.

문제는 '트럭 로딩 (Truck Loading)'문제입니다. 우리는 같은 트럭이 많고 (우리가 원하는만큼), 각각 최대 T의 무게를 지탱할 수있는 트럭이 있습니다. 수송. 모든 물체 i의 무게는 w_i이며, 여기서 w_i <= T입니다 (따라서 트럭에 맞지 않는 품목은 없습니다). 항목은 부분으로 나눌 수 없습니다. 가능한 한 적은 수의 트럭이 필요하도록 트럭을 채우고 싶습니다. 이 문제는 NP 완료입니다.

이 문제에 대한 매우 쉬운 근사 알고리즘이 있습니다. 트럭이 가득 차서 다음 품목이 맞지 않을 때까지 품목을 트럭에 적재하기 시작합니다. 그런 다음 다른 트럭을 가져 와서이 트럭에 이전 트럭에 맞지 않은 품목을 적재합니다. 이 트럭에 더 이상 품목을 적재하지 않습니다. 대신에 새로운 트럭을 가져 가서 더 이상 맞지 않을 때까지 많은 품목으로 다시 채우고 마지막 품목을 자체 트럭에 다시 넣습니다.

이 알고리즘은 문제에 대한 소위 2 근사치입니다. 최적의 솔루션에 필요한 최대 2 배의 트럭을 사용합니다. '최대한'은 매우 중요합니다. 우리는 운이 좋으며 최적의 솔루션을 찾을 수 있지만 적어도 그렇게 나쁘지는 않습니다.

이를 증명하기 위해 먼저 필요한 최적의 트럭 수에 대한 하한을 정의합니다. 이를 위해 품목을 부품으로 절단 할 수 있다고 상상하십시오. 그러면 마지막 트럭을 제외한 모든 트럭을 쉽게 채울 수 있습니다. 그렇게한다면 필요한 트럭 수는 원래 질문에 필요한 트럭 수의 하한선입니다. '최상의'경우 최적 솔루션은 항상 모든 트럭을 완전히 채 웁니다 (이 경우 트럭 수) 동일하지만 최적의 솔루션으로 트럭을 채우지 않으면 더 많은 트럭 만 있으면됩니다.

이제 우리는 근사 알고리즘을 봅니다. 모든 단계에서, 우리는 (부분적으로) 2 대의 트럭을 채 웁니다. 알고리즘이 작동하는 방식에 따라 첫 번째 트럭의 항목과 두 번째 트럭의 항목이 함께 첫 번째 트럭에 맞지 않을 수 있으므로 합계는 T 이상입니다. 이는 모든 단계에서 최소 전체를로드한다는 의미입니다 2 대의 트럭 에있는 품목의 트럭 가치 . 이제 이것을 하한과 비교하십시오.이 경우 트럭 한 대에 상당량의 품목을 하나의 트럭 에 적재합니다 . 다시 말해, 근사 알고리즘은 하한 '솔루션'과 매우 유사하지만 하나 대신 두 개의 트럭을 사용하는 솔루션을 선형 시간으로 계산합니다. 따라서 최적 알고리즘의 하한보다 최대 2 배 많은 트럭을 사용하기 때문에 최적 알고리즘보다 최대 2 배 많은 트럭을 사용합니다.


이 알고리즘은 상수 팩터 근사치를 제공합니다. 최적 솔루션 보다 최대 2 나쁩니다. 다른 측정 값의 예 : 최대 C보다 최적 솔루션보다 높음 (추가 오류, 매우 드문 경우), 최대 clog n 배가 최적 솔루션보다 나쁨, 최대 cn 배가 최적 솔루션보다 나쁨 최대 2 개 ^ (dn) 배가 최적의 솔루션보다 나쁩니다 (매우 나쁩니다. 예를 들어, 일반 TSP는 이러한 종류의 보증이있는 알고리즘 만 허용합니다).

물론 증명하는 요소가 증명할 수있는 최상의 요소인지 확인하려면 알고리즘이 제공하는 솔루션이 실제로 가능한 한 나쁜 인스턴스를 찾아야합니다.

또한 NP-hard가 아닌 문제에 대해 근사 알고리즘을 사용하기도합니다.

나는 우리 대학의 근사 알고리즘 과정에서 이것을 많이 배웠습니다.


결정 불가능한 증거 : P가 문제가되고 A와 B가 P에 대한 근사 알고리즘이되게하십시오. 여기서 A와 B는 '최적 성'에 대한 의미있는 정의에 대해 동일한 '최적 성'을 갖지 않으며 A와 B의 실행 시간이 모두 오메가 인 경우 (1) 일정 시간보다 엄격히 느리게 (즉, 더 큰 경우에는 느려짐) A와 B는 항상 정지합니다.

D가 다음을 계산할 수 있다고 주장하는 프로그램이라고하자. 일부 프로그램 C가 P에 대한 근사값을 계산하는 경우 충분히 큰 입력에 대해 A만큼 좋은지 B만큼 좋은지 결정하십시오 (따라서 프로그램을 분류하는 데 사용할 수 있음) 그들의 최적성에 따라).

그런 다음 D를 사용하여 중지 문제를 해결할 수 있습니다. E는 프로그램이고 F는이 프로그램의 입력이라고하자. 우리는 D를 사용하여 E가 입력 F에서 멈출 지 여부를 결정합니다.

문제 P에 대한 입력 S가 주어지면 F에서 E를 실행하고 S에서 S를 병렬로 실행합니다. 잠시 동안 E를 실행 한 다음 A, E를 다시 실행합니다. E가 F에서 중지되면 A 실행을 중지하고 대신 S에서 B를 실행하고 B의 결과를 반환합니다. E가 정지되기 전에 A가 정지하면 A의 결과를 반환합니다.

G에서 D를 사용하면 E가 F에서 멈추는 지 여부가 결정됩니다. A와 달리 입력). 따라서 D는 G에 B의 최적 특성이 있다고보고합니다. E가 F에서 정지하지 않으면 D는 G에 A의 최적 특성이 있다고보고합니다.

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