전북대학교 알고리즘 개미 - 2조 // 영국 대중교통 이용방법 ★ Kyeom's Story

전북대학교 알고리즘 개미 -2조
알고리즘 프로젝트 http://ant.blackun.com




영국 대중교통수단 이용 방법

영국의 교통체계는 부러울 정도로 대중교통수단이 잘 정비되어있다. 따라서 여행자는 아무런 불편없이 여행할 수 있다.예컨데 여행자는 아침에 Ticket한장만 사면(Oneday Travel Card), 지하철, 2층버스, 기차 등을 가리지 않고 몇번이고 이용할수 있어서, 매번 Ticket을 구하는 불편을 덜수 있다. 한편, 교통비가 비싸게 느껴지지만 그것은 보통 한 두번만 사용하는 런던에 사는 사람에게만 해당되는 이야기이고, 여행자들은 여러번 사용할 수 있으므로 오히려 한국에서 보다 저렴하게 느껴지게 된다. 교통 수단간의 연결 체계도 잘 정비되어 있어서 예컨데 Victoria Coach Station(한국의 고속버스터미널에 해당)에만 가면 파리, 브뤼셀, 암스테르담, 스코틀랜드 등 어느곳이나 편리하게 이동 할 수 있다.

특히 영국의 요금체계는 요일에 따라서, 또 시간에 따라서 적용되는 요금이 다르고 몇개의 Zone으로 나누어 적용되는 요금 또한 다르다.특히 아침 9시30분 이전에 이동하려 할 경우 거의 2배에 가까운 비싼요금을 적용하게 되므로 이점을 참작하여야 한다.왕복 Ticket의 경우 편도요금과 거의 차이가 없고, 심지어 더 싼경우도 있다.또 스코틀랜드나 대륙으로 이동하는 경우 야간고속버스를 이용하면, 피곤하기는 하지만 시간도 벌고, 숙박비도 아끼게 되므로 여행 Scadule을 짜는데 참고 하시기 바랍니다. 또 이렇게 장거리 여행의 경우 Euro Pass들을 구입해 오는것이 보통인 배낭여행자의 경우 요금에 신경쓸필요가 없어 편리하다.



One Day Travelcards

월 ~ 금요일까지 9시30분부터 이용 가능하고 주말에는 아무때나 이용가능한 패스

Adult Child(5-15 years)

Zones 1 & 2 £5.10

All Zones(1-6) £6.40 £2.00

Bus Passes - 버스만 이용할수 있는 패스

Adult Child(5-15 years)

1Day bus pass(allzone) £3.50 £1.00

7Day bus pass(allzone) £14.00 £4.00

Underground Pass는 버스를 자유롭게 이용할수 있다.


전북대학교 알고리즘 개미 - 2조 ★ Kyeom's Study



< 알고리즘이란..? >

 

컴퓨터는 문제 해결을 위하여 사용되는 도구이고, 이 도구를 유용하게 활용하여 입력되는 데이터를 이용 가능한 새로운 형태로 변환하는 일이 데이터의 처리이다.

따라서 데이터를 하나의 형태로서 다른 형태로 바꾸는 데이터 변환(data transformation)이 능률적으로 이루어지기 위해서는 데이터의 구조, 데이터의 변환 과정, 그리고 데이터의 변환을 효과적으로 실행하기 위한 기술 등이 따라야 한다.

 

데이터의 변환 과정에서는 수학적이나 통계적인 연산, 즉 평균을 계산하거나 시간당 임율과 작업 시간수를 가지고 임금을 계산하는 연산들이 포함될 수 있다. 또, 워드 프로세서(word processor)를 이용한 문서 편집이나 문서 조작, 그리고 방대한 자료로부터 특정의 정보를 발췌해 내는 정보 검색(information retrieval) 등도 포함된다.

이러한 데이터 변환을 위해서 적용되는 잘 정의된 방법(well-defined method)이 알고리즘(algorithm)인데, 알고리즘은 결국 문제를 풀기 위한 절차를 정해둔 것이라고 할 수 있다.

 

알고리즘이란 특정 작업을 수행하기 위한 유한 개의 명령어의 집합으로써 다음과 같은 5가지의 조건을 만족하여야 한다.

  • 입력(input) : 데이터의 변환 대상이 되는 입력이 있어야 한다. 그러나 경우에 따라서는 데이터가 외부에서 투입되지 않고 내부에서 생성될 수도 있다.

  • 출력(output) : 데이터 변환 과정을 거쳐 적어도 한 가지 이상의 결과가 출력되어야 한다.

  • 명확성(definiteness) : 알고리즘을 구성하는 각 명령어들은 그 의미가 명백하고 모호하지 않아야 한다.

  • 유한성(infiniteness) : 알고리즘의 명령대로 순차적인 실행을 하면 언젠가는 반드시 실행이 종료되어야 한다.

  • 유효성(effectiveness) : 원칙적으로 모든 명령들은 오류가 없이 실행 가능해야 한다.

  • 이상과 같이 알고리즘은 입력, 출력, 명확성, 유한성, 유효성이 만족되어야 하는데, 프로그램(program)은 유한성이 만족되지 않아도 된다는 측면에서 알고리즘과 프로그램이 구별된다.

     

< 수업 교재 >

cover.jpg

< 책 소개 >

알고리즘의 설계, 알고리즘의 복잡도 분석, 그리고 계산복잡도의 세 가지 개념을 균형 있게 잘 설명한 책. 이 책은 수학적 개념을 이해하기 쉬운 말로 표현하고 있으며, 대부분의 알고리즘 교재보다 더 간단한 표기법을 사용하고 있다. 복습해야 할 중요한 수학적 개념은 세 부분으로 나누어 부록으로 따로 제공한다.

 

< 목차 >          

  1. 알고리즘: 효율, 분석 그리고 차수
  2. 분할정복법
  3. 동적 계획법
  4. 탐욕적인 방법
  5. 되추적
  6. 분기한정법
  7. 계산 복잡도의 소개: 정렬문제
  8. 계산 복잡도: 검색문제
  9. 계산복잡도와 다루기 힘든 정도
  10. 정수론적 알고리즘
  11. 병렬 알고리즘의 소개

 


전북대학교 알고리즘 개미 2조 - Divide and conquer ★ Kyeom's Study

http://ant.blackun.com/ch02
전북대학교 알고리즘 개미 - 2조


Divide and Conquer

 

분할 정복법은 하향식(Top-Down) 접근 방법이다.

, 문제의 맨 상위 사례의 해답은 아래로 내려가서 작은 사례에 대한 해답을 구함으로써 구한다.

 

Divide-and-conquer란 여러 개의 부프로그램으로 나누는 전략을 말한다. 다시 말하면, n개의 입력을 처리하는 함수는 divide-and-conquer를 통해 k(1 < k <= n)의 부프로그램으로 나뉘어 각각 처리하게 된다. n개의 입력은 k개의 부분집합으로 나뉘어 각각의 부분프로그램에서 처리되어 진 후, 이 결과값들을 합치어, 원하던 값을 얻게 된다.

 

만약, 나누어진 부프로그램이 여전히 처리하기에 크다면, 이 부프로그램은 다시 divide-and-conquer를 사용하여 더 작은 부프로그램으로 나뉘게 된다. 결국 프로그램은 더 이상 쪼갤 필요가 없을 때까지, 즉 처리하기에 충분히 작은 크기가 될 때까지 트리와 같은 형태로 부프로그램으로 나뉘어지게 된다.

 

흔히, Divide-and-conquer로 생긴 자식 프로그램은 원래의 부모 프로그램과 같은 타입을 가지는 경우가 많다. 다시 말해서, 자식 프로그램을 처리하는 것이 부모 프로그램을 처리하는 것과 입력의 크기만 다를 뿐, 과정이 모두 똑같다는 말이다

이런 경우, divide-and-conquer를 자식프로그램에서 적용하고자 한다면, 재귀함수를 사용하는 것이 자연스럽다. 사실, divide-and-conquer를 사용했다고 하면, 재귀함수를 이용했다고 보아도 무방할 것이다.

 

더 정확한 설명을 위해, divide-and-conquer 방법을 보여주는 프로그래밍 코드를 살펴보도록 하겠다.

 

 1:   Type DAndC(P)
 2:   {
 3:         if Small(P) return S(P);
 4:         else {
 5:
 6:                divide P into smaller instances P1, P2, ... , Pk, K >= 1 ;
 7:                Apply DAndC to each of these subproblems;
 8:                return Combine(DAndC(P1), DAndC(P2), ... , DAndC(Pk));
 9:
10:         }
11:   }

< Program. Divide-and-conquer >

 

먼저, DAndC(P)가 호출될 것이다. 여기서 DAndC divide-and-conquer를 의미하며 P(problem)는 해결해야 할 문제이다. DAndC 내부에서는 제일 먼저 Small(P)가 호출되어진다.

 

Small 함수는 불리안(Boolean) 값을 반환하는 함수로, 입력 크기가 더 이상 쪼개질 필요없이 충분히 작을 경우 참을 반환한다. 반환값이 참인 경우, S(P)를 호출한다. S(solve) P를 풀어서 적당한 값을 반환하게 될 것이다.

 

다시 Small 함수로 돌아가자.

여기서 Small(P)의 값이 거짓이라면, P가 여전히 크다면, P k개의 부프로그램으로 나누어 질 것이다. 이 프로그램은 나누어진 부프로그램 P1, P2, .. 등이 P와 같은 타입을 가지는 경우이므로, 재귀함수를 이용하여 똑같은 과정을 적용하게 된다. Combine 함수는 k개의 부프로그램으로부터 얻은 결과들을 합쳐서 P의 솔루션을 얻어내게 된다.

 

위 알고리즘에서 살펴보았듯이, divide-and-conquer를 기반으로 하는 알고리즘은 부모 프로그램과 자식 프로그램(또는 부프로그램)이 형태가 같은 경우가 많으므로, 재귀함수를 사용하는 것이 자연스럽다.

 

분할정복의 사용의 예...

① 이분검색(Binary Search)

② 합병정렬(Merge Sort)

③ 빠른 정렬(Quick Sort)

④ 행렬의 곱셈

⑤ 큰 정수의 계산


전북대학교 알고리즘 개미 - Greedy algorithm ★ Kyeom's Study



http://ant.blackun.com

(전북대학교 알고리즘 개미 -2조 프로젝트 )



Greedy Algorithm

 

Greedy 알고리즘은 스크루지가 금을 모으던 것과 같은 방식으로 진행한다.
즉, 순서대로 데이터 아이템을 선택하는데, 전에 결정했거나 후에 결정할 선택과는 상관없이 어떤 기준에 따라서 그 당시 "가장 최고"라고 생각되는 것을 매번 선택한다.
그러나 Greedy 알고리즘이 항상 최적의 solution을 만들지는 않는다.

간단한 예:
수퍼마켓에서 카운터를 보고 있는 조(Joe)는 손님에게 거스름돈을 주어야 하는 상황을 종종 겼게 된다. 손님은 동전만 많이 받는 걸 좋아하진 않는다. 예를 들면 거스름돈이 $0.87 인 경우, 1페니짜리 동전 87개를 주면 아마 거의 모든 손님은 화를 낼 것이다. 따라서 조는 거스름돈을 정확히 주는 것 뿐 아니라, 동전의 개수가 가능한 적게 줄 수 있는 방법을 고려해야 한다.

이 방법을 high-level algorithm 으로 표현하면 다음과 같다.

 

while(there are more coins and the instance is not solved){
    // selection procedure
    grab the largest remaining coin;
 
    // feasibility check
    if(adding the coin makes the change exceed the amount owed)
      regect the coin;
    else
      add the coin to the change;
  
    // solution check
    if(the total value of the change equals the amount owed)
      the instance is solved
}

 

feasibility check 에서 어떤 동전을 더하여 거스름돈의 총액이 거슬러 주어야 할 액수를 초과하는 지를 검사할 때, 그 동전을 더하여 얻어진 집합이 solution이 될 수 없음을 알 수 있다. 따라서 그 집합은 feasibility 하지 않으므로 도로 집어넣게 된다. 이 알고리즘의 적용 예는 다음 그림과 같다.

ch1.png
figure 4.1 A greedy algorithm for giving change

 

현재 미국 통화 시스템( peny[$0.01], nickel[$0.05], dime[$0.10], quarter[$0.25], half dollar[$0.5])을 사용하면 이 알고리즘은 항상 최적 solution을 만들어 낸다.
그러나 만일 미국 통화 시스템에 12센트가 포함된다면 greedy 알고리즘은 항상 최적 solution을 제공하지는 않는다.
다음 그림이 그 예를 보여준다.

ch2.png
figure 4.2 The greedy algorithm is not optimal if a 12-cent coin is included.


Minimum Spanning Tree

Spanning Tree 란 모든 vertex 를 포함하고 acyclic 하며 connected 한 undirected graph 를 의미한다.

다음과 같이 a connected, weighted, undirected graph G 가 있다.

ch3.png

이 그래프 G 에서 순환경로를 제거하면 다음과 같이 두 개의 subgraph 가 만들어진다.

ch5.png


이 부분 그래프 중 가중치가 최소인 그래프가 Minimum Spanning Tree 이다.

이와 같이 모든 Spanning Tree 를 찾아서 가중치를 비교하여 Minimum Spanning Tree 를 찾는 방법은 굉장히 비효율 적이다. 최악의 경우 이러한 방법은 시간복잡도가 지수시간 이상이 된다.
이 때 Greedy 알고리즘을 사용하면 Minimum Spanning Tree를 효율적으로 구할 수 있다.

MST 를 Greedy 알고리즘으로 해결하는 high-level greedy algorithm은 다음과 같다.

// Initialize set of edges to empty
F = Φ

while ( the instance is not solved){
 // selection procedure
 select an edge according to some locally optimal consideration;
 
 // feasibility check
 if( adding the edge to F does not create a cycle)
  add it;
 
 // solution check
 if( T = (V,F) is a spanning tree )
  the instance is solved;
}

여기에서 selection procedure 부분이 "select an edge according to some locally optimal consideration" 로 간단히 적혀 있지만, 최적의 해를 구하는 방법이 하나만 존재하는 것이 아니다.
MST 문제를 푸는 greedy 알고리즘인 Prim의 알고리즘과 kruskal 의 알고리즘에 대해 살펴보자.



전북대학교 개미 알고리즘 ★ Kyeom's Study


http://ant.blackun.com/ant


Ant Colony Algorithm(ACO)

 

a01.png

 

 

개미 알고리즘(Ant algorithm)은 실제 개미들이 먹이까지 가장 짧은 경로를 찾는 것을 모방한 알고리즘입니다. 이 알고리은 1992년

Dorigo에 의해 처음 제안되었습니다. 개미들은 어떻게 가장 짧은 경로를 찾게 되는 것일까요? 다음과 같은 예제를 통해 살펴보겠습니다.

 

a02.png 

 

 

어떤 개미가 (a) 라는 길을 열심히 돌아다니다가 음식 (F)를 찾게 됩니다. 그 후 <그림1>과 같이 둥지로 돌아오는 경로 (b)에다가 페로몬

으로 흔적을 남기면서 돌아옵니다.

이 어떤 개미는 한 마리가 아니었고 4마리 정도가 동시에 둥지에 도착해서 <그림2> 번과 같이 여러 개의 길을 찾게 되었습니다. 이중에는

먹이까지 긴 길도 있고 짧은 길도 있게 됩니다.. 그러나 페로몬의 특성상 길에 남겨진 페로몬은 시간이 지날수록 그 향이 희미해진다.

경로가 길게 되면 개미들이 흔적을 남기는 시간도 길어지게 되며 자연적으로 긴 경로에는 상대적으로 페로몬 향이 옅어 지게 됩니다.

 

개미들은 여러 경로 중 페로몬 향이 강한 길을 선택해서 움직입니다.

짧은 길일 수록 개미들의 왕래가 잦아지면서 페로몬 향기는 짙어집니다.

결국 <그림3>과 같이 개미들은 가장 짧은 경로로 먹이를 운반하게 됩니다.

Ant 알고리즘은 최적의 경로를 선택합니다. 우리는 이 경로를 Edge 로 정의하고 Edge 끝은 Node 로 정의 합니다. 정리하면 다음과

같습니다.

a03.png 

 

 

Ant 알고리즘은 페로몬의 향기 정도를 다음과 같은 확률계산식으로 계산합니다.

a04.png 

 

 

이 식에서 τi,j edgei,j 의 페로몬의 양을 나타냅니다. α τi,j 의 값을 컨트롤 하는 파라미터 값입니다.

ηi,j edgei,j 에 대한 가중치를 나타내며 보통 노드 사이의 거리에 반비례하는 값입니다.

β ηi,j 의 값을 컨트롤 하는 파라미터 값입니다.

Ant 알고리즘에서 개미는 이 확률 값을 통해 경로를 선택하게 됩니다.

다음은 페로몬 업데이트 공식을 살펴 보겠습니다.

 

τi,j = (1 ρ)τi,j + Δτi,j

 

ρ 값은 페로몬의 증발 비율을 나타냅니다. Δτi,j 는 새로이 추가되는 양을 나타내며 다음과 같이 정의됩니다.

a05.png

 

 

Lk 는 노드 사이의 거리로 볼 수 있습니다.

 

Ant 알고리즘은 TSP 문제에 적용시킬 때 좋은 예가 됩니다.

a06.png

TSP는 판매원이 집에서 출발하여 모든 고개들의 도시에 방문하고 다시 집에 돌아오는 최단 경로를 찾는 문제 입니다.

 

이 문제에는 다음과 같은 전제 조건이 있다.

매판원의 집도 도시로 취급한다.

모든 도시들은 서로 연결되어 있다.

모든 도시들은 한번씩만 거쳐야 한다.

모든 도시들을 거친뒤 다시 매판원의 집으로 돌아와야 한다.

이 전제 조건을 고려하여 TSP를 구하는 Pseudocode 를 작성하면 다음과 같습니다.

-----------------------------------------------------------------------------------------------------

Start Node : Each ant is initially put on a ramdomly chosen start city

While(all ants don’t pass by every nodes)

while(an ant don’t pass by every nodes)

ant←getNextMovableNode()

ant←chooseNextNode()

end-while

Arc←updatePheromone(ant’s path)

End-while

-----------------------------------------------------------------------------------------------------

 개미는 처음에 랜덤하게 시작 노드를 정해 위치시킵니다.

페로몬을 업데이트 할 때는 짧은 경로일수록 가중치를 주기 위해서 경로의 길이가 짧을수록 페로몬이 증발량을 작게 합니다.

모든 개미가 모든 노드를 거치게 되면 프로그램이 종료하게 됩니다.

TSP의 결과는 프로그램이 종료된 후 그래프의 각 arc(경로)에 남아있는 페로몬의 수치가 높은 순으로 선택하면 앞의 그림처럼 하나의

루프가 형성된다.

이것은 곧 TSP의 최적의 해가 됩니다.

이러한 NP 문제를 해결하는 이외에도 ACO 알고리즘은 네트워크 분야, 유전학 분야, 검색 분야 등 다양한 곳에 적용 될 수 있습니다.

 


1