GA - 장사꾼여행문제(TSP) [1] - 유전자 설계

TSP(Travelling Salesman Problem)는 잘 알려진 대로, 여러개의 도시를 최단거리로 순회하는 방법을 찾는 대표적인 NP문제입니다. 쉽게 말하면 '다항식적으로 문제를 풀 수 없다' -> '무식하게 모든 경우의 수를 계산해서 풀어야 한다.'는 것이죠.

이 문제의 어려운 점은 도시가 늘어날수록 가능한 조합이 엄청난 속도로 증가한다는 것입니다. 이를테면 5개의 도시일 경우 5! = 120가지 조합을 계산해서 최소값을 찾으면 되지만, 10개의 도시라면 10! = 3628800가지 조합, 20개라면 20! = 2432902008176640000가지 조합을 따져야 합니다. 100개의 도시라면? 9로 시작하는 158자리 길이의 숫자만큼의 조합을 계산해야 합니다. 그야말로 '빅뱅부터 우주의 종말까지' 계산해도 끝나지 않을 계산량이죠.
그래서 이런 문제는, '최소값'을 찾는 것은 포기하고 '근사값'을 찾는 여러가지 알고리즘이 개발되어 있습니다.

여기서는 장사꾼이 최소 이동거리로 150개 도시를 지나는 문제를 유전자 알고리즘을 사용해서 근사값을 찾는 방법을 알아보겠습니다.


만약 '무식한 방법'으로 최선의 경로를 찾기 위해서는 150!개 경우의 수를 다 계산해야 합니다. 150!의 값은 다음과 같은 263자리 숫자입니다.
5713383956445854590478932865261054003189553578601126418254
83758331798291248453983931265744886753111453771078787468542
0416266625019868450446635594919592206657494259209573577892
9325357290444962472405416790722118445437122269675520000000
000000000000000000000000000000


1. 유전자 설계
TSP를 위한 가장 간단한 유전자는 돌아다닐 도시를 차례로 나열하는 것입니다. 만약 0~9까지 10개의 도시를 이동한다면, 유전자 9421850637은 9->4->2->1->8->5->0->6->3->7->9번 도시의 순서로 돌아다닌다는 의미입니다. 그러므로 1850637942나 0637942185, 3794218506 등도 동일한 유전자라고 할 수 있습니다. 또한 반대로 도는 2497360581 역시도 동일한 유전자입니다

역순유전자를 동일한 것으로 처리하기 위해서는, 모든 도시에 대해 A->B 이동시의 비용과 B->A 이동시의 비용이 동일해야 합니다. 만약 역방향으로 이동할 때의 비용이 차이난다면(바람이나 해류가 존재할 때 등) 역방향유전자를 동일한 것으로 처리할 수 없습니다.

이렇게 만드는 유전자의 경우에는 한가지 제약이 생깁니다. 같은 도시가 둘 이상 나와서는 안된다는 것이죠. 이를테면 9421850137과 같은 유전자는 6번도시는 빠뜨리고 1번도시는 두번 방문하게 되므로 제대로된 유전자가 아닙니다.
그러므로 최초 유전자를 초기화할 때라든지 교차, 돌연변이 등 유전자에 조작을 가할 경우에는 위와 같은 제약을 어기지 않도록 조심해야 할 필요가 있습니다.

창조론 이야기 - 인구증가곡선

"현재 인구증가율의 1/4만으로 계산해도 노아시대 남은 8명이 현재의 60억으로 늘어날 수 있다. 반대로 진화론자들의 주장처럼 인간이 생긴지 2백만년이 되었다면 지금쯤 인구는 태양계를 다 채우고도 모자랄 것이다."
창조론자들의 주장입니다. 사람들이 태양계를 가득 채우지 못한 것으로 봐서 인간은 200만년전 오스트랄로피테쿠스로부터 진화된 것이 아니라 노아의 홍수 후 남은 8명이 번성한 것이라는 주장이죠. 그런데 정말로 인간이 200만년 전에 생겼다면 태양계를 가득 채워야 할까요?

일반적으로 생물의 개체변화곡선은 다음과 같습니다.
초반에는 (창조론자들의 주장대로) 지수형태로 늘어나지만 결국은 환경영향(천적, 먹이부족, 공간부족, 질병 등)에 의해 증가가 정체되는 S자곡선을 형성하죠.
여기에는 인간도 예외가 아닙니다. 다만 인간의 경우에는 여러번에 걸쳐 저 자연의 한계라는 제한을 넘어선 적이 있습니다. 하지만 곧 새로운 자연의 한계에 부딫쳐 정체상태에 들어가는 것은 마찬가지죠. 말하자면 인구의 증가곡선은 다음과 같습니다.(그림이 좀... 클릭해서 보세요^^)
초기부터 일정한 증가율로 인구가 증가한 것이 아니라, 긴 정체구간 - 문명발달로 한계넘음 - 새로운 한계 봉착 - 긴 정체구간의 반복입니다. 지금은 과학기술의 발달로 한계가 엄청나게 높아졌기에 상당한 인구증가율을 보이는 것이죠(지금의 과학기술 속도라면 거의 한계가 없어졌다고 보는 편이 나을수도 있겠네요).

어쨋든 실제 인구증가곡선 역시 이렇습니다.


참고로 통계에 따르면 서기 1년을 전후한 세계의 인구는 2억5천만이었습니다. 그것이 5억이 된 것은 16세기에 들어서였죠.
이것으로 인구증가율을 계산해보면

2.5억*(1+x)1600 = 5억 (x=인구증가율)
(1+x)1600 = 5억 / 2.5억 = 2
(1+x) = 2(1/1600) ≒ 1.0004
x = 0.0004 = 0.04%

최소한 성경시대(AD 1세기 전후)의 인구증가율은 0.04%였습니다. 더구나 이것은 1세기~16세기의 평균증가율이었으므로 성경시대의 인구증가율은 0.04%보다 훨씬 적다고 봐야 하겠죠.

참고

노아의 방주 이후 남녀 네 쌍을 시작기준으로 인구증가율을 매년 0.5%로 가정하면 N년이 흐른 후...왜, 0.5%라고 하나면, 대홍수 리셋 후의 인구증가가 현재와 같으려면 그 수치밖에 없음(기독교측 주장임) 기자피라미드는 기원전 2490년에 건설되었다. -> 성서적 해석으로 당시 전세계 인구 13명 // 기원전 1446년 모세가 60만 장정을 이끌고 탈출 -> 성서적 해석으로 당시 전세계 인구 726명이 됨..

창조론 이야기 - 엔트로피(Entropy)

창조론자들의 주장들 중 하나가 '진화는 열역학 제 2 법칙에 위배된다'는 것이죠. 모든 것은 무질서한 방향으로 진행되는데, 진화는 질서가 생기는 현상이라는 것입니다.

하지만 창조론자들이 말하는 열역학 제 2 법칙의 정확한 정의는 '고립계(isolated system)전체 엔트로는 증가한다'는 것입니다. 심지어 고립계라고 해도 그 안에서 국소적인 엔트로피감소는 충분히 일어날 수 있습니다. 오른쪽 그림 전체가 고립계라고 해도 A부분은 B부분과 물질 및 에너지를 교환하고 있는 열린계(opened system)이기 때문이죠. 그 때문에 A와 B를 포함한 전체의 엔트로피는 증가하겠지만 A만의 엔트로피는 감소할 수 있습니다.

지구는 닫힌계가 아닙니다. 태양으로부터 계속 에너지를 받고, 우주먼지라는 형태로 물질도 받아들이고 있습니다. 바로 옆에 '태양'이라고 불리는, 엄청나게 우주의 엔트로피를 증가시키는 존재가 있는 이상 지구에서는 엔트로피의 감소가 일어나는 것은 충분히 가능합니다. 그러므로 지구에서 일어나는 진화가 에너지 제 2 법칙을 위반하는 것은 아닙니다.

그렇다면 정말로 지구에서 엔트로피가 감소하는 현상이 일어날까요? 물론입니다.
매년 내리는 눈송이를 본다면, 무질서하던 수증기들이 6각형의 질서있는 결정을 만듧니다. 다이아몬드도 무질서하던 탄소원자들이 정사면체의 결정을 만듦니다. 소금이나 염화칼슘 모든 결정들이 엔트로피가 감소하는 증거입니다.