코딩코딩/알고리즘

[유전 알고리즘, GA] #1 초기 population 생성하기 (generate initial population)

g0n1 2020. 11. 23. 22:56
728x90

코드: github.com/gon2gon2/lecture/blob/master/GA/initial_population.ipynb

 

gon2gon2/lecture

Contribute to gon2gon2/lecture development by creating an account on GitHub.

github.com

영상 해설: www.youtube.com/redirect?q=https%3A%2F%2Fg0n1.tistory.com%2F108&event=video_description&v=-BVaM3no590&redir_token=QUFFLUhqbVU4SFVxY1didzhPQUVLSjZLY1JObVhkcVVLUXxBQ3Jtc0tsbkRsNHZJU0ozcDcwclJtWDgwbTN4Y3dLMGJEaXNTM2pMa3Q5TFBDeGYtakpjcFJNQmtNei0wd09PUFd1UFVEWjIzU3pZQV9NU0NPeDNVS0dsMHBMcHZETElTZm4yY2JEYm1fWllBcDBGQnVKWEtzOA%3D%3D

 

YouTube

 

www.youtube.com

1. 필수 개념

Population

한 generation의 총 인구수

Generation

한 세대, 가능해들의 집합

Chromosome

gene으로 구성된, generation의 구성원 == 가능해

Gene

Chromosome을 구성하는 최소단위, 유전자


2. 논리

그럼 초기 population을 생성하는 로직은 다음과 같습니다.

여기서는 gene을 7개, population을 10이라고 하겠습니다. (gene의 값은 1~100사이의 난수)

 

1. gene을 랜덤으로 생성한다.

2. gene을 7개 이어붙여서 chromosome을 만든다.  (1을 7번 반복한다)

3. chromosome을 10번 만든다. (2를 10번 반복한다)


코드 구현

패키지 호출 (Numpy? Random?)

import numpy
numpy.random.randint(min, max, size=n) # 값이 가지는 범위를 넣어주고, 몇개나 생성할지 입력가능


# 위 문제에서는 다음과 같이 쓰면 편할 것입니다.
numpy.random.randint(1,100,7)

 

 

랜덤한 수를 발생시키기 위해 저는 numpy를 쓰겠습니다. random을 쓰셔도 됩니다.

패키지는 ppt의 템플릿이라고 생각하시면 됩니다.

발표자료를 처음부터 끝까지 손으로 레이아웃을 다 짜서 만들 수도 있지만, 전문가가 만들어둔 템플릿을 쓰는 것이 훨씬 효율적이고 편하고 강력합니다. 우리는 numpy 템플릿을 불러와서 그 안에서 "numpy.random.randint()"라는 슬라이드를 쓰겠습니다.

그 안에는 원하시는 값의 최저값, 최대값, 추출할 표본의 수를 써주시면 되는데, "추출할 표본의 수"라는 값은

size=를 쓰고 써주셔야 합니다. 파라미터라고 하는 것인데, 멋대로 바꿀 수는 없습니다.

레이아웃을 따라주세요!


Chromosome 만들기

pop = []

for i in range(population): # population의 수만큼 반복된다.
	
    # 랜덤한 난수를 chromosome 변수에 저장합니다.
	chromosome = numpy.random.randint(0,100,size=7)

	#pop에 chromosome을 저장합니다.
	pop.append(chromosome)

pop이라는 빈 리스트를 만듭니다.

pop이라는 마을에 chromosome이라고 불리는 사람을 하나씩 넣어준다고 이해할 수 있겠죠?

 

7개의 난수로 구성된 chromosome을 append함수를 통해 pop에 저장해줍니다.

 

x라는 리스트에 y라는 원소를 더해주고 싶다면, 

x.append(y)

이라고 쓸 수 있습니다. 이건 외우세요 ㅋㅋ


함수화

# minimum: gene이 가질 수 있는 최솟값
# maximum: gene이 가질 수 있는 최댓값
# gene: chromosome이 가지는 gene의 갯수
# population: 한 generation이 가지는 인구 수
import numpy

def initial_population(population, gene, minimum, maximum):
	pop = []
	for i in range(gene):
    	chromosome = numpy.random.randint(minimum, maximum, size = gene)
        pop.append(chromosome)
        
	return pop

이렇게 함수로 만들면

gene의 최솟값, 최댓값,

chromosome이 갖는 gene의 갯수, 

한 generation의 population 수

이렇게 총 4가지 값만 알면 어떤 문제에든 초기 population을 생성할 수 있을 것입니다.

 

다음 시간에는 fitness function과 사용자 정의 함수에 대해 자세히 알아보도록 하겠습니다.

728x90