그래프탐색 (graph search) - kocwelearning.kocw.net/kocw/document/2015/yeungnam/kimyoungt... ·...

Post on 01-Jan-2021

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 44

그래프 탐색 (Graph Search)

그래프의 가장 기본적인 연산하나의 정점으로부터 시작하여 차례대로 모든 정점들을

한번씩 방문많은 문제들이 단순히 그래프의 노드를 탐색하는 것으로 해결

(예) 도로망에서 특정 도시에서 다른 도시로 갈 수 있는지 여부(예) 전자회로에서 특정 단자와 다른 단자가 서로 연결되어 있는지 여부

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 45

깊이 우선 탐색(DFS)

깊이 우선 탐색 (DFS: depth-first search) 한 방향으로 갈 수 있을 때까지 가다가 더 이상 갈 수 없게 되면 가장 가까운

갈림길로 돌아와서 이 곳으로부터 다른 방향으로 다시 탐색 진행 되돌아가기 위해서는 스택 필요(순환함수 호출로 묵시적인 스택 이용 가능)

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 46

DFS 알고리즘

depth_first_search(v)v를 방문되었다고 표시;for all u ∈ (v에 인접한 정점) do

if (u가 아직 방문되지 않았으면) then depth_first_search(u)

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 47

DFS 알고리즘

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 48

DFS 프로그램

// 인접 행렬로 표현된 그래프에 대한 깊이 우선 탐색void dfs_mat(GraphType *g, int v){

int w;visited[v] = TRUE; // 정점 v의 방문 표시printf("%d ", v); // 방문한 정점 출력for(w=0; w<g->n; w++) // 인접 정점 탐색

if( g->adj_mat[v][w] && !visited[w] ) dfs_mat(g, w); //정점 w에서 DFS 새로시작}

// 인접 리스트로 표현된 그래프에 대한 깊이 우선 탐색void dfs_list(GraphType *g, int v) {

GraphNode *w;visited[v] = TRUE; // 정점 v의 방문 표시printf("%d ", v); // 방문한 정점 출력for(w=g->adj_list[v]; w; w=w->link) // 인접 정점 탐색

if(!visited[w->vertex]) dfs_list(g, w->vertex); //정점 w->vertex에서 DFS 새로시작}

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 49

너비우선 탐색(BFS)

너비 우선 탐색(BFS: breadth-first search) 시작 정점으로부터 가까운 정점을 먼저 방문하고

멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법 큐를 사용하여 구현됨

너비우선탐색 알고리즘

breadth_first_search(v)v를 방문되었다고 표시;큐 Q에 정점 v를 삽입;while (not is_empty(Q)) do

큐 Q에서 정점 w를 삭제;for all u ∈ (w에 인접한 정점) do

if (u가 아직 방문되지 않았으면) then u를 큐 Q에 삽입;u를 방문되었다고 표시;

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 50

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 51

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 52

DFS와 BFS의 C 프로그램 구현

/* Graph.h (5) */

typedef struct Graph{

Vertex **vrtxPtrArr; // vertex arrayEdgeList *adjLstArr; // adjacency list arrayint num_vertices;int **ppDistMtrx;Graph(int num_nodes);

} Graph;

typedef struct DepthFirstSearch{

Graph *pGrp;VertexStatus *pVrtxStatus;EdgeStatus **ppEdgeStatus;DepthFirstSearch(Graph *pGrp);DFS_DONE searchDone;

// used in depth first searchint *pLeastCost;

} DepthFirstSearch;

/* Graph.h (6) */

typedef struct BreathFirstSearch{

Graph *pGrp;VertexStatus *pVrtxStatus;int *pLeastCost;int *pPrev;BFS_PROCSS_STATUS* pBFS_Proc_Stat;BreathFirstSearch(Graph *pGrp);

} BreathFirstSearch;

void bfsTraversal(BreathFirstSearch *pBFS, Vertex *pStart, Vertex *pTarget, VertexList *pVTL);

void dfsTraversal(DepthFirstSearch *pDFS, Vertex *pV, Vertex *pTarget, VertexList *pVTL);

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 53

/* Graph.cpp (13) */

DepthFirstSearch::DepthFirstSearch(Graph *pGraph){

int num_nodes;pGrp = pGraph;num_nodes = pGrp->num_vertices;pVrtxStatus = (VertexStatus *)malloc(sizeof(VertexStatus)* num_nodes);for (int i = 0; i < num_nodes; i++){

pVrtxStatus[i] = VRTX_NOT_VISITED;}ppEdgeStatus = (EdgeStatus **)malloc(sizeof(EdgeStatus *)* num_nodes);for (int i = 0; i < num_nodes; i++){

ppEdgeStatus[i] = (EdgeStatus *)malloc(sizeof(EdgeStatus)* num_nodes);}

for (int i = 0; i < num_nodes; i++)for (int j = 0; j < num_nodes; j++){

ppEdgeStatus[i][j] = EDGE_UNEXPLORED;}searchDone = NOT_DONE; // used in depth first search (dfs) traversalpLeastCost = (int *)malloc(sizeof(int)* num_nodes);

}

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 54

/* Graph.cpp (14) */

void dfsTraversal(DepthFirstSearch *pDFS, Vertex *pV, Vertex *pTarget, VertexList *pVTL){

int num_nodes = pDFS->pGrp->num_vertices, num_selected = 0;Vertex *pV2;int **distMtrx = pDFS->pGrp->ppDistMtrx;int *pLeastCost = pDFS->pLeastCost;int start_ID, target_ID, cur_ID, vrtx_ID, v2_ID;EdgeList *pEL;EdgeListNode *pELN;Edge *pE;

vrtx_ID = pV->ID;target_ID = pTarget->ID;

pDFS->pGrp->vrtxPtrArr[vrtx_ID]->vtxStatus = VRTX_VISITED;if (vrtx_ID == target_ID){

printf("Depth First Search is done !!₩n");pDFS->searchDone = DONE;

return;}

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 55

/* Graph.cpp (15) */

pEL = &(pDFS->pGrp->adjLstArr[vrtx_ID]);pELN = pEL->pFirst;for (int i = 0; (i < pEL->num_edges) & (pDFS->searchDone != DONE); i++){

pE = pELN->pE;if (pE->edgeStatus == EDGE_UNEXPLORED){

pE->edgeStatus = EDGE_VISITED;pV2 = pE->pV2;v2_ID = pV2->ID;if (pV2->vtxStatus != VRTX_VISITED){

listPushBack(pVTL, pV2);pDFS->ppEdgeStatus[vrtx_ID][v2_ID] = DISCOVERY;if (pDFS->searchDone != DONE){

dfsTraversal(pDFS, pV2, pTarget, pVTL);if (pDFS->searchDone != DONE){

Vertex *pLast_pushed = pVTL->pLast->pV;listPopBack(pVTL);

}}

} else { // V2 has been visited alreadypE->edgeStatus = BACK;

}} // end ifpELN = pELN->pNext;

} // end for}

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 56

/* Graph.cpp (16) */

BreathFirstSearch::BreathFirstSearch(Graph *pGraph){

pGrp = pGraph;int num_nodes = pGrp->num_vertices;pPrev = (int *)malloc(sizeof(int)* num_nodes);pLeastCost = (int *)malloc(sizeof(int)* num_nodes);pBFS_Proc_Stat = (BFS_PROCSS_STATUS*)malloc(sizeof(BFS_PROCSS_STATUS)* num_nodes);

}void bfsTraversal(BreathFirstSearch *pBFS, Vertex *pStart, Vertex *pTarget, VertexList *pVTL){

int num_nodes = pBFS->pGrp->num_vertices, num_selected = 0;Vertex *pVrtx;int *pLeastCost = pBFS->pLeastCost;int **distMtrx = pBFS->pGrp->ppDistMtrx;int *pPrev = pBFS->pPrev;BFS_PROCSS_STATUS *pBFS_Proc_Stat = pBFS->pBFS_Proc_Stat;int start_vrtxID, target_vrtxID, cur_vrtxID, vrtxID;int round, minID, minCost;

start_vrtxID = pStart->ID;target_vrtxID = pTarget->ID;/* initialize L(n) = w(start, n) */for (int i = 0; i < num_nodes; i++){

pLeastCost[i] = distMtrx[start_vrtxID][i];pPrev[i] = start_vrtxID;pBFS_Proc_Stat[i] = NOT_SELECTED;

}pBFS_Proc_Stat[start_vrtxID] = SELECTED;num_selected = 1;

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 57

/* Graph.cpp (17) */

round = 0;printf("Breadth First Search ...₩n");printDist(pBFS->pGrp->num_vertices, pBFS->pLeastCost, round);while (num_selected < num_nodes){

round++;//printf("round (%2d) : ", round);

// find cur_node with least costminID = -1;minCost = PLUS_INF;for (int i = 0; i < num_nodes; i++){

if ((pLeastCost[i] < minCost) & (pBFS_Proc_Stat[i] != SELECTED)){

minID = i;minCost = pLeastCost[i];

}}if (minID == -1){

printf("Error in FindShortestPath with bfsTraversal()₩n");printf(" ==> Target is not connected to the start !!₩n");break;

} else {

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 58

/* Graph.cpp (17) */

pBFS_Proc_Stat[minID] = SELECTED;num_selected++;if (minID == target_vrtxID) // target reached{

printf(" ==> reached to the target node (%2d) at ", target_vrtxID);printf(" least cost = %d₩n", minCost);vrtxID = minID;do {

pVrtx = pBFS->pGrp->vrtxPtrArr[vrtxID];VertexListNode *pVLN = (VertexListNode *)malloc(sizeof(VertexListNode));pVLN->pV = pVrtx;pVLN->pNext = pVLN->pPrev = NULL;if (pVTL->num_vertices == 0){

pVTL->pFirst = pVTL->pLast = pVLN;pVTL->num_vertices++;

} else {pVLN->pNext = pVTL->pFirst;pVTL->pFirst->pPrev = pVLN;pVTL->pFirst = pVLN;pVTL->num_vertices++;

}vrtxID = pPrev[vrtxID];

} while (vrtxID != start_vrtxID);

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 59

/* Graph.cpp (17) */

pVrtx = pBFS->pGrp->vrtxPtrArr[vrtxID]; // push start node at the front of pathVertexListNode *pVLN = (VertexListNode *)malloc(sizeof(VertexListNode));pVLN->pV = pVrtx;pVLN->pNext = pVTL->pFirst;

pVLN->pPrev = NULL;pVTL->pFirst = pVLN;pVTL->num_vertices++;break;

} // end if (minID == target_vrtxID)} // end if-else

int pLS, distMtrx_i;for (int i = 0; i < num_nodes; i++){

pLS = pLeastCost[i];distMtrx_i = distMtrx[minID][i];if ((pBFS_Proc_Stat[i] != SELECTED) & (pLeastCost[i] > (pLeastCost[minID] + distMtrx[minID][i]))){// update distances with relaxation

pPrev[i] = minID;pLeastCost[i] = pLeastCost[minID] + distMtrx[minID][i];

}}

// printout the pLeastCost[] for debuggingprintDist(pBFS->pGrp->num_vertices, pBFS->pLeastCost, round);

} // end whilefree(pLeastCost);free(pPrev);

}

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 60

/* main.cpp (3) */

// Depth First Searchprintf("₩nDepth First Search (DFS) ...₩n");VertexList vtl_1;initList(&vtl_1);DepthFirstSearch dfs(&grph);listPushBack(&vtl_1, pStart);dfsTraversal(&dfs, pStart, pTarget, &vtl_1);printf("DFS::Path from start (%2d) to target (%2d):₩n ", pStart->ID, pTarget->ID);printList(&vtl_1);

// Breadth First Searchprintf("₩nBreadth First Search (BFS) ...₩n");VertexList vtl_2;initList(&vtl_2);BreathFirstSearch bfs(&grph);bfsTraversal(&bfs, pStart, pTarget, &vtl_2);printf("ShortestPath::Path from start (%2d) to target (%2d):₩n ", pStart->ID, pTarget->ID);printList(&vtl_2);

}

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 61

미로 (Maze) 찾기

Graph representation for Maze vertex: cross point edge: distance between the cross points

0 1 2

0

1

2

v0

(start)

v1 v2

v3 v4 v5

v6 v7 v8

(end)

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 62

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 63

0 1 2

0

1

2

v0

(start)

v1 v2

v3 v4 v5

v6 v7 v8

(end)

0 1 2

0

1

2

v0

(start)

v1 v2

v3 v4 v5

v6 v7 v8

(end)

34

3

4

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 64

5 x 5 미로 (Maze) 찾기

Find the shortest path from v0 (start) to v20 (end)

v0 ~ v24: cross pointsdistance(v0, v1): 1distance(v0, v5): 1

distance(v2, v3): +

0 1 2 3 4

0

1

2

3

4

v0

v24

(start)

(end)

v4

v20

v1 v2 v3

v5 v6 v7 v8 v9

v10 v11 v12 v13 v14

v15 v16 v17 v18 v19

v21 v22 v23

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 65

5x5 미로 (Maze) 찾기

Depth First Search example

v0 ~ v24: cross pointsdistance(v0, v1): 1distance(v0, v5): 1

distance(v2, v3): +

0 1 2 3 4

0

1

2

3

4

v0

v24

(start)

(end)

v4

v20

v1 v2 v3

v5 v6 v7 v8 v9

v10 v11 v12 v13 v14

v15 v16 v17 v18 v19

v21 v22 v23

Tracking Back Tracking

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 66

5x5 미로 (Maze) 찾기

Breadth First Search example

v0 ~ v24: cross pointsdistance(v0, v1): 1distance(v0, v5): 1

distance(v2, v3): +

0 1 2 3 4

0

1

2

3

4

v0

v24

(start)

(end)

v4

v20

v1 v2 v3

v5 v6 v7 v8 v9

v10 v11 v12 v13 v14

v15 v16 v17 v18 v19

v21 v22 v23

Tracking

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 67

미로 (Maze) 찾기 결과

Sample routes to target (v0 v20)

0 1 2 3 4

0

1

2

3

4

v0

v24

(start)

(end)

v4

v20

v1 v2 v3

v5 v6 v7 v8 v9

v10 v11 v12 v13 v14

v15 v16 v17 v18 v19

v21 v22 v23

Path by obtained by Depth First Search

Path by obtained by Breadth First Search

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 68

IP Packet Router의 Forwarding Table 작성

Input network topology (USA)

0

1

2

5

7

8

6

9

12

1314

19

18

17

16

10

15

11

3

820

1144

828

Seattle

San Francisco

Salt Lake City

Los Angels

Denver

Phoenix

Houston

Dallas

Minneapolis

Chicago

St. Louis

Memphis

New Orleans

Atlanta

Miami

Washington D.C.

Detroit

New York

Boston

745

380 688

381

816

1067

920

861

780

521

409

297286

845

285

454

246352

393

394

473

861

661

632

534

640

834211

237

4

Rapid city611

657

389

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 69

Depth First Search example Find a path from Seattle to Miami

0

1

2

5

7

8

6

9

12

1314

19

18

17

16

10

15

11

3

820

1144

828

Seattle

San Francisco

Salt Lake City

Los Angels

Denver

Phoenix

Houston

Dallas

Minneapolis

Chicago

St. Louis

Memphis

New Orleans

Atlanta

Miami

Washington D.C.

Detroit

New York

Boston

745

380 688

381

816

1067

920

861

780

521

409

297286

845

285

454

246352

393

394

473

861

661

632

534

640

834211

237

4

Rapid city611

657

389

Tracking Back Tracking

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 70

Breadth First Search example Find the shortest path from Seattle to Miami

0

1

2

5

7

8

6

9

12

1314

19

18

17

16

10

15

11

3

820

1144

828

Seattle

San Francisco

Salt Lake City

Los Angels

Denver

Phoenix

Houston

Dallas

Minneapolis

Chicago

St. Louis

Memphis

New Orleans

Atlanta

Miami

Washington D.C.

Detroit

New York

Boston

745

380 688

381

816

1067

920

861

780

521

409

297286

845

285

454

246352

393

394

473

861

661

632

534

640

834211

237

4

Rapid city611

657

389

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 71

경로 찾기

Path (0 15) produced by Depth First Search (DFS)

Path by obtained by Depth First Search

Path by obtained by Breadth First Search

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 72

Homework 12

12.1 미로 찾기(1) 다음과 같은 미로에서 임의의 시작점 (예: v0)에서 임의의 종단점 (예: v24)까지의

경로를 찾기 위한 Graph 프로그램을 작성하고, printGraph() 함수를 사용하여, 그래프 정보를 출력하라.

(2) 시작점 (v0)에서 종단점 (v24)까지의 경로를 DFS (Depth First Search) 알고리즘으로 찾는 프로그램을 작성하고, 결과 경로를 출력하라.

(3) 시작점 (v0)에서 종단점 (v24)까지의 경로를 BFS (Breadth First Search) 알고리즘으로 찾는 프로그램을 작성하고, 결과 경로를 출력하라.

v0 ~ v24: cross pointsdistance(v0, v1): 1distance(v0, v5): 1

distance(v2, v3): +

0 1 2 3 4

0

1

2

3

4

v0

v24

(start)

(end)

v4

v20

v1 v2 v3

v5 v6 v7 v8 v9

v10 v11 v12 v13 v14

v15 v16 v17 v18 v19

v21 v22 v23

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kimch12 - 73

12.2 Forwarding Table 구성(1) 다음과 같은 네트워크에서 Graph BFS 탐색 알고리즘을 실행할 수

있도록 Graph 프로그램을 작성하라.(2) 이 Graph 프로그램에서 임의의 노드로 부터 다른 모든 노드로 최소 비용

경로를 통하여 갈 수 있는 경로들을 BFS 알고리즘을 찾는 프로그램을작성하라.

(3) 임의의 지정된 노드로 부터, 다른 모든 노드로의 최소 비용 경로를 산출한 후, 해당 목적지로 전달되어야 하는 패킷의 next hop을 나타내는forwarding table을 출력하는 프로그램을 작성하라.

top related