한 대의 기계에서 작업 스케줄링하기¶
이 문제는 작업 $i$를 처리하는 데 $t_i$의 시간이 걸리고, 작업을 처리하기 전에 $t$초 동안 기다리면 $f_i(t)$의 페널티를 내야 할 때, 한 대의 기계에서 $n$개의 작업에 대한 최적 스케줄을 찾는 문제입니다.
따라서 이 문제는 총 페널티가 최소가 되는 작업의 순열을 찾는 것입니다. 작업의 순열을 $\pi$로 나타내면($\pi_1$은 첫 번째로 처리되는 항목, $\pi_2$는 두 번째 항목 등), 총 페널티는 다음과 같습니다.
특수한 경우의 해법¶
선형 페널티 함수¶
먼저 모든 페널티 함수 $f_i(t)$가 선형인 경우, 즉 $c_i$가 음이 아닌 수일 때 $f_i(t) = c_i \cdot t$ 꼴인 경우의 문제를 풀어 보겠습니다. 이 함수들에는 상수항이 없다는 점에 유의하십시오. 상수항이 있다면 모든 상수항을 따로 더해 두고, 상수항 없이 문제를 다시 풀면 됩니다.
어떤 순열 $\pi$를 고정하고, 인덱스 $i = 1 \dots n-1$을 하나 잡읍시다. 순열 $\pi'$를 순열 $\pi$에서 원소 $i$와 $i+1$을 맞바꾼 순열이라고 합시다. 페널티가 얼마나 바뀌는지 살펴봅시다.
변화는 $i$번째와 $(i+1)$번째 항에서만 일어난다는 것을 쉽게 알 수 있습니다.
스케줄 $\pi$가 최적이라면 여기에 어떤 변화를 주더라도 페널티가 증가한다는 것(또는 같은 페널티가 된다는 것)을 쉽게 알 수 있으므로, 최적 스케줄에 대해 다음 조건을 쓸 수 있습니다.
이를 정리하면 다음을 얻습니다.
따라서 작업을 분수 $\frac{c_i}{t_i}$의 비오름차순으로 정렬하기만 하면 최적 스케줄을 얻습니다.
이 알고리즘은 이른바 순열 방법으로 구성했다는 점에 유의하십시오. 인접한 두 원소를 맞바꿔 보고, 페널티가 얼마나 바뀌는지 계산한 다음, 최적의 방법을 찾는 알고리즘을 유도했습니다.
지수 페널티 함수¶
페널티 함수가 다음과 같다고 합시다.
여기서 모든 수 $c_i$는 음이 아니며 상수 $\alpha$는 양수입니다.
순열 방법을 적용하면, 작업을 다음 값의 비오름차순으로 정렬해야 한다는 것을 쉽게 알 수 있습니다.
동일한 단조 페널티 함수¶
여기서는 모든 $f_i(t)$가 같고, 이 함수가 단조 증가하는 경우를 다룹니다.
이 경우 최적 순열은 작업을 처리 시간 $t_i$의 비내림차순으로 배열하는 것임이 자명합니다.
Livshits-Kladov 정리¶
Livshits-Kladov 정리에 따르면 순열 방법은 앞서 언급한 세 가지 경우에만 적용할 수 있습니다. 즉, 다음과 같습니다.
- 선형인 경우: $f_i(t) = c_i(t) + d_i$이며, 여기서 $c_i$는 음이 아닌 상수입니다.
- 지수인 경우: $f_i(t) = c_i \cdot e_{\alpha \cdot t} + d_i$이며, 여기서 $c_i$와 $\alpha$는 양의 상수입니다.
- 동일한 경우: $f_i(t) = \phi(t)$이며, 여기서 $\phi$는 단조 증가 함수입니다.
그 밖의 모든 경우에는 이 방법을 적용할 수 없습니다.
이 정리는 페널티 함수가 충분히 매끄럽다는(3계 도함수가 존재한다는) 가정 아래에서 증명됩니다.
세 가지 경우 모두 순열 방법을 적용하며, 이를 통해 원하는 최적 스케줄을 정렬로, 즉 $O(n \log n)$ 시간에 찾을 수 있습니다.