다음 [그림 1]은 유전자 알고리즘의 일반적인 수행과정을 나타낸다.

    

[그림 1] 유전자 알고리즘 수행과정


유전자 표현(Gene Representation)은 유전자 알고리즘을 구축하는 첫단계로 문제의 잠재해를 유전적 표현 즉, 개체로 표현하여야 한다. 이 유전적 표현은 유전자 알고리즘의  다른 절차(적합도 평가와 유전연산자 등)에 영향을 주므로 문제의 특성을 잘 반영할 수 있도록 하고, 문제에 따라 표현은 다를 수 있다. 유전자 알고리즘은 개체들로 구성된 모집단을 바탕으로 해를 찾아 나가기 때문에 초기에 모집단이 생성되어야 한다. 생성 방법은 임의생성 방법이 흔히 사용된다.


적합도(Fitness)는 유전자 개체가 갖고 있는 피부색, 저항력 등과 같은 특성을 나타내는 값으로서 이것은 환경에서 생존할 수 있는 즉, 적응할 수 있는 정도를  나타내는 값이다. 개체가 주어진 어떤 환경에서 생존하기 위해서는 최적의 적합도를 가져야 하며, 이러한 최적값은 일반적인 최적화문제의 목적함수에서와 같이 목적함수인 적합도 함수를 설정하여 이것을 최적화함으로써 얻을 수  있다. 예를 들면, 임의의 염색체(스트링)의 유전자값이 주어질 때, 이 값들을 변수로 한 적합도 함수를 설정하여 최적화시킴으로써 최적의 적합도를 구한다. 그러나 주어진 특정한 값을 갖는 염색체가 원하는 수준의 적합도를 충족시키지 못하면 유전자 변형을 통하여 염색체를 변화시켜 원하는 최적 적합도가 생성될 때까지 반복한다.


선별(Selection)은 적자생존의 자연법칙에 기초하여 환경에 대한 적합도를 평가하여 현 세대의 모집단으로부터 다음 세대를 만들 개체를 선택하는 과정이다. 모집단의 다양성과 선별압력이 조화를 이룰 수 있어야 하고, 강한 선별압력(적합도가 높은 우수개체가 열성개체보다 생존확률이 아주 높은 것)은 모집단의  개체들을 조기에 수렴시키나 해의 다양성이 떨어지며, 약한 선별압력은 해의 다양성은 유지되나 효율적으로 해를 탐색하지 못한다.


유전 연산자(Operator)는 교차(crossover)와 돌연변이(mutation) 연산자로 나누어 진다. 교차는 두 부모(parent)가 갖는 유전자를 조합하여 자손(offspring)을 생성하는 과정이다. 교차시 부모의 좋은 형질(유전자)이 가능한 파괴되지 않고 자손에 상속될 수 있어야 한다. 돌연변이는 한 개체에서 아주 작은 수의 유전자를  임의로 변화시키는 과정이며 해를 다양하게 탐색할 수 있도록 한다.


세대(Generation)는 알고리즘에서 유전연산의 횟수이며, 유전 파라미터(Parameter)로는 모집단의   크기(pop-size), 교차율, 돌연변이율, 종료조건 등이 있다. 모집단의 크기는  모집단을 이루는 개체수를 의미하며, 교차율은 각 개체가 교차될 확률, 돌연변이율은 각 유전자가 돌연변이 될 확률을 나타낸다. 알고리즘 종료조건으로는 (1) 진행된 세대수 또는 생성된 개체수, (2) 해의 개선의 이루어지지 않고   진행된 세대수 또는 생성된 개체수, (3) 계산소요시간 등이 사용된다. 다음 
<표 1>과 [그림 2]는 알고리즘의 세부 절차 및 흐름도를 나타낸다.

<표 1> 유전자 알고리즘의 절차

단 계

내            용

1

종료조건을 설정한다(진행할 세대수, 계산소요시간 등)

2

최초의 유전자개체 모집단을 구성한다

3

최초 모집단의 유전자개체에 대하여 적응도를 평가한다

4

교차율에 의해 모집단에서 두 유전자개체를 선별한다.

5

선별된 두 개체에 대하여 교차를 실시한다.

6

돌연변이율에 의해 임의 개체를 변형시킨다.

7

교차와 돌연변이된 유전자개체의 적응도를 평가한다.

8

최초 정해진 종료조건을 만족하면 계산을 끝내며, 그렇지 않으면  단계 4로 다시 간다.


procedure GA

initialize Population;

   eval   uate Population;

while not (terminal condition satisfied) do

select chromosomes for next population;

Crossover and Mutation;

   eval   uate Population;

end while

end procedure

[그림 2] 유전자 알고리즘 흐름도



[출처 : http://kr.blog.yahoo.com/g0jeon01/47]
개요 ( What are Genetic Algorithms? ) 유전자 알고리즘(Genetic Algorithm, GA)은 적자 생존과 유전의 메카니즘을 바탕으로 하는 탐색 알고리즘이다. 다시 말해 주어진 환경에 잘 적응하는 유전자만을 선택(selection)하고 교배(crossover)하고 때에 따라서는 돌연변이(mutation)도 하며 다음 세대에 우수한 유전 형질이 전달(reproduction)되게 된다. 따라서 진화(evolution)가 거듭될수록 주어진 환경에 더 적합한 유전자들만이 남아있게 될 것이다.
유전자 알고리즘은 미시간대학의 홀랜드(John Holland)에 의해 탄생하였으며. 당시 연구원들의 연구 목표는
[1] 자연시스템의 적응적 과정을 추상화시키며 철저하게 분석하여,
[2] 그러한 시스템을 소프트웨어적으로 디자인하는 것이었다.
유전자 알고리즘(GA)은 그러한 배경에서 만들어졌으며, 근본적으로 다른 탐색이나 최적화 알고리즘과는 세 가지 정도가 다르다.
[1] GA는 하나의 개체(변수 등)가 아닌 개체들의 군(pool) 단위로 탐색한다.
[2] GA는 적합성 함수(fitness function)를 사용한다.
[3] GA는 확률적인 변이 규칙을 사용한다.
간단한 예를 들어보자. f(x) = x2[0 ≤ x ≤ 31] 이라는 환경이 있으며, 환경에 살아가는 개체(유전자)가 x인 셈이다. 그리고 환경에 잘 적응하는 정도를 함수값으로 정의하자. 그러므로 x = 0이라는 개체보다 x = 4라는 개체가 f(x) = x2[0 ≤ x ≤ 4]라는 환경에서 더 잘 적응하는 것이다.
환경 : f(x) = x2[0 ≤ x ≤ 31]
개체 : 0 ≤ x ≤ 31
적합성(fitness) : f(x)
01101
11000
01000
10011
위의 네 개체가 오손도손(^_^) 살고 있는 군(집단)에서 과연 f(x) = x2이라는 환경에서 누가 더 잘 적응할 것으로 생각되는가? 위의 이진수를 십진수로 바꾸어 생각하면 쉽게 알 수 있다. 위의 예에서 01000은 살기 어렵고, 11000은 그나마 가장 잘 적응할 것이다. 그러므로 다음 세대에서는 01000은 도태를 하고, 11000은 자손을 생산하게 된다. 이와 같은 과정을 거친 먼 훗날의 개체는 바로 11111이라는 개체가 탄생할 것이고, 이 넘(^_^)이 바로 주어진 환경을 지배할 것이다.
11111
11111
11111
11111
군(pool)이 위와 같은 개체(gene)로 구성되었을 때 '환경에 적응하였다'라고 말한다. 또는 '해를 찾았다'라고 말하기도 한다. 이와 같이 유전자 알고리즘은 자연의 적자 생존 원칙에 기반을 하고 있는 탐색 알고리즘이다. 다음 내용에서는 유전자 알고리즘의 단계별 과정들인 재생산(reproduction), 교배(crossover), 돌연변이(mutation)들을 알아보겠다
----------------
이번에는 유전자 알고리즘(GA; Genetic Algorithm)에 대해서 하겠습
니다.랜덤을 사용하는 알고리즘중에 제가 젤 좋아하는 알고리즘입니다
.(잘은 사용 하지만...^^)
그럼 강좌 시작하겠습니다.

찰스 다윈은 "종의 기원"에서 종이 어떻게 진화하는가를 적자 생존
의 원칙으로 명하였습니다. 그리고 멘델은 완두콩에 대한 실험으로 자
손의 형질은 원소로서 유전되며, 두 부모로 부터 각각 한개씩 받는다
고 설명하였습니다.

유전자 알고리즘은 적자 생존의 원칙과 교배, 돌연변이를 사용하여
탐색하는 기법으로 국소 탐색이나 시뮬레이티드 어닐링이 한개의 해
를 가지고 운영하는데 비해 유전자 알고리즘은 여러개의 해를 가지고
운영합니다.

유전자 알고리즘의 기본적인 구조는 다음과 같습니다.

Procedure GenetcAlgorithm;
begin
t := 0;
P(t)의 초기화(초기모집단 생성)
P(t)의 적응도 평가
while(종료조건이 만족되지 않으면) do
begin
t := t + 1;
P(t-1)로부터 P(t)를 선별
P(t)의 유전연산(교차와 돌연변이)
P(t)의 적응도 평가
end;
end;

P(t)는 t세대에서의 모집단을 나타냄니다. 간단한 문제를 가지고 예
를 들어 설명하겠습니다.

문제) f(x) = | 10*x-100 | 이고, 0 <= x <= 31 일때 함수 f(x)를
최대로 하는 x
를 찾아라. 단 x는 정수이다.

위 문제는 국소탐색을 할때 사용한 문제죠... 숫자만 약간 바꿨습니
다. 우선 해의 표현 방법을 정해야 겠죠. (유전 알고리즘에서 해는 보
통 유전자라고 부름니다. 이것 말고도 많은 용어들이 생물학에서 사용
되는 용어를 많이 사용합니다.) 0 ~ 31까지 나타내기 위해서는 5비트
가 필요 합니다. 유전자는 2진백터로 표현 합니다. 즉, (10101) = 21,
(11111) = 31, (01100) = 12 가 됩니다.

그러면 0세대 부터 시작 합니다. 처음에는 초기 집단을 생성 합니다.
초기 집단은 랜덤하게 만듭니다. 20개의 염색체로, 초기 집단이 다음
과 같이 만들어 졌다고 합시다.

v[1]: (01101)
v[2]: (01111)
v[3]: (10100)
v[4]: (01101)
v[5]: (10101)
v[6]: (01011)
v[7]: (10111)
v[8]: (10000)
v[9]: (01101)
v[10]: (01011)


평가 단계에서 각 염색체를 해독하고, 해독된 값으로 부터 적합도
함수값을 계산 한 결과 다음과 같은 결과를 얻었습니다.

eval(v[1]) = f(13) = 30
eval(v[2]) = f(15) = 50
eval(v[3]) = f(20) = 100
eval(v[4]) = f(13) = 30
eval(v[5]) = f(21) = 110
eval(v[6]) = f(11) = 10
eval(v[7]) = f(24) = 130
eval(v[8]) = f(16) = 60
eval(v[9]) = f(13) = 30
eval(v[10]) = f(11) = 10

이제 이중에서 몇개의 염색체를 선택해야 합니다. 선택하는 방법은
여러가지가 있는데 여기에서는 룰렛선택을 합니다. 룰렛선택은 적합도
에 비례해서 선택될 확률이 높아짐니다. 룰렛선택은 다음과 같이 합니
다.

------------------------------------------------------------------------------
1) 개체집단의 총 적합도를 계산한다.
F = eval(v[1]) + eval(v[2]) + .... + eval(v[10])
2) 각 염색체에 대한 선택 확률 p[i]를 계산한다.
p[i] = eval(v[i])/F
3) 각 염색체에 대한 누적 확률 q[i]를 계산한다.
q[i] = p[1] + p[2] + ... p[i]

선택과정은 유전자의 개수만큼 다음 방법으로 새로운 개체집단을 위
한 하나의 염색체를 선택합니다.

범위 0..1사이의 난수 r를 발생시킨다.
q[i-1]< r <=q[i] 인 i번째 염색체를 선택한다.
------------------------------------------------------------------------------

그럼 위와 같은 방법으로 룰렛 선택을 합니다. 개체집단의 총 적합도는

F = eval(v[1]) eval(v[2]) +...+ eval(v[10]) = 560

입니다. 각 염색체가 선택될 확률 p[i]는 다음과 같습니다.

p[1] = eval(v[1])/F = 0.0535714286
p[2] = eval(v[2])/F = 0.0892857143
p[3] = eval(v[3])/F = 0.1785714286
p[4] = eval(v[4])/F = 0.0535714286
p[5] = eval(v[5])/F = 0.1964285714
p[6] = eval(v[6])/F = 0.0178571429
p[7] = eval(v[7])/F = 0.2321428571
p[8] = eval(v[8])/F = 0.1071428571
p[9] = eval(v[9])/F = 0.0535714286
p[10] = eval(v[10])/F = 0.0178571429

그러면 각 염색체의 누적 확률 q[i]는 다음과 같습니다.

q[1] = 0.0535714286
q[2] = 0.1428571429
q[3] = 0.3214285714
q[4] = 0.3750000000
q[5] = 0.5714285714
q[6] = 0.5892857143
q[7] = 0.8214285714
q[8] = 0.9285714286
q[9] = 0.9821428571
q[10] = 1.0000000000

이제 0부터 1사이의 난수를 10(유전자의 개수)개 발생시켜 유전자를선택합니다.
만약 난수가 0.45772737743 이라면 q[4] < 0.45772737743 <= q[5] 를 만족하기 때
문에 유전자v[5] 를 선택합니다. 난수가 다음과 같이 발생 되었습니다.

0.4572273774 0.6205325316 0.2902582685 0.3707185990
0.6674934615 0.5626070339 0.7364188557 0.9917080770
0.6376504887 0.9917636998

그러면 선택된 개체들은 최종적으로 다음과 같습니다.

v'[1] = (10101)
v'[2] = (10111)
v'[3] = (10100)
v'[4] = (01101)
v'[5] = (10111)
v'[6] = (10101)
v'[7] = (10111)
v'[8] = (01011)
v'[9] = (10111)
v'[10] = (01011)

그러면 이제 유전 연산을 하면 됩니다. 유전 연산은 교배과 돌연변
이가 있는데 우선 교배부터 합니다. 교배하는 방법은 우선 교배 확률
에 의해 교배시킬 염색체를 선택합니다. 교배 확률은 0.25로 하겠습니
다. 다음과 같은 난수를 10개 발생시켜서 다음과 같은 수를 얻었습니
다.

0.5725024704 0.0490196129 0.8726333449 0.3486277370
0.3863749911 0.8044754410 0.8187371953 0.5160406448
0.0951179727 0.6477678808

결과 선택된 것은 v'[2]와 v'[9]가 선택되었습니다. 운좋게 짝수개
가 선택되어서 모두 교배시킬수 있습니다. 만약에 홀수개가 선택되었
다면 하나를 빼든가 추가해야 됩니다. 교배하는 방법은 다음과 같이
합니다.

------------------------------------------------------------------------------
염색체 x = (x1 x2 x3 x4 x5)와 염색체 y = (y1 y2 y3 y4 y5)가 있
다으면 우선 1 ~ 4(5-1) 사이의 수 중 난수 r를 발생 시킨다. 만약
r이 3이라면

x' = (x1 x2 x3 | y4 y5)
y' = (y1 y2 y3 | x4 x5)

로 r번째 다음에 있는 유전인자들을 바꿔주어서 새로운 유전자를 만
듭니다.
------------------------------------------------------------------------------

v'[2] = (10111) 와 v'[9] = (10111) 를 교배시키기 위해 난수 r를
발생 시킴니다. r은 1이 발생 되었습니다. 다음과 같이 됩니다.

v'[2] = (1 | 0111)
v'[9] = (1 | 0111)

v'[2]와 v'[9] 서로 같아서 아무런 변화가 없습니다. (예제가 나쁘
죠...프로그램을 실행시키면서 쓰는 것이라서 다른 걸로 바꿀수가...^^),
그리고 여기에서는 2개의 유전자가 선택 되었는데 만약 4개 또는 6개 이
상이 선택 되었다면은 임의로 2개씩 짝지어서 교배 시켜야 됩니다. 교배
이후에 개체집단은 다음과 같습니다.

v'[1] = (10101)
v'[2] = (10111)
v'[3] = (10100)
v'[4] = (01101)
v'[5] = (10111)
v'[6] = (10101)
v'[7] = (10111)
v'[8] = (01011)
v'[9] = (10111)
v'[10] = (01011)

이제 돌연변이를 시켜 줍니다. 돌연 변이 확률은 0.1로 하겠습니다.
돌연 변이는 각 염색체에 대해서 난수를 발생시켜 (돌연 변이 확률)<(
난수) 이면은 유전인자를 바꾸어 줍니다. 즉, 1이면 0으로 0이면 1로
바꿉니다. 돌연 변이를 시킨 다음에 개체집단은 다음고 같습니다. 바
뀐 염색체는 위에 '_' 표시를 했습니다.
_
v'[1] = (11001)
_
v'[2] = (00111)
_
v'[3] = (10101)
_
v'[4] = (00101)

v'[5] = (10111)
_
v'[6] = (10111)

v'[7] = (10111)

v'[8] = (01011)

v'[9] = (10111)
_
v'[10] = (00011)

그러면 v'에서 '표시를 지우고 다시 고쳐쓰면 다음고 같습니다.

v[1] = (11001)
v[2] = (00111)
v[3] = (10101)
v[4] = (00101)
v[5] = (10111)
v[6] = (10111)
v[7] = (10111)
v[8] = (01011)
v[9] = (10111)
v[10] = (00011)

이 개체의 적합도를 계산 하면 다음과 같습니다.

eval(v[1]) = f(25) = 150
eval(v[2]) = f(7) = 30
eval(v[3]) = f(21) = 110
eval(v[4]) = f(5) = 50
eval(v[5]) = f(23) = 130
eval(v[6]) = f(23) = 130
eval(v[7]) = f(23) = 130
eval(v[8]) = f(11) = 10
eval(v[9]) = f(23) = 130
eval(v[10]) = f(3) = 70

대체적으로 이전세대 보다 더 좋은 값을 갖는 개체집단이 생겼습니
다. 이런 방법을 반복하면은 꽤 좋은 해를 찾을수 있습니다. 10세대
까지 진행 시킨 결과는 다음과 같습니다.

v[1] = (11111)
v[2] = (11011)
v[3] = (11011)
v[4] = (11100)
v[5] = (10111)
v[6] = (11100)
v[7] = (11111)
v[8] = (11111)
v[9] = (11100)
v[10] = (11111)

이것을 평가하면 다음과 값을 얻을수 있습니다.

eval[2] = f(27) = 170
eval[3] = f(27) = 170
eval[4] = f(28) = 180
eval[5] = f(23) = 130
eval[6] = f(28) = 180
eval[7] = f(31) = 210
eval[8] = f(31) = 210
eval[9] = f(28) = 180
eval[10] = f(31) = 210

여기에서는 운좋게 마지막 세대에서 최적값 210을 얻을수 있었습니
다. 하지만 마지막 세대에 최적값을 못얻는 경우가 생길수 있으므로
여태까지 출현했는 염색체중에서 가장 좋은 평가값을 갖는 염색체를
따로 저장해 둡니다.
----
이번에는 죄수의 딜레마 라는 단순한 게임에 대한 전략을 학습하
기 위하여 어떻게사용될 수 있는지 설명하겠습니다.

------------------------------------------------------------------------------
죄수의 딜레마 - 두 명의 죄수가 독립된 방에 수감되어 있어서 서
로 통신할 수가 없는 상태에 놓여 있습니다. 죄수들은 각각 상대방
을 이탈하고 배신(죄를 시인하는 것이라 생각하면 됩니다)을 하도록
요구됩니다.

┌───────────┬──────────┬──────────┐
│ 나 \ 상대방 │협력 │ 배신 │
├───────────┼──────────┼──────────┤
│ 협력 │ 각각 2년형 │ 나만 5년형 │
├───────────┼──────────┼──────────┤
│ 배신 │ 상대방만 5년형 │ 각각 4년형 │
└───────────┴──────────┴──────────┘

위표와 같이 징역을 살게 됩니다. 그러면 이기적인 선택은 상대방
이 어떠한 선택을 하든 상관없이 협력하는 것보다는 더 나은 보상을
가져다 주게 됩니다(상대방이 협력 했을 경우에 내가 협력하면 2년형
을 살지만 배신하면 5년형이고, 상대방이 배신했을 때도 협력하면
5년형을 살지만 배신하면 4년형을 살게 되기 때문입니다) 하지만 둘
다 배신하면 둘다 협력했을 때보다 결과가 나쁘게 됩니다. 죄수의 딜
레마는 협력할 것인가 배신할 것인가를 선택하는 문제입니다.
------------------------------------------------------------------------------

만약 단, 한번의 기회만 주어진다면 어떤 선택을 해야 될까요?? 이
것을 여러번 시행하게 만들면 다음과 같이 점수를 주면 됩니다.


┌────────┬────────┬────────┬────────┐
│ Player1 │ Player2 │ Player1의 점수 │ Player2의 점수 │
├────────┼────────┼────────┼────────┤
│ 배신 │ 배신 │ 1 │ 1 │
├────────┼────────┼────────┼────────┤
│ 배신 │ 협조 │ 5 │ 0 │
├────────┼────────┼────────┼────────┤
│ 협조 │ 배신 │ 0 │ 5 │
├────────┼────────┼────────┼────────┤
│ 협조 │ 협조 │ 3 │ 3 │
└────────┴────────┴────────┴────────┘

위 표대로 점수를 주면서 게임을 합니다. 예를 들어 게임이 (협조,
협조),(협조,배신),(협조,배신)이 되었다면 Player1은 3+0+0=3점을 얻
게 되고, Player2는 3+5+5 = 13점을얻게 됩니다. 그러면 이것을 유전
자 알고리즘으로 점근해 보겠습니다.

1) 전략의 표현 - 전략은 최근에 했던 3게임을 가지고 현재의 행동을
선택합니다. 예를 들어 최근에 했던 게임이 (배신,배신),(배신,협조),
(협조,배신) 였고, 염색체 내의 이것에 해당되는 유전인자가 협조였다
면 그 염색체의 다음 행동은 협조가 됩니다. 이런 방법으로 표현하면
은 한 게임에 대해 4개의 가능한 결과가 존재하므로 4*4*4=64개의 서
로 다른 이전 행동들이 존재합니다.

64개의 서로 다른 행동에 대한 다음 행동이 협조냐 배신이냐에 따라
2가지 경우가 존재 하므로 비트 또는 D와 C로 표현할수 있습니다. 그리
고 게임시작 이전의 세 가설적인 행동에 관한 초기 가정을 규정할 필요
가 있으므로 추가로 6개의 유전인자가 필요하게 되빈다. 총 70개의 유
전인자가 하나의 염색체를 표현하게 됩니다.

2) 유전자 알고리즘의 윤곽
죄수의 딜레마에 대한 전략을 학습하기 위한 Axelrod의 유전자 알고
리즘은 다음과 같은 네 가지 과정으로 이루어집니다.

------------------------------------------------------------------------------
1. 초기 개체집단을 선택한다. 각 플레이어는 위에서 언급된 것처럼 하
나의 전략을 나타내는 70비트의 임의의 스트링에 할당된다.

2. 각 플레이어를 테스트하여 유효성을 결정한다. 각 플레이어는 자신의
염색체에 의해 정의된 전략을 사용하여 다른 플레이어와 게임한다. 그
플레이어의 점수는 그가 하는 모든 게임에 있어서의 평균이다.

3. 증식시킬 플레이어를 선택한다. 평균점수를 가진 플레이어에 한번의
증식 기회를 부여한다. 평균점수보다 하나의 표준편차 이상의 점수를 가
진 플레이어에는 두번의 증식기회를 부여한다. 평균점수보다 하나의 표
준편차 이하의 점수를 가진 플레이어는 증식기회를 갖지 못한다.

4. 성공적인 플레이어는 임의로 짝을 지어 교배당 두명의 자손을 만들어
낸다. 각 자손의 전략은 그의 부모의 전략으로부터 결정된다. 이것은 두
개의 유전 연산자인 교배와 돌연벼이에 의해 이루어진다.
------------------------------------------------------------------------------

3) 실험 결과
- 위와 같이 프로그램을 실행하고 나서 Axelrod가 얻은 결과는 놀랄
만한 결과를 얻었다고 합니다. 그 중 일부를 적으면 다음과 같습니다.

------------------------------------------------------------------------------
C는 협력, D는 배신;

1. 배를 흔들지 말라: 세번의 상호협력 이후에는 계속 협력한다
((CC)(CC)(CC) 이후에 C).

2. 화를 내라: 다른 플레이어가 배신하였을 때는 같이 배신하라
((CC)(CC)(CD) 이후에 D)

3. 사과를 받아들이라: 협력관계가 다시 정립되었을 때 계속 협력하라
((CD)(DC)(CC) 이후에 C)

4. 잊어버리라: 배신 후에 협력관계가 재정립되었을 때 협력하라
((DC)(CC)(CC) 이후에 C)

5. 관례를 받아들이라: 세번의 상호 배신 이후에 배신하라
((DD)(DD)(DD) 이후에 D)
------------------------------------------------------------------------------

------------------------------------------------------------------------------
제가 해본 결과는 신기하게도 ((CC)(CC)(CC) 이후에 D)로 진화하
는 개체가 되는군요...^^;; 아마도 어딘가 잘못한듯 싶은데... 혹시
시간 있으신 분은 한번 위 프로그램을 짜보세요...그래서 결과를 올
려 주시면 감사...(제가 한번 보고 싶어서여...^^;;)
-------------
이번에는 유전자 알고리즘의 동작 원리에 대해서 하겠습니다.

우선 스키마란 개념을 알 필요가 있습니다. 스키마란 염색체들 사이의
유사성을 나타낼 수 있는 하나의 전형 입니다. 이것은 '*'기호를 사용해
서 나타내는데 '*'기호에는 어떠한 유전인자와도 대응된다는 표시 입니
다. 예를 들어 (*10101101)은 다음 두개의 염색체와 일치 합니다.

(010101101), (110101101)

다른 스키마 (*101*01010*)은 다음 염색체와 일치 합니다.

(01010010100), (01010010101), (01011010100) (01011010101)
(11010010100), (11010010101), (11011010100) (11011010101)

스키마에서 '*'기호의 갯수가 k개이면 이것에 대응되는 염색체의 갯수
는 2^k개가 됩니다.

그러면은 유전 알고리즘은 #1에서 논의한 대로 선택, 교배연산, 돌연변
이연산을 거치게 됩니다. 우선 선택 연산만 생각하고 어떤 스키마 S가 살
아 남을 확률을 계산해 보겠습니다.

만약 어떤 염색체의 적합도가 상당히 높다면은 그 염색체는 다음세대에
여러개가 생길것이라고 예측할수 있습니다. 예를 들어 염색체가 다음과 같
이 있고, (강좌 #1에서의 문제 입니다)

v[1]: (01101)
v[2]: (01111)
v[3]: (10100)
v[4]: (01101)
v[5]: (10101)
v[6]: (01011)
v[7]: (10111)
v[8]: (10000)
v[9]: (01101)
v[10]: (01011)

각 염색체의 적합도는 다음과 같습니다.

eval(v[1]) = f(13) = 30
eval(v[2]) = f(15) = 50
eval(v[3]) = f(20) = 100
eval(v[4]) = f(13) = 30
eval(v[5]) = f(21) = 110
eval(v[6]) = f(11) = 10
eval(v[7]) = f(24) = 130
eval(v[8]) = f(16) = 60
eval(v[9]) = f(13) = 30
eval(v[10]) = f(11) = 10

위 개체의 총 적합도는 560이고, 평균 적합도는 56이 됩니다. 염색체
v[7]같은 경우에는 평균 적합도의 약 2배정도 됩니다. 이것은 다음 세대
에 염색체 v[7]이 약 2개정도 있을거라고 짐작할수 있습니다. 다음 세대
에서도 v[7]의 적합도가 높다면은 2개에서 4개로 늘어날수 있고, 그 다
음에 8개라는 식으로(실제로는 평균 적합도가 높아져서 이렇게 되기 힘
들겠지만) 될 것이라 생각할수 있습니다. 즉, 어떤 염색체가 평균 적합
도보다 높으면 그것은 다음 세대에서 기하 급수적으로 늘어날 것을 예상
할수 있습니다. 같은 방법으로 염색체가 평균 적합도보다 낮다면은 그것
은 다음 세대에서 기하 급수적으로 줄어 들게 되고, 평균이라면은 같은
수의 염색체들이 다음세대에 살아 있을거라 예상 할수 있습니다.

그러면 스키마 S와 일치하는 염색체들의 적합도의 평균을 구합니다.
이것을 스키마 S의 적합도라 부르겠습니다.
그러면 만약 스키마 S의 적합도가 평균 적합도 보다 크다면 다음 세대
에 스키마 S와 일치하는 염색체는 기하 급수적으로 늘어날 것이고, 평균
이라면 같은수의 염색체가 존재할 것이고, 평균 이하라면은 기하 급수적
으로 줄어들것이라고 예측할수 있습니다.

그러면 선택된 스키마가 교배나 돌연변이 연산에 의해서 파괴될수도
있습니다. 교배연산에서 다음과 같은 스키마가 선택되었다고 합시다.

(***111*****), (111*****01*)

그러면은 교배연산은 각 유전인자의 위치에 대해 골고루 선택될 확률이
높으므로 첫번째 스키마가 파괴될 확률은 두번째 스키마가 파괴될 확률보
다 낮습니다. 엄밀하게 계산하면 첫번째 스키마가 파괴될 확률은 3/11이
고, 두번재 스키마가 파괴될 확률은 10/11이 됩니다.

그리고 또 돌연변이 연산을 하게 됩니다. 돌연 변이할때는 고정된 유전
인자의 개수가 적을수록 스키마가 파괴될 확률이 적어지게 됩니다.(고정된
유전인자의 개수를 차수라고 합니다 : (101*1****)의 차수는 4가 됩니다),
위에 있는 염색체에서 첫번째 스키마의 차수는 3이 되고, 돌연변이 연산에
의해 파괴될 확률은 {1-(돌연변이 확률)}^3이 되고, 두번째 스키마가 돌연
변이에 의해 파괴될 확률은 {1-(돌연변이 확률)}^5가 됩니다.

즉, 이것을을 정리하면

선택 - 평균 이상이면 지수합수적으로 증가한다.
교배및 돌연변이 연산 - 짧고, 낮은 차수의 스키마는 생존율이 높다.

이것으로 부터 다음과 같은 스키마 정리와 구설부 가설이 생기게 됩니다.

------------------------------------------------------------------------------
스키마 정리 - 짧고, 낮은 차수의, 평균 이상의 스키마는 유전자 알고리
즘의 이후 세대에서 지수함수적으로 증가하는 시도를 받는다.

즉, GA는 짧고 낮은 차수의 스키마에 의해서 공간을 탐색한다는 것입니다.

구설부 가설 - 유전자 알고리즘은 구설부라고 불리는 짧고, 낮은 차수의,
고성능 스키마타의 병렬을 통하여 근사 최적 성능을 추구한다.
------------------------------------------------------------------------------

------------------------------------------------------------------------------
수학적인 식들은 다 제거해버리고 썼습니다.


[출처 : http://zzpark.egloos.com/5508970]

 배신과 협력의 게임(1라운드의 죄수의 딜레마)

물주(게임 진행자) 한 명과 두 사람이 게임을 한다. 게임을 하는 두 사람의 손에는 '협력'과 '배신'의 카드 2장이 있으며 단 1라운드만 진행이 된다. 카드의 조합은 아래 표의 네 가지가 되며, 각각의 경우에서 이득과 손해는 아래와 같다.

A가 선택한 카드
B가 
선택한 카드
협력 배신
협력 보수
(상호 협력에 대한) 
예) 300달러 매우 나쁨
매우 나쁨
예) 100달러 징수
배신 매우 좋음
유혹료
(배신으로)
예) 500 달러
꽤 나쁨
벌금
(상호 배신에 대한)
예) 10 달러 징수

표1. '협력'과 '배신'의 이득과 손해

 

가령 위의 예에서 상호 협력의 카드를 제출할 때는 상호 협력에 대한 보상으로 물주로부터 300달러를 받는 것이다. 이 때 배신에 대한 유혹료는 상호 협력의 보수보다 높아야 하고, 상호 협력의 보수는 상호 배신의 벌금보다는 좋아야 한다. 이 밖에 여러 가지 설정이 있지만 생략한다.

그럼 왜 '딜레마'일까? 누구든 낼 수 있는 카드는 '협력'과 '배신'이라는 카드 2장 밖에 없다. 만일 A가 '배신'을 냈다면 B는 최선의 카드로 '배신'을 내야 할 것이다. 만일 '협력'의 카드를 낸다면 B는 100 달러를 게임 진행자에게 줘야 한다. A가 '협력'의 카드를 냈을 경우에도 당신이 얻을 수 있는 최대의 이득은 '배신'의 카드를 내는 것이고 그 때 유혹료로 500달러를 얻을 것이다.

결론은 타인이 어느 카드를 내든 상관없이 당신의 최선 행동은 '항상' 배신이라는 것이다. 그러므로 두 사람의 이성적인 경기자가 만나면 모두 배신하여 같이 벌금 또는 운 좋으면 유혹료를 받게 될 것으로 끝난다. 두 사람 모두 만일 쌍방이 '협력'만을 낸다면 상호 협력으로 비교적 높은 보수를 받을 것을 확실히 알고 있다. 하지만 '배신'의 카드를 내는 것이 최선의 행동이라는 것이다. 쌍방이 서로 연락하거나 정보를 주고 받을 수 있다면, 서로 연락해서 '협력'의 카드를 제출하겠지만, 그렇지 않을 경우에는 '배신'을 하는 것이 합리적인 게임 진행이 될 것이다. 그러니 딜레마인 것이다.

딜레마 (dilemma) ①(논리학) =양도 논법(兩刀論法). 
선택해야 하는 길은 2개뿐인데 그 어느 쪽도 바람직하지 못한 결과를 초래하는 상황.

 


 반복 죄수의 딜레마

'죄수'란 하나의 특별한 상징적인 예에서 유래한다. 이 경우는 돈이 아닌 죄수의 형기이다. 가령 A군과 B군이 자신들이 저지른 범죄 때문에 공범 혐의로 투옥되어 있다. 그 죄수들은 각각 독방 속에서 공범자에 대한 불리한 증언을 함으로써 동료를 배신하도록 유혹당했다. 처분은 두 사람의 죄수가 어떻게 하는가에 따라 결정되며, 어느 쪽도 상대가 어떻게 했는지 모른다. 만일 각각이 배신하면 양자 모두 죄가 인정되나 증거를 제공한 점으로 약간의 신용을 얻어 어느 정도 경감된 형기, 즉 상호 배신의 벌을 받게 된다. 만일 양자가 협력하여 증언을 거부하면 유죄가 될 충분한 증거가 없으므로 보다 경미한 죄로 짧은 형기, 즉 상호 협력의 보수를 받는다. '지불'이 돈이 아니라 형기였지만 이 게임을 기본적 특징이 보전되어 있는 것을 느낄 것이다.

1라운드의 게임에서는 상호 배신으로 끝나게 될 운명이 되고 만다. 그러나 그것이 '반복'된다면 그 때에도 '배신'을 할 것인지 생각해보자. 반복 게임은 동일한 경기자에 의해 제한없이 반복되어 행해질 뿐만 아니라 또한 두 사람은 서로 바라보고 있으며 그 사이에는 게임 진행자(판사)가 앉아 있다. 두 사람은 두 카드의 어느 한쪽을 냄으로써 승부를 내고 게임 진행자(판사)는 먼저 제시한 규칙에 따라 형기를 결정한다. 이제는 1 라운드의 게임으로 끝나는 대신에 우리는 또 다시 카드를 집어서 다음의 승부에 대비한다. ( 이와 같은 반복은 두 사람이 반복적으로 공범자로 잡힌다고 가정하면 간단히 설명된다. 단 서로의 연락은 되지 않는다.) 몇 번 승부를 계속하는 사이에 두 사람에게는 신용, 또는 불신이 쌓여 협력 또는 배신을 할 수 있는 기회가 주어진다. 제한없이 긴 게임에서 중요한 점은 서로가 손해를 볼 것 없이 쌍방이 협력의 보수를 받을 수가 있다는 것이다.

 

 전략

과연 위와 같은 게임을 할 경우 어떤 전략을 가진 자가 장기적으로 승리를 거둘 수 있을 것인가를 생각해보자. 몇 개의 교묘한 전략이 가능하나 승리를 거든 전략은 놀랍게도 가장 단순하고 표현적으로는 모든 것 중에서 가장 교묘함이 부족했다. 그것은 '당하면 갚는다(tit for tat)'라는 전략으로 불렸고 최초의 카드는 협력으로 시작하고 그 이후는 단순히 바로 전에 상대가 낸 카드를 흉내내는 것뿐이다. 즉, 상대가 배신을 하면 내가 배신을 하는 것이다.

다음은 '소박한 시험꾼(naive prober)'으로 '당하면 갚는다'와 같으나 10회중에 1회는 함부로 이유없이 배신하여 유혹료로서 높은 득점을 기대하는 전략이다. 그리고 '원한파'는 한번 상대방이 배신하면 끝까지 배신하는 전략이고, '항상 배신은 항상 배신만 하는 전략이다. 그 밖에 수많은 전략들이 생겨날 수 있어 이 게임의 다양성은 증가된다.

다음은 대표적 전략들을 간략히 설명한 표이다.

유형
전략 이름
전략
마음씨 좋은
(nice)
항상 협력 항상 협력의 카드만 제시
두 발에 한발 갚기. 최초 협력, 상대방이 두 번 연속 배신을 하면 배신
당하면 갚는다.
(tit for tat)
최초의 카드는 협력으로 시작, 
상대가 배신을 하면 내가 배신
원한파 최초 협력, 상대가 한번 배신하면 계속 배신
간악 항상 배신 항상 배신
소박한 시험꾼
(naive prober)
최초 협력, 가끔 배신

표2. 죄수의 딜레마에서 대표적인 전략

 

이러한 게임을 '액셀로드'라는 사람이 전략을 하나의 공통 프로그램 언어로 번역하여 대형 컴퓨터로 서로 대전시켰다. 각각의 전략은 다른 모든 전략과 순차적으로 짝지어져서 반복 죄수의 딜레마 게임을 하는 것이다.

액셀로드가 인정하고 있는 가장 중요한 범주는 '마음씨 좋은(nice)'이다. 마음씨 좋은 전략은 최초로 배신하는 일이 결코 없는 것으로 정의된다. '당하면 갚는다 (tit for tat)' 가 그 일례이다. 소박한 시험꾼은 때때로 배신을 하므로 간악한 전략이다. 토너먼트에 참가한 15개의 전략 중 득점이 높은 쪽부터 상위 8위까지 모두 8개의 '마음씨 좋은(nice)' 전략이 차지하고 있다는 사실이 의미 깊다고 할 수 있다.

 

 관용

전략이란 것은 보복하는 일은 있으나 단기의 기억밖에 없다. 그것은 오래된 나쁜 일을 바로 잊어버린다. '당하면 갚는다(tit for tat)'는 하나의 관용 전략이다. 배신자에 대해 즉시 한 때 보복으로 갚고 그 후에는 과거를 씻듯이 잊는다. 하지만 원한파는 절대로 용서하지 않는다. 그 기억은 게임의 전기간을 통해 지속된다. 한 번이라도 자기에게 배신한 적이 있는 상대에 대한 원한을 결코 잊지 않는다. 원한파와 같은 전략이 프리드만(friedman)이라는 호칭으로 대전이 되었지만 게임 성적이 별로 좋지 않다.

우리는 승리하는 전략에 두 가지 특징이 있다는 것을 상정할 수 있다. 즉 '마음씨 좋기'와 관용함이다. 다시 말해, 처음부터 배신하지 않는 전략과 단기의 기억밖에 없는 관용 전략이 그것이다. 거의 유토피아적인 경향의 이 결론은 '마음씨 좋은 사람이 성공한다' 라는 문구와 비슷한 의미를 담고 있다. 윤리가 논리로써 이끌어지는 순간이다.

위와 같은 전략은 평균적이고 반복적인 전략끼리의 대전이며, 여기가 중요한 사실은 그러한 전략의 성공은 어떤 전략이 서로 대전하는가에 달려 있다라는 것이다. 다시 말해 다른 모든 전략이 '항상 배신'이면 '마음씨 좋은' 전략이 당하기만 한다. 그러므로 '최초 구성이 어떤 전략으로 구성되었는가' 라는 요소와 전략들의 구성 비율도 각각의 전략에 대한 성공, 실패에 대한 영향을 미친다.

 

 ESS(Evolutionarily stable strategy, ESS)

위에서 언급한 것처럼 각 전략의 순위는 어떤 전략이 제출되었는가에 의존한다. 가령 대부분의 전략이 간악한 것이었다면 '당하는 갚는다'는 이기지 못 했을 것이다. 바꾸어 말하면 전략의 순위가 인간의 불안정하고 자의적인 것에 의존하고 있다. ( 인간이 어떤 전략을 대전시키느냐에 따라 전략의 순위가 결정될 수 있다.) 이 자의성을 어떻게 하면 줄일 수 있을 것인가? 그것은 ESS로 해결될 수 있다. ESS라는 메이나드-스미스가 제창하고 있는 중요한 개념은 '진화적으로 안정된 전략'이라는 불리는 것이며, 여기서 전략이라는 것은 미리 프로그램되어 있는 행동 방침이다. 쉽게 말하면, 정확치는 않지만 각각의 전략을 이루는 제 1세대를 만들고, 유전자 알고리즘으로 세대를 거쳐가면서 최종적으로 살아남는 전략들이 ESS가 될 수 있다.

액셀로드는 63개의 전략을 취하여 그것을 또 다시 컴퓨터에 입력해서 그것들을 제 1세대로 만들었다. 따라서 제 1세대의 풍토는 63개의 모두의 전략을 균등히 대표하는 것으로 되어 있었다. 제 1세대의 끝에 각 전략의 승자는 돈이나 득점이 아닌 그의 부모와 동일한 전략을 취하는 후손의 수로 지불된다. 세대가 진행함에 따라 어떤 전략은 수가 적어져서 최종적으로는 절멸한다. 다른 전략은 점점 수가 많아진다. 따라서 그 비율이 변함에 따라 전략들의 대전이 일어나는 풍토(전략들의 구성 비율)도 변한 것이다. 대전의 결과는 몇 개의 전략은 최초부터 절멸로 향하고 대부분은 200세대에 가서야 절멸한다. 재미난 사실은 해링턴(Harrington)이라 불리는 간악한 전략은 최초의 150세대쯤 급격하게 상승했다. 그것은 '두 발에 한발 갚기' 등의 연약한 상대가 주위에 있는 한은 그들을 착취했다. 그 후 연약한 상대가 절멸 당하게 되면 '해링턴(Harrington)'은 그들만의 포획물이 없게 되어 그들의 뒤를 쫓아 절멸하게 됐다. 싸움터는 '당하면 갚는다'처럼 마음씨 좋은 전략의 독무대로 됐다.

진화가 거듭되어 모든 간악한 전략이 절멸에 임박하게 되면 아무리 마음씨 좋은 다른(두 발에 한발 갚기) 전략도 '당하면 갚는다(tit for tat)'와 서로 상호간에 구별하는 방법이 없어지게 된다. 왜냐하면 그것들은 모두 마음씨가 좋기 때문에 서로 협력의 카드를 내놓기 때문이다. 이런 최종적인 전략들의 구성은 ESS와 닮았지만 엄밀하게는 ESS가 아니라는 것이다. 어떤 전략이 ESS가 되려면, 그것이 희소한 돌연변이의 전략에 변경되어서는 안 된다는 것을 생각해 주기 바란다.

프로그램적인 ESS는 마음씨 좋은 전략이 우세를 점하지만, 거의 무조건인 마음씨 좋은 전략( 두발에 한발 갚기, 세발에 한발 갚기 등) 이 숨어 있게 되어, 간악한 전략의 침입에 쉽게 변할 수 있기 때문에 액설로드는 다음과 같은 결론을 내린다.

"아마도 조금 간악한 전략과 마음씨 좋은 매우 관용한 전략과 
그리고 당하면 갚는다(tit for tat)와의 전략들의 혼합으로 ESS가 구성된다"

그런 전략들이 구성된 ESS는 어떤 다른 전략이 들어와도 ESS가 쉽게 변하지 않음을 알 수 있다. 다시 말해 전략들의 진화가 안정화되었다고 볼 수 있다. 최종적인 진화 상태임을 암시한다.

이것이 인간 생활에 흔한 양상을 반영하는 거울임을 알 수 있다. 즉, 어느 정도의 간악한 사람과 '당하면 갚는다(tit for tat)'와 같은 전략을 가진 사람들이 이 세상에 우세한 이유도 죄수의 딜레마라는 게임에서 유추할 수 있다.여기서 제 나름대로의 재미난 결론은 가장 이상적인 전략은 '당하면 갚는다(tit for tat)'이라는 전략이다. 한번 상대방이 배신을 하면 바로 배신을 하는 전략이 우리의 인생을 최소의 실패율을 가져다 줄 수 있는 전략이라는 것이다. 두 번을 참아서도 안 된다. 오직 한번만이 참을 뿐이다. 대신 관용을 유지해야 한다. 상대방의 잘못은 단기 기억으로 잊어버린다. 이제부터는 이것을 내 인생 전략으로 삼을까 싶다. ㅋㅋㅋ

참고자료 : 이기적 유전자, 리처드 도킨스 지음, 홍영남 옮김, 을유 문화사, 89-324-6025-6


[출처 : http://www.gurugail.com/GeneticAlgo/page.html?subject=prisonerDilemma.html]

+ Recent posts