📈알고리즘/알고리즘

근사 알고리즘(2) 작업 스케줄링 문제, 클러스터링 문제

하얀성 2023. 5. 24. 19:06

<작업 스케줄링 문제>

작업스케줄링은 시간이 시작 시간이 가장 빠른 것을 기준으로 스케줄링할 때는 해를 구할 수 있지만, 

그렇지 않을 때에는 해를 구할 수 없다.

 

여기서는 배정된 작업에 대해서 가장 빨리 끝나는 기계에 새 작업을 배정한다.

 

-Approx_JobScheduling 슈도 코드-

 

입력: n개의 작업, 각 작업 수행 시간 ti, i = 1,2, ... n, 기계 Mj, j = 1,2, ...m

출력: 모든 작업이 종료된 시간

1  for j = 1to m

2      L[j] = 0         // L[j] = 기계 Mj에 배정된 마지막 작업의 종료 시간

3  for i = 1 to n {

4      min = 1

5      for j = 2 to m {     // 가장 일찍 끝나는 기계를 찾는다.

6         if(L[j] < L[min]) {

7           min = j

           }

8      작업 i를 기계 Mmin에 배정한다.

9      L[min] = L[min] + ti

       }

     }

10  return 가장 늦은 작업 종료 시간

 

line2:  L[기계순번] = 기계가 총 일하는 시간  

line6: L[2] < L[1] 기계1과 기계2부터 비교하기 시작해서 더 작은  기계 인덱스를 min 값에 채워넣으면서 시간이 최소인 기계 인덱스를 찾아나간다.


<클러스터링 문제>

 

-Approx_k_Clusters 슈도 코드-

 

입력: 2차 평면상의 n개의 점 xi, i=0,1...,n-1, 그룹의 수 k > 1

출력: k개의 클러스터 및 각 클러스터의 센터

1  C[1] = r, 단, xr은 n개의 점 중에서 랜덤하게 선택된 점이다.

2  for j = 2 to k {

3     for i = 0 to n-1 {  // 모든 점을 한번씩 다 검토

4       if(xi != 센터)

5         xi와 각 센터까지의 거리를 계산하여, xi와 가장 가까운 센터까지의 거리를 D[i]에 저장한다.

       }

6     C[j] = i, 단, i는 배열 D의 가장 큰 원소의 인덱스이고, xi는 센터가 아니다.

    }

7  센터가 아닌 각 점 xi로부터 앞서 찾은 k개의 센터까지 거리를 각각 계산하고 그 중에 가장 짧은 거리의 센터를 찾는다.

     이때 점 xi는 가장 가까운 센터의 클러스터에 속하게 된다.

8  return 배열 C와 각 클러스터에 속한 점들의 리스트