요즘 해양 쓰레기 문제가 심각한 상황이며 이를 조금이라도 해결하는 방법으로 요즘 떠오르는것이 바로, '업사이클링'이다.
업사이클링을 주제로, 문제를 설정해 보았다.
문제: S대학교의 의류학과 김학생이 직접 업사이클 가방을 만들려고 한다. 김학생은 수중 쓰레기 데이터(CVS)를 바탕으로 플라스틱 과 캔 종류의 쓰레기가 가장 많이 발견된 순서로 데이터 정렬을 하려고 한다. 플라스틱이나 캔 항목이 있을경우 가중치 1, 둘 다 존재할 경우 가중치 2, 둘다 존재하지 않으면 가중치 0이다. 따라서 가장 가중치가 높은순으로 정렬하여 손쉽게 업사이클 재료를 수거할수 있게 된다.
사용된 데이터
문제에 가중치가 필요한 항목이 플라스틱과 캔이기 때문에, CSV파일에 플라스틱, 캔이 무조건 존재하는 데이터 파일을 선정하였다. 나의 데이터 파일을 제외한 다른 사람의 데이터 파일들을 취합하였다. 총 5개의 파일을 선정하였고, 이 모든 데이터 파일을 합쳐 약 700개의 행을 가진 데이터 파일을 구축하였다.
벨만포드 알고리즘(Bellman-Ford Algorithm)은 한 노드에서 다른 노드까지의 최단 거리를 구하는 알고리즘이다. 가장 큰 특징은 선의 가중치가 음수일 때도 최단 거리를 구할 수 있다는 점이다. 따라서 모든 간선의 비용이 양수 일때는 다익스트라 알고리즘(Dijkstra Algorithm), 하나라도 음수인 비용이 있다면 벨만포드 알고리즘을 사용하는 것이 좋다.
그렇다면 다익스트라 알고리즘과 벨만포드 알고리즘에는 각가 어떤 특징이 있을까? 이는 아래와 같이 정리할 수 있다.
[다익스트라 알고리즘(Dijkstra Algorithm)] 1. 매번 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택하여 한 단계씩 최단 거리를 구해나간다. 2. 음수 간선이 없다면 최적의 해를 찾을 수 있다. (음수 간선이 있을 때는 최적의 해를 찾을 수 X) 3. 시간 복잡도가 빠르다. (OElogV) --> 개선된 다익스트라 알고리즘 (우선순위 큐 사용)
[벨만포드 알고리즘(Bellman-Ford Algorithm)] 1. (정점 - 1)번의 매 단계마다 모든 간선을 전부 확인하면서 모든 노드간의 최단 거리를 구해나간다. (<-->다익스트라와 차이점은 매 반복마다 모든 간선을 확인한다는 것이다. 다익스트라는 방문하지 않은 노드 중에서 최단 거리가 가장 가까운 노드만을 방문한다.) 2. 다익스트라 알고리즘에서의 최적의 해를 항상 포함하게 된다. 3. 음수 간선이 있어도 최적의 해를 찾을 수 있다. (음수 간선의 순환을 감지할 수 있기 때문이다.) 4. 시간 복잡도가 느리다. O(VE)
1. C++ 로 구현한 기본 그래프 간단한 그래프 구현을 해보자. 정점은 A,B,C,D로 설정하고 간선은 (A,B),(A,D),(B,D),(B,C),(C,D)로 이루어진 그래프가 있다.
위 그래프를 코드로 구현하면 아래와 같다. (1)알고리즘 설정
(2) 알고리즘 구현
(3)결과창
2. 다익스트라 알고리즘을 설명과 코드를 구현 (1) 다익스트라(Dijkstra)알고리즘이란? 시작점과 도착점을 설정해서 최단거리를 구하는 알고리즘이다. 정점과 정점 간에는 간선이 있는데, 이 간선에 있는 가중치를 고려하여 결론을 내는 알고리즘 이기에 매우 효율적이라고 볼수 있다. 단점은 음의 가중치는 포함할수 없다는 것이다. 하지만, 우리 실제 세계에서는 모든 경로의 가중치에 음의 수치는 없기 때문에 실제로 사용하기에 아주 적합한 알고리즘이다.
작동 알고리즘은 다음과 같다. 1. 시작 정점을 정한다. 2. 시작 정점을 기준으로 각노드의 최소 비용을 저장한다. 3. 방문하지 않은 정점들 중 가장 비용이 적은 정점을 선택한다. 4. 해당 점점을 거쳐 특정한 정점으로 가는 경우를 고려해서 최소 비용을 갱신한다. 5. 3-4번을 반복하며 도착노드까지 도착한다. 위의 다익스트라 알고리즘으로 구현한 코드는 아래와 같다.
DFS(Depth-First Search)는 그래프의 가장 기본적인 연산인 그래프탐색을 하는 알고리즘이다. DFS(Depth-First Search)는 이름 그대로, 깊이 우선 탐색이며, 대략적인 DFS의 탐색 과정은 이러하다.
1.한 방향으로 갈 수 있을 때까지 간다. 2.더 이상 갈 수 없게 되면 가장 가까운 갈림길로 돌아간다. 3. 돌아온 갈림길부터 다른 방향으로 다시 탐색 진행한다. (다시 되돌아 가기 위해 스택 필요)
이러한 메커니즘을 간단한 그래프 예시와 함께 확인해 보자.
2.BFS(Breadth-First Search)란?
BFS(Breadth-First Search)는 앞서 설명한 DFS(Depth-First Search)와 마찬가지로 그래프를 탐색하는 알고리즘이다. 단, 깊이 우선 탐색인 DFS(Depth-First Search)와 달리 BFS(Breadth-First Search)는 너비 우선 탐색이라는 점에서 DFS와는 차이가 있다. 대략적인 BFS의 탐색 과정은 이러하다.
1.시작 정점으로부터 가까운 정점을 먼저 방문한다. 2. 그 후, 멀리 떨어져 있는 정점을 나중에 방문한다. (너비를 측정하기 용이한 큐를 사용하여 구현)
이러한 메커니즘을 간단한 그래프 예시와 함께 확인해 보자.
3. C++를 이용해 DFS, BFS 코드 구현해보기
앞서 설명했던 DFS와 BFS를 C++ 코드로 구현하면 아래와 같다. 간단한 설명은 주석으로 달아 놓았다.
사진은 화면에 보이는것과 같이 한장당1개 이상의 쓰레기가 최소한 화면의10분의1이상의 크기로 나오도록 사진을 찍었다.주로 반포천과 반포한강공원에서 찍었다.
<반포천과 반포한강공원에서 찍은 수중 쓰레기 사진들>
정리방법은 아래와 같이 csv 파일 형태로, 쓰레기 품목은 일반쓰레기, 플라스틱, 캔, 종이, 유리로 나누어 정리하였다.
풀고자 하는 문제 소개
요즘 해양 쓰레기 문제가 심각한 상황이며 이를 조금이라도 해결하는 방법으로 요즘 떠오르는것이 바로, '업사이클링'이다.
업사이클링을 주제로, 문제를 설정해 보았다.
문제: S대학교의 의류학과 김학생이 직접 업사이클 가방을 만들려고 한다. 김학생은 수중 쓰레기 데이터(CVS)를 바탕으로 플라스틱 과 캔 종류의 쓰레기가 가장 많이 발견된 순서로 데이터 정렬을 하려고 한다. 단, 이 학생이 살고 있는 집의 위치보다 일정 거리가 멀면 우선순위에서 밀리는 형태로 정렬을 하려고 한다.
접근방법: 먼저 데이터파일을 검사하여 ‘플라스틱 ‘항목이나 ‘캔’항목에 1이 존재할 경우 각 항목당 가중치 1씩 더한다. 그후, 가중치가 가장 높은 순서대로 데이터를 배열한다. 단, 학생의 거주지 좌표를 기준으로, 플러스 마이너스 0.05이상 차이 날 경우 맨 뒤로 보낸다.