implementation of dijkstra algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의...

8
1 Implementation of Dijkstra Algorithm 컴퓨터공학전공 2004314081 박진영 1. 서론 1. 제안배경 필요성 Network서로 연결된 기기들의 집합입니다. 따라서 기기들이 1:1연락을 고받을 있록 어떻게 연결할 것인가가 문제입니다. 그에 답으로 mesh topologystar topology 등이 있습니다. 하지만 이는 매우 network에서는 상당 비효율적입니다. 따라서 이보다 좋은 방법이 switching입니다. Switching에는 크게 Circuit-SwitchedDatagram있습니다. InternetDatagram사용합니다. Datagrampacket이라는 단위로 data원하는 기기로 송합니다. 따라서 기기 중간에 있는 기기(체로 router)packet안의 destination address확인하여 shortest pathpacket보내야 합니다. 그렇기에 router지까지 가장 빠른 길을 알아야 합니다. 현재 Internet매우 크기에 하나의 routing protocol로는 한계가 있습니다. 따라 autonomous system(AS)라는 단위로 network나눕니다. 이런 AS간의 routinginterdomain routing이라 하고, AS안에서의 routingintradomain routing이라 합니다. Intradomain routing쓰이는 routing protocoldistance vector protocolimplementation‘Routing Information Protocol(RIP)’link state protocolimplementation‘Open Shortest Path First(OSPF)’있습니다. Distance Vector Routing이웃한 node끼리 거리 정보를 주고받아 shortest path찾습니다. , Ford-Fulkerson (distributed) shortest path algorithm사용합니다. 이는 계산이 빠르다는 장점이 있지만, 정확한 shortest path아닐 있고 loop발생 있습니다. 그리고 node 사이의 link끊겨질 경우 이를 바로 처리하지 하는 , Instability발생할 있는 단점이 있습니다. 이와 다르게 Link State RoutingLink 상태를 모든 node에게 전달하여 node 자신을 출발로 하여 모든 nodeshortest path구하록 합니다. Dijkstra (centralized) shortest path algorithm사용합니다. 이는 일이 복잡하고 오래 걸린다는 단점이 있지만 정확한 shortest path제공한다는 것과 link끊겨지는 문제 발생시 빠르게 처리한다는 장점이 있습니다. 2. 프로젝트의 목표 프로젝트에서는 AS안에서의 routingintradomain routing Link State Routing구현합니다. 이것은 Dijkstra’s algorithm이용하여 shortest path 구합니다. 주어진 Intra Network정보를 가지고 있는 상황에서 유저가 하나의 node선택하면 선택된 node에서부터 Network 모든 node까지 shortest pathDijkstra’s algorithm이용하여 구합니다. 결과물로 선택된 node해당 node까지 가는 소요되는 costpath 다음 hopnext hop address출력합니다.

Upload: others

Post on 27-Jan-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

1

Implementation of Dijkstra Algorithm

컴퓨터공학전공 2004314081 박진영

1. 서론 1. 제안배경 및 필요성

Network는 서로 연결된 기기들의 집합입니다. 따라서 기기들이 1:1로 연락을 주

고받을 수 있도록 어떻게 연결할 것인가가 문제입니다. 그에 대한 답으로 mesh

topology나 star topology 등이 있습니다. 하지만 이는 매우 큰 network에서는 상당

히 비효율적입니다. 따라서 이보다 더 좋은 방법이 switching입니다.

Switching에는 크게 Circuit-Switched와 Datagram이 있습니다. 이 중 Internet은

Datagram을 사용합니다. Datagram은 packet이라는 단위로 data를 원하는 기기로 전

송합니다. 따라서 기기 중간에 있는 기기(대체로 router)는 packet안의 destination

address를 확인하여 shortest path로 packet를 보내야 합니다. 그렇기에 router는 도착

지까지 가장 빠른 길을 알아야 합니다.

현재 Internet은 매우 크기에 하나의 routing protocol로는 한계가 있습니다. 따라

서 autonomous system(AS)라는 단위로 network를 나눕니다. 이런 AS간의 routing을

interdomain routing이라 하고, AS안에서의 routing을 intradomain routing이라 합니다.

Intradomain routing에 쓰이는 routing protocol로 distance vector protocol을

implementation한 ‘Routing Information Protocol(RIP)’과 link state protocol을

implementation한 ‘Open Shortest Path First(OSPF)’가 있습니다.

Distance Vector Routing은 이웃한 node끼리 거리 정보를 주고받아 shortest path를

찾습니다. 즉, Ford-Fulkerson (distributed) shortest path algorithm을 사용합니다. 이는

계산이 빠르다는 장점이 있지만, 정확한 shortest path가 아닐 수 있고 loop가 발생

할 수 있습니다. 그리고 node 사이의 link가 끊겨질 경우 이를 바로 처리하지 못

하는 즉, Instability가 발생할 수 있는 단점이 있습니다.

이와 다르게 Link State Routing은 Link 상태를 모든 node에게 전달하여 각 node

가 자신을 출발로 하여 모든 node의 shortest path를 구하도록 합니다. 이 때

Dijkstra (centralized) shortest path algorithm을 사용합니다. 이는 일이 복잡하고 오래

걸린다는 단점이 있지만 정확한 shortest path를 제공한다는 것과 link가 끊겨지는

문제 발생시 빠르게 처리한다는 장점이 있습니다.

2. 프로젝트의 목표

이 프로젝트에서는 AS안에서의 routing인 intradomain routing 중 Link State

Routing를 구현합니다. 이것은 Dijkstra’s algorithm을 이용하여 shortest path

를 구합니다.

주어진 Intra Network의 정보를 가지고 있는 상황에서 유저가 하나의

node를 선택하면 선택된 node에서부터 Network 안 모든 node까지 shortest

path를 Dijkstra’s algorithm을 이용하여 구합니다. 결과물로 선택된 node에

서 해당 node까지 가는데 소요되는 cost와 path 중 다음 hop인 next hop

address를 출력합니다.

Page 2: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

2

2. Implementation

그림 1 Intra Network

위의 Intra Network에서 Dijkstra’s Algorithm을 쓰기 위해서는 먼저 각 node들에게

link의 정보를 알려주는 link state packet(LSP)가 전송되어야 합니다. 여기서는 그것

에 대한 직접적인 구현을 하지 않고 이미 정보가 주어졌다는 가정을 하여 2차원

배열로 그 정보를 받았습니다. 행은 중심이 되는 node 각각을 가리키고, 열은 행

의 node에서 열에 맞는 node까지의 metric을 나타내었습니다.

Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7

Node 1 0 7 2 INF_MET INF_MET INF_MET 10

Node 2 7 0 INF_MET 5 11 INF_MET INF_MET

Node 3 2 INF_MET 0 7 INF_MET INF_MET 3

Node 4 INF_MET 5 7 0 INF_MET 6 8

Node 5 INF_MET 11 INF_MET INF_MET 0 4 INF_MET

Node 6 INF_MET INF_MET INF_MET 6 4 0 9

Node 7 7 INF_MET 3 8 INF_MET 9 0

표 1 Intra Network metrics matrix

여기서 INF_MET는 행 node에서 열 node로 가는 직접적인 방법이 없는 경우

즉, Infinity를 표현한 것입니다. 큰 값을 표현하면 되기에 100으로 잡았습니다. 그

리고 0은 자기 자신으로 가는 cost이기에 0으로 하였습니다.

그리고 화면에 출력할 결과물을 가지는 output_struct를 선언합니다. 이 안에는

각 node까지의 cost를 나타내는 cost_vector와 next hop을 나타내는 next_hop_vector,

그리고 유저가 정한 node에서 해당 node까지의 총 경로를 나타내는 all_path가 있

습니다. 앞의 둘은 숫자이기에 int로 설정하였고, 총 경로는 한 node 당 문자열을

가져야하기에 2차원 배열로 만들었습니다.

다음으로 제 학번과 이름을 print한 후 유저로부터 원하는 node의 번호를 받습

니다. 이 node를 root node라고 하겠습니다. 여기서 잘못된 입력의 경우 틀렸다는

것을 가르쳐줍니다. 그리고 stdin buffer를 비우는 코드를 수행합니다.

Page 3: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

3

본격적으로 Dijkstra algorithm으로 shortest path를 찾습니다. 먼저 유저가 선택한

node 번호에 1을 뺍니다. 이는 위에 만든 2차원 배열의 index가 0부터 시작하고

node 번호는 1부터 시작하기에 이 둘을 맞추기 위함입니다. 그 다음으로 결과로

출력할 cost_vector에 유저가 선택한 node의 처음 cost 정보를 복사합니다. 그리고

역시 결과로 출력할 next_hop_vector에 도착할 node 번호를 넣습니다. 이는 처음

정보를 결과를 넣습니다. 그 다음으로 Find_ShortestPath_Dijkstra 함수를 호출하여

본격적으로 shortest path를 찾습니다.

Find_ShortestPath_Dijkstra 함수에서는 permanent_list라는 배열을 만들어 이것이

모두 0이 아닌 값이 되면 일을 마칩니다. permanent_list 배열이 모두 0이 아닌 값

이 되었다는 말은 모든 node로 가는 shortest path를 찾았다는 뜻입니다. 이는

permanent list에 들어있지 않는 node들 중 가장 작은 cost를 가진 node를 반환하는

Find_Minimal_Cost_Postion 함수가 node 번호가 아닌 -1을 반환하는 것으로 알 수

있습니다.

Permanent list에 들어있지 않는 node들 중 가장 작은 cost를 가진 node를 찾았을

경우 해당 node를 permanent list에 넣습니다. 그리고 그 node가 추가되면서 root

node에서 추가된 node로 가는 최소 cost에 추가된 node에서 각 node로 가는 cost를

더한 값이 기존의 각 node로 가는 cost보다 작을 경우 cost_vector와

nexthop_next_vector를 새로운 정보로 update합니다. 이 때 cost는 더한 값을, next

hop에는 추가된 node를 넣습니다. 그리고 유저가 선택한 node에서부터 permanent

list로 들어갈 node까지 path에 permanent list로 들어갈 node를 추가한 path를 해당

node path로 설정합니다. 이러한 process를 permanent list가 가득 찰 때까지 진행하

면 root node에서 각 node들로 가는 shortest path를 찾을 수 있습니다.

이렇게 찾은 정보는 main 함수 내 cost_nexthop_vec 객체에 들어있습니다. 따라

서 이를 화면에 출력한 후 유저에게 다른 node도 찾을 것인지 물어봅니다. 만약

찾는다면 다시 처음으로 돌아가서 찾고 싶은 node 번호를 물어봅니다. 만약 아니

라고 한다면 프로그램을 종료합니다.

그림 2 결과물 01 그림 3 결과물 02

결과물은 위와 같습니다. Fedora Eclipse에서 코딩을 하였지만 결과물은 터미널에

서 컴파일과 링킹 후 실행을 시켰습니다. Node를 1부터 7까지 전부 살펴보았습니

Page 4: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

4

다. 모든 node에서 정확한 shortest path를 찾는다는 것을 알 수 있습니다.

하지만 마지막 날에 총 경로를 표시할 필요가 없다고 하셔서 해당 코드를 주석

으로 처리한 후 cost와 next hop만을 표시하도록 고쳤습니다.

그림 4 결과물 01 그림 5 결과물 02

마지막으로 FTP를 이용하여 code를 업로드한 화면입니다. 시간이 얼마 남지 않

아 Windows에서 Filezilla를 이용하여 업로드 하였습니다.

Page 5: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

5

3. Experience � 2008-10-12

아이캠퍼스에 올려져 있는 문서를 읽었습니다. 시험기간에 나온 과제라

조금 당황했지만, 다행히 예전에 살펴보았던 Dijkstra Algorithm의

Implementation이기에 무엇을 원하는지 간단히 살펴보았습니다.

� 2008-10-13

공강시간을 이용하여 종이 위에 문제에 맞는 행렬과 실제로 node 하나

를 잡아 Dijkstra Algorithm을 이용하여 과정을 진행하였습니다. 거기서

Algorithm을 진행하는 함수와 tentative list 중 가장 작은 cost를 가지는

node를 선택하는 함수가 필요하다고 생각하였습니다. 또, Cost value와 next

hop을 나타내는 배열이 두 개 필요하다는 것을 알았습니다. 그리고

INF_MET는 무한대를 나타내기에 INT_MAX로 하는 것이 좋지 않을까 생

각하였습니다.

찾는 과정 중 가장 중요한 것은 tentative list 중 가장 작은 cost를 가지

는 node를 선택한 후 root node에서 그 선택한 node까지 가는 cost와 그

node가 가지는 initial metrics 정보와 더하여 작은 것만을 update하도록 하

는 것임을 알았습니다.

그리고 VIM에서는 Compile과 Debug가 불편하다고 생각하여 Fedora 설

치 시 제공하는 IDE(Integrated development environment)1 중 하나이며, 컴퓨

터공학실습2 시간에 사용하는 Fedora Eclipse를 이용하여 코딩을 진행하기

로 하였습니다.

코딩을 시작한 시간이 23시 30분이기에 오래 코딩을 하지 못하고 간단

히 필요한 변수 선언과 함수 선언만 하였습니다.

� 2008-10-18

중간고사를 준비하느라 과제에 손을 대지 않다가 토요일 컴퓨터공학실

습2 시험을 친 후 밤에 잠시 시간을 내어 코딩을 하였습니다.

간단히 각 함수에 대한 정의(definition)를 만들고 cost만으로 제대로 진

행하는지 확인하였습니다. 즉, prototyping 과정이었기에 변수 이름을 간단

히 적었으며 주석도 달지 않았습니다. 다행히 예전에 배운 것을 제대로

떠올렸는지 큰 문제없이 진행되는 것을 확인하였습니다.

역시 코딩을 한 시간이 23시였기에 오래 코딩을 하지 못하고 결과가

제대로 나오는 것에 만족을 하고 잠을 청하였습니다.

� 2008-10-19

주석을 늦게 달면 쓸모가 없기에 바로 다음날인 19일에 주석을 달았습

니다. 그리고 변수 이름도 알기 쉽게 적었습니다.

전날 만들지 않은 next hop을 찾는 것도 쉽게 만들었습니다. 간단히 cost

를 update할 때 permanent list에 추가되는 node로 가는 node를 넣으면 되었

습니다.

마지막으로 결과를 화면에 출력하는 코드를 작성하였습니다. 이 때 유

저로부터 입력을 여러 번 받을 수 있도록 무한루프를 만들었습니다. 이는

1 http://en.wikipedia.org/wiki/Integrated_development_environment

Page 6: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

6

1학기 때 데이터 통신 과제2를 할 때 썼던 방법이기에 이를 참조하여 만

들었습니다.

� 2008-10-20

결과를 내놓는 cost_vector, next_hop_vector 배열을 struct로 묶었습니다.

이유는 Find_ShortestPath_Dijkstra 함수를 보면 parameter와 local variable를

합쳐 7개가 나왔기 때문입니다. 하지만 5~6개가 최적화에 좋다는 교수님

의 얘기와 이 둘은 결과물을 나타낸다는 공통점이 있어 struct로 묶어

pointer로 전달하면 되겠다 생각하였습니다. 대신 코드가 복잡해진 단점이

생겼지만, 나쁘지 않은 선택이라 생각하였습니다.

최종적으로 결과물이 맞음을 확인하고 압축을 하여 코드를 Windows에

서 볼 수 있도록 처리하였습니다.

� 2008-10-26

시험이 토요일에 끝났기에 문서 작성을 일요일에 진행하였습니다. 문서

를 작성할 때 History와 program 구조 등이 모두 code 안에 주석으로 적었

기에 작성은 그리 어렵지 않았습니다. 다만, 지금까지 아래한글만으로 문

서를 작성하다 MS word로 적으려니 도움말 창을 옆에 두고 필요한 기능

을 찾아서 적고 있습니다.

그리고 code를 보면서 빠져있는 주석을 발견하였고, 결과화면도 부족한

것이 발견되어 다시 Linux 상에서 작업을 진행하여 처리하였습니다.

마지막으로 수업을 같이 듣는 김대황 학우와 상의하면서 나온 얘기입

니다. 결과물로 그 node까지의 cost와 next hop, 그리고 총 path도 구해야

하는지 하는 것입니다. 교재 670쪽을 보면 Routing table for node A라며

Node와 Cost, Next Router만이 나와있습니다. 수업시간에도 모든 경로를 기

록하는 Route Method보다는 다음 hop만을 기록하는 Next-Hop Method를 쓴

다고 배웠기에 굳이 할 필요가 있는가 싶었습니다. 하지만 print the

optimized path라는 문구에서 all path를 구해야 하는지 고민입니다. 따라서

이는 화요일에 교수님께 문의하여 구현여부를 생각하겠습니다.

� 2008-10-27

총 경로를 출력하는 것이 옳은지 모르겠지만, 일단은 구현하기로 하였

습니다. 책에 없는 내용이라 조금 고생했지만 예상과 달리 빠른 시간 안

에 구현할 수 있었습니다. 만약 교수님께서 필요하지 않다고 하시더라도

추가된 것이기에 그대로 제출할 생각입니다.

� 2008-10-28

총 경로가 있는 것을 제출하려고 하였지만, 필요한 것만을 보여주는 것

이 옳기에 이를 생략하였습니다. 다만, 코드가 아쉬워서 해당 부분을 주

석 처리하여 훗날 필요할 때 어떻게 동작하도록 만들었는지를 살펴볼 수

있도록 하였습니다.

마지막 날 작업을 한지라 이 작업은 동아리 서버에 ssh로 접속하여

VIM을 이용하였습니다.

� 느낀점

위의 history에는 적지 않았지만, 마지막 날에 all path를 만든 코드가 아

쉽다는 말을 적었습니다. 이유는 처음에 해당 기능을 만들기 위해 임시로

main 함수에서 char all_path[MAX_NODE][MAX_NODE]로 2차원 배열을 만

2 http://nosyu.egloos.com/4437008

Page 7: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

7

든 후 struct 안에서는 char** all_path를 만든 후 struct 안의 변수가 main

함수의 auto variable인 all_path를 가리키도록 하였습니다. 하지만 배열 연

산에서 에러가 발생하는 것을 알았고, 그 이유를 생각해보니 struct 안의

all_path는 2차 포인터인지라 끝의 배열 크기가 MAX_NODE라는 것을 모

릅니다. 그렇기에 all_path[1][1]이라 하면 all_path에서 1*MAX_NODE + 1만

큼 떨어진 곳에 있다는 것을 알 수 없는 것입니다. 이 점을 해결하고자

제가 아는 포인터에 대한 총 지식을 동원하였지만 실패하였습니다. 결국

struct 안에 2차원 배열을 정의하는 것으로 마무리 지었습니다.

1학년 때 학교에서 C를 배운 후 휴학 중 ‘C 언어 펀더멘탈’이라는 책

으로 열심히 공부하였기에 C에 대해 자신이 있다고 생각했습니다. 하지만

포인터가 2차 이상이 되면 포인터와 배열의 관계를 잘 모르고 있다는 것

을 이번 기회를 통해 알 수 있었습니다.

따라서 그런 약점을 잊지 않고자 코드를 지우는 것보다는 주석으로 남

겼습니다. 조금 코드가 지저분하지만 이 점 양해 부탁드립니다.

4. Conclusions 이번 프로젝트 통해 Dijkstra’s algorithm을 이용하여 Network 상의 shortest path를

구하는 과정을 살펴볼 수 있었습니다. 여기서는 미리 Link State가 각 node들에게

전달이 되었다는 가정하였기에 각 node별로 shortest path만 구하면 되었습니다.

이 program의 time complexity는 O(nodes ²)입니다. 이는 tentative list에서 최소 cost

를 갖는 node를 찾는 Find_Minimal_Cost_Position 함수는 모든 node를 살펴보기에

O(vertices)이고, 그 loop 안에서 모든 node들과 선택된 node의 cost를 계산 비교하

기에 전체적으로 O(nodes ²)가 됩니다. 따라서 node의 수가 증가하면 그의 제곱에

비례하여 복잡도가 증가합니다.

하지만 정확한 shortest path를 구할 수 있다는 점에서 Dijkstra’s algorithm은 앞으

로도 계속 사용될 것입니다.

5. References [1]. Behrouz A. Forouzan, “Data Communications and Networking”, McGrawHill, 2007,

pp 666~670 [2]. 천인국, “Data Structures in C”, 생능출판사, 2005, pp 426~436

6. Appendixes � 개발환경

개발환경은 다음과 같습니다.

OS : Linux - Fedora 8

Kernel : 2.6.26.5-28.fc8

Complier : gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)

Editor : Fedora Eclipse

Page 8: Implementation of Dijkstra Algorithmpds13.egloos.com/pds/200811/08/60/report01.pdf · 함수의 auto variable 인 all_path 를 가리키도록 하였습니다. 하지만 배열 연

8

Fedora Eclipse에서 작업하던 중 한 컷 찍었습니다.

� 남기고 싶은 말 (건의사항 포함)

VIM이 아니라 Fedora Eclipse에서 작업해도 괜찮습니까?

� 기타