이제 구현해 보기로 해요.
여기에서는 이미 앞에서 구현한 큐와 그래프, 경험 정보를 이용해서 구현할 거예요.
테스트에 사용할 그래프는 인접행렬을 이용한 깊이 우선 탐색과 같아요.
Graph *MakeGraph() { Graph *graph; graph = NewGraph(8);//그래프 동적 생성 AddEdge(graph, 0, 1);//간선 추가 AddEdge(graph, 0, 2);//간선 추가 AddEdge(graph, 0, 3);//간선 추가 AddEdge(graph, 1, 2);//간선 추가 AddEdge(graph, 2, 3);//간선 추가 AddEdge(graph, 2, 4);//간선 추가 AddEdge(graph, 2, 5);//간선 추가 AddEdge(graph, 3, 4);//간선 추가 AddEdge(graph, 5, 6);//간선 추가 AddEdge(graph, 6, 7);//간선 추가 ViewGraph(graph); return graph; }
너비우선 탐색 알고리즘를 구현해 보기로 해요.
입력 인자로 그래프와 출발 정점(v)과 목적 정점(g)을 받게 할게요.
void DoBFSAlgorithm(Graph *graph, int v,int g) { EHQueue *ehq = 0; Heuristic *heu = 0; Array *next_heus = 0; Iterator seek=0, end=0; printf("%d에서 %d로 갈 수 있는 모든 경로\n",v,g);
먼저 큐와 초기 경험 정보를 생성하세요.
ehq = New_EHQueue(); heu = MakeInitHeuristic(graph,0,7);
큐에 초기 경험 정보를 보관하는 것으로 출발해요.
EHQueue_Put(ehq,heu);
큐가 비어있지 않을 때까지 반복합니다.
while( ! EHQueue_IsEmpty(ehq) ) {
큐에서 경험 정보를 꺼내오세요.
heu = (Heuristic *)EHQueue_Get(ehq);
꺼내온 경험 정보에서 갈 수 있는 모든 이웃하는 경험 정보를 조사하세요.
next_heus = New_Array(); FindNextHeuristics(heu,next_heus);
조사한 경험 정보를 하나 하나 순차 방문해야겠죠.
seek = Array_Begin(next_heus); end = Array_End(next_heus); for(seek=seek; seek != end; ++seek) { heu = (Heuristic *)(*seek); if(IsGoal(heu)) {
만약 목적지에 도달했으면 경로를 찾은거예요.
경험한 행적을 출력하세요.
ViewHeuristic(heu); DeleteHeuristic(heu); } else {
만약 목적지에 도달하지 못했으면 다시 큐에 보관하세요.
EHQueue_Put(ehq,heu); } } Delete_Array(next_heus); } Delete_EHQueue(ehq); }