메타 휴리스틱
다음 글은 경영과학에서 배우는 내용을 정리함.
유전자 알고리즘도 시뮬레이티드 어닐링처럼 자연의 현상을 모방한 방법이다. 시뮬레이티드 어닐링은 물리적 담금질이라는 자연 현상에서 아이디어를 가져왔고, 유전자 알고리즘은 다윈의 진화이론에 영향을 받았다.
진화이론
생물 종 중에서 환경에 적응해서 개별적인 변이가 일어난 개체가 다음 세대에 더 생존(적자생존, survival of fittest)한다. 자손은 부모로부터 염색체(chromosomes)을 물려 받고, 이 염색체 내의 유전자(genes)는 자손의 특성을 결정한다.
부모로부터 좋은 형질을 물려받은 자손이 더 많이 생존하고, 부모가 되었을 때 다음 세대에게 그 형질을 물려준다.
또한, 가끔이지만 돌연변이(mutation)가 발생하여 형질이 랜덤하게 변화된다. 대부분의 돌연변이는 단점이 많지만, 일부는 개선된 형질을 가지고 있다.
이런 생물학적 아이디어를 최적화 문제에 적용한 것이 유전자 알고리즘이다.
타부서치, 시뮬레이티드 어닐링은 초기해 하나를 사용해 변화시켰다면,
유전자 알고리즘은 여러 해인 해 집단, 여기에서는 '모집단(population)'을 사용한다.
a. 초기화 : 모집단을 랜덤하게 만든다. 적합도를 평가한다.
b. 반복단계 : 부모는 적합도가 큰 개체를 랜덤하게 선택;
부모의 형질이 랜덤하게 섞인 2개의 자식이 태어남;
유산되면 번식이 성공할 때까지 번식해야 함.
새로운 세대의 모집단의 크기를 유지하기 위해 이전 모집단 + 자식집단에서 적합도 좋은 일부를 선택하여 다음세대의 모집단을 구한다.
c. 종료단계 : 정해진 반복횟수나 CPU시간이 지나면 종료;
또는 정해진 반복횟수동안 목적함수의 개선이 없는 경우;
정해진 반복횟수동안 실행가능한 영역으로 이동할 수 없는 경우;
=> 지금까지 찾은 해 중 가장 좋은 해 출력
유전자 알고리즘으로 비선형계획문제와 외판원 문제를 풀어보자.
아래 비선형 문제를 풀어보자.
유전자 알고리즘은 보통 문자열(염색체)로 해를 표현한다. 여기에서는 정수를 이진화 하여 표현한다. x가 최대 31이니, 이를 이진화 하면 11111이 된다. 따라서 자릿수는 5개로 설정하고 이진화한다.
교배는 부모의 유전자를 비교해 일치하면 형질을 자식에게 넘겨주고, 다른 경우에는 랜덤하게 넘겨준다.
즉, 부모가 정수 3과 10이라고 해보자. 그럼 같은 자릿수에 둘 다 0이면 자식도 0, 둘 다 1이면 1을 물려준다. 이때, 자식은 꼭 두 개체여야 한다. (개체 수 유지를 위해)
# 부모 개체
p1 = 3 = 00011
p2 = 10 = 01010
# 자식 개체
c1 = 0_01_
c2 = 0_01_
그리고 빈칸은 0과 1중 랜덤하게 채워 넣는다. 여기에서는 아래와 같이 결정됐다고 하자.
# 자식 개체
c1 = 01011 => 11
c2 = 00010 => 2
이렇게 자식을 만들고, 확률적으로 돌연변이를 준다. 여기에서는 자식의 유전자 10개에 대해 각각 0.1의 확률로 랜덤하게 형질을 바꾼다. c2의 세 번째 값이 0->1로 바뀌었다.
# 자식 개체
c1 = 01011 => 11
c2 = 00110 => 6
이런 과정으로 작성하면 아래와 같다.
연속형 변수의 이진화
위처럼 정수조건이 없고, 실수일 때는 어떻게 할까?
실수도 이진화가 가능하다.
외판원 문제란? => 여기 클릭
방문하는 도시를 순서대로 적은 문자열(염색체)로 해를 표현한다.
p1 = 1-2-3-4-5-6-7-1
p2 = 1-2-4-6-5-7-3-1
c1과 c2는 어떻게 만들 수 있을까? 아래와 같은 방법으로 만들어낼 수 있다.
c1 : 1-2
c1 : 1-2-4
c1 : 1-2-4-3
c1 : 1-2-4-3-5
c1 : 1-2-4-3-5-6
c1 : 1-2-4-3-5-6-7-1
0.1의 확률로 돌연변이를 만든다. 이 문제에서는 돌연변이를 아래와 같이 만든다.
후보도시 중, 랜덤하게 하나를 선택하는데 이때 0.1의 확률로 선택된 도시를 제외하고 다시 랜덤하게 남은 도시 중 하나를 선택한다.
위 예제에서는, 처음에 1과 연결된 도시 2,7,3번 중 하나를 랜덤하게 고르게 되는데 이때 2가 선택됐다. 0.1의 확률로 돌연변이가 일어났다고 하면, 선택된 2를 제외하고 7,3번 중에서 하나를 랜덤하게 생성하게 된다.
위 과정을 요약하면 아래와 같다.
1. 초기화
출발도시 1 선정
2. 다음 도시 후보 선택
각 부모에서 출발도시와 연결된 도시를 후보로 선택. 출발도시와 연결된 도시가 없는 경우 하위경로역순을 통해 연결할 도시 선택
3. 다음 도시 선택
2에서 얻은 후보 도시 중 랜덤하게 하나 선택
4. 돌연변이 검사
랜덤수를 발생하여 돌연변이 확률보다 작으면 3에서 선택한 도시 거절. 2에서 얻은 나머지 후보 도시 중 하나를 랜덤하게 선택
5. 계속
현재 도시에 연결할 수 있는 후보도시를 찾아 경로를 완성. 즉, 모든 경로가 완성될 때까지 2-4번 반복
6. 완성
실행불가능한 경로이거나 더 이상 도시를 연결할 수 없을 때에는 1단계부터 다시 수행하여 실행가능한 경로를 찾는다.