상세 컨텐츠

본문 제목

100. pygad.GA Class(미완성)

공부/PyGAD

by 근성 2025. 4. 22. 21:53

본문

GA는 유전자 알고리즘을 만드는 class이다.

https://pygad.readthedocs.io/en/latest/index.html

__init__()

pygad.GA 를 인스턴스하기 위해, 생성자는 사용자가 유전 알고리즘을 다양한 유형의 애플리케이션에 맞게 사용자 지정할 수 있는 여러 매개변수를 허용한다.

pygad.GA class 생성자는 아래 파라미터들을 지원한다:

  • num_generations
    • 세대 수
  • num_parents_mating
    • 부모로써 선택되는 솔루션의 수
  • fitness_func
    • 함수/메서드를 허락하고 솔루션의 적합도를 반환한다. 함수가 통과하려면, 3개의 파라미터가 필요하다.
      • 1. pygad.GA의 인스턴스 class
      • 2. 단일 솔루션
      • 3. 밀집도의 인덱스
  • fitness_batch_size=None
    • fitness_batch_size는 batch들의 적합도들을 계산하기 위해 사용한다. 1이나 None을 입력하면 기본적으로 단일 솔루션에서 적용된다.
    • 1초과, sol_per_pop이하의 숫자로 입력한다면, 솔루션들이 fitness_batch_size 크기의 배치로 그룹화되고 각 배치에 대해 적합도 함수가 한 번 호출된다.
  • initial_population:
    • 유저가 정의한 최초의 밀집도.
    • 유저가 커스텀한 밀집도를 generation 할 때 사용.
    • sol_per_pop, num_genes 파라미터를 사용해서 만들 수 있다.
  • sol_per_pop
    • 밀집도에 대한 솔루션의 수
    • initial_population의 파라미터가 존재한다면, 아무 행동을 하지 않는다.
      • 음 initial_population 혹은 sol_per_pop 중 골라서 쓰는건가?
  • num_genes
    • 솔루션/염색체에 대한 유전자 개수.
    • 사용자가 초기 밀집도를 initial_population 매개변수로 입력하는 경우 이 매개변수는 필요하지 않다.
  • gene_type=float
    • 모든 유전자의 자료형을 지정한다.
    • 단일 자료형을 지정하면 전체 유전자에 적용되고, 리스트/튜플/numpy.ndarray 형태로 주면 각 유전자마다 개별 자료형을 설정할 수 있다.(기본값은 float)
  • init_range_low=-4
    • 초기 개체군을 무작위로 만들 때 유전자 값의 하한. (기본 -4)
    • initial_population을 사용하면 무시됨.
  • init_range_high=4
    • 초기 개체군을 무작위로 만들 때 유전자 값의 상한. (기본 -4)
    • initial_population을 사용하면 무시됨.
  • parent_selection_type="sss"
    • 부모(교배 대상) 선택 방법.
      • sss(steady‑state),
      • rws(룰렛휠),
      • sus(stochastic universal)
      • rank
      • random
      • tournament
  • keep_parents=-1
    • 다음 세대로 그대로 넘길 부모 개체 수.
    • -1(기본): 모든 부모 유지, 0: 부모 전원 제거, 양수 K: K개만 유지.
    • 단, keep_elitism이 0이 아니면 무시된다.
  • keep_elitism=1
    • 세대마다 상위 K개의 우수 개체를 다음 세대로 직접 복사.
    • 0이면 비활성. 양수 K는 K <= sol_per_pop이어야 한다.
    • 활성화되면 keep_parents가 무시된다.
  • K_tournament=3
    • tournament 선택을 쓸 때 한 토너먼트에 참가하는 개체 수. (기본 3)

교차(crossover)

  • crossover_type="single_point"
    • 교차 연산 방식:
      • single_point
      • two_points
      • uniform
      • scattered(2.9.0+).
    • 사용자 정의 함수 가능,
    • None이면 교차 단계를 건너뛰고 부모가 그대로 다음 세대에 이동.
  • crossover_probabilty=None
    • 각 부모가 교차에 참여할 확률 (0.0 ~ 1.0).
    • None 또는 지정하지 않으면 모든 부모가 교차에 참여.

돌연변이(mutation)

  • mutation_type="random"
    • 변이 방식:
      • random
      • swap
      • inversion
      • scramble
      • adaptive
    • None이면 변이 단계를 생략.
  • mutation_probability=None
    • 각 유전자가 변이에 선택될 확률 (0.0 ~ 1.0).
    • 존재하면 mutation_percent_genes 및 mutation_num_genes는 무시.
  • mutation_by_replacement=False
    • random 변이를 쓸 때 새 무작위 값으로 교체할지(True)
    • 아니면 무작위 값을 더할지(False).
  • mutation_percent_genes="default"
    • 돌연변이를 적용할 유전자 비율(%) 1 이상 100 이하.
    • mutation_probability 또는 mutation_num_genes가 있으면 무시.
  • mutation_num_genes=None
    • 변이시킬 유전자 개수. 지정 없으면 위 비율로부터 계산.
    • mutation_probability가 있으면 무시.
  • random_mutation_min_val=-1.0, random_mutation_max_val=1.0
    • random 변이에서 더하거나 교체할 무작위 값의 범위.
    • 변이 비활성 시 무시.
  • gene_space=None
    • 각 유전자(혹은 전체 유전자)의 가능 값/범위 지정.
    • 리스트, range, numpy.ndarray, 또는 {'low':a,'high':b,'step':c} 형태의 딕셔너리 지원.
    • 중첩 리스트로 유전자별 공간 지정,
    • None 값이 들어가면 해당 유전자는 init_range_*, random_mutation_* 범위 활용.

콜백 훅(hooks)

  • on_start=None
    • 유전 알고리즘이 시작되기 직전에 딱 한 번 호출될 함수/메서드 지정.
  • on_fitness=None
    • 각 세대에서 전체 개체의 적합도 계산이 끝난 직후 호출.
  • on_parents=None
    • 부모(교배 대상) 선택이 완료된 뒤 호출.
  • on_crossover=None
    • 교차 연산이 실행될 때마다 호출.
  • on_mutation=None
    • 변이 연산이 실행될 때마다 호출.
  • on_generation=None
    • 세대가 완전히 끝난 후마다 호출.
    • 함수는 ga_instance 한 개 인자만 받음.
    • 함수가 "stop" 문자열을 반환하면 즉시 실행 종료.
  • on_stop=None
    • 알고리즘이 종료되기 직전에 한 번 호출.

로깅/저장

  • save_best_solutions=False
    • generations 별 최적 해를 best_solutions 속성에 저장.
  • save_solutions=False
    • 세대별 전체 해를 solutions 속성(NumPy 배열)에 누적.
  • suppress_warnings=False
    • 경고 메시지 출력을 숨길 지 여부.
  • allow_duplicate_genes=True
    • True: 솔루션/염색체 유전자값을 복제할 수 있다.
    • False: 각자의 유전자는 유니크한 value를 가진다.
  • stop_criteria=None
    • "reach_X" 또는 "saturate_N" 형태의 문자열로 실행 중단 조건 설정.
    • reach의 예로는 적합도가 >= 40이면 진화를 중지하는 "reach_40"이 있다.
    • saturate는 주어진 세대 동안 적합도가 포화되면 진화를 중지하는 것을 의미한다. saturate의 예로는 "saturate_7"이 있는데, 이는 적합도가 7세대 연속으로 변하지 않으면 실행 () 방법을 중지하는 것을 의미한다.
  • parallel_processing=None
    • 병렬 연산 모드와 프로세스/스레드 개수 지정.
      • parallel_processing=['process', 10]
      • parallel_processing=["thread", 5]
  • random_seed=None
    • 난수 시드 고정(재현성)
  • logger=None
    • logging.Logger 인스턴스를 넘기면 모든 출력을 print 대신 logger로 기록.
    • 지정 없으면 콘솔 표준 출력.

사용자가 GA 클래스의 인스턴스를 만들 때 이러한 매개변수를 모두 지정할 필요는 없다. (휴 다행)

관심을 가져야 하는 매우 중요한 매개변수는 적합도 함수를 정의하는 fitness_func이다.

두 매개변수 init_range_lowinit_range_high의 값을 다른 매개변수보다 같거나 높거나 낮게 설정해도 괜찮다.(즉, init_range_lowinit_range_high보다 낮을 필요는 없다).

random_mutation_min_valrandom_mutation_max_val 매개변수도 동일하다.

두 매개변수 mutation_typecrossover_typeNone인 경우 유전 알고리즘이 할 수 있는 모든 유형의 진화를 비활성화한다.

따라서 유전 알고리즘은 초기 집단에서 가장 좋은 솔루션보다 더 나은 솔루션을 찾을 수 없다.

매개변수는 생성자 내에서 검증된다. 매개변수가 올바르지 않으면 예외가 적용된다.

pygad.GA class를 Plot하는 메소드

  • plot_fitness(): 세대에 의해 적합도가 얼마나 진화했는지 볼 수 있다.
  • plot_genes(): 세대별로 각 유전자값의 변화를 볼 수 있다.
  • plot_new_solution_rate(): 각 솔루션에서 탐색된 새로운 솔루션의 수를 볼 수 있다.

Class Attributes

  • supported_int_types: 정수에 대해 지원되는 유형 목록
  • supported_float_types: 실수에 대해 지원되는 유형 목록
  • supported_int_float_types: 앞선 두개의 유형을 모두 지원

Other Instance Attributes & Methods

모든 파라미터나 함수는 pygad.GA class의 어트리뷰트나 메소드로써 사용되는 pygad.GA class의 생성자를 통과한다.

아래 두 개 항목들이다.

Other Attributes

  • generations_completed: 마지막으로 완료된 세대(Generation) 번호 저장
  • population: 초기 밀집군을 담고 있는 NumPy 배열
  • valid_parameters: GA 클래스 생성자에 전달된 모든 파라미터가 유효하면 True로 설정
  • run_completed: run() 메서드가 정상적으로 끝난 뒤에만 True가 된다.
  • pop_size: 개체군(population) 크기
  • best_solutions_fitness: 세대별 최적 해의 적합도 값을 보관하는 리스트
  • best_solution_generation: 최고 적합도가 달성된 세대 번호. run() 종료 후에만 값이 할당되며, 그전에는 -1
  • best_solutions: 각 세대의 최적 해를 담은 NumPy 배열. (단, save_best_solutions=True일 때만 생성)
  • last_generation_fitness: 마지막 세대 개체들의 적합도 값
  • previous_generation_fitness: 직전 세대(population)의 적합도 값으로, 이미 평가한 해에 대해 fitness 함수를 다시 호출하지 않도록 사용
  • last_generation_parents: 마지막 세대에서 선택된 부모 개체
  • last_generation_offspring_crossover: 마지막 세대에서 교차(crossover) 후 생성된 자손
  • last_generation_offspring_mutation: 마지막 세대에서 돌연변이(mutation) 후 생성된 자손
  • gene_type_single: gene_type이 모든 유전자에 하나의 자료형으로 지정되면 True; 리스트·튜플·ndarray 등 복수 자료형이면 False
  • last_generation_parents_indices: 마지막 세대에서 선택된 부모들의 인덱스
  • last_generation_elitism: 마지막 세대에서 보존된 엘리티즘(우수 개체)이다. keep_elitism이 0보다 클 때만 활성화
  • last_generation_elitism_indices: 위 엘리티즘 개체들의 인덱스
  • logger: Python logging 모듈의 Logger 객체를 보관
  • gene_space_unpacked: gene_space 파라미터를 실제 값 목록으로 풀어낸 버전 예) range(1,5) → [1,2,3,4]. 무한 범위({'low':2,'high':4})는 제한된 표본(예: 100개)으로 전개
  • pareto_fronts: 다객체(Multi‑objective) 최적화 시 파레토 전선들을 저장하는 속성입니다.

last_generation_로 시작하는 이름을 가진 속성은 각 세대 이후에 업데이트된다는 점에 유의하자.

Other Methods

  • cal_pop_fitness(): 개체군(population) 내 모든 솔루션에 대해 fitness_func 파라미터로 전달된 함수를 호출하여 적합도(fitness)를 계산.
  • crossover(): crossover_type 속성에 지정된 교차 방식에 따라 교차 연산을 수행
  • mutation(): mutation_type 속성에 지정된 돌연변이 방식에 따라 돌연변이 연산을 수행
  • select_parents(): parent_selection_type 속성에 정의된 부모 선택 방법을 사용해 부모를 선택
  • adaptive_mutation_population_fitness(): 적응적(adaptive) 돌연변이에서 솔루션을 필터링할 때 사용되는 평균 적합도 값을 반환
  • summary(): Keras 스타일로 PyGAD의 라이프사이클 요약 정보를 출력하여 아키텍처를 한눈에 확인

run_ 접두어가 붙은 4가지 메서드

run() 메서드 내부의 주요 반복 루프를 깔끔하게 유지하기 위해 세부 로직을 다음 4개의 메서드로 분리.

보통 이름이 run_으로 시작하는 메서드는 PyGAD가 run() 내부에서 호출하도록 설계되었다.

  • run_select_parents(call_on_parents=True)
    • 부모를 선택하고, on_parents() 콜러블이 정의되어 있으면 호출합니다.
    • call_on_parents가 True이면 on_parents() 호출
    • run()이 끝난 뒤 부모 정보를 갱신할 때 호출할 경우에는 False로 설정해야 합니다.
  • run_crossover()
    • 교차 연산을 수행하고, on_crossover() 콜러블이 정의되어 있으면 호출합니다.
  • run_mutation()
    • 돌연변이 연산을 수행하고, on_mutation() 콜러블이 정의되어 있으면 호출합니다.
  • run_update_population()
    • 교차와 돌연변이 과정을 마친 후 population 속성을 새 개체군으로 업데이트합니다.

initialize_population()

NumPy 배열로써 랜덤하게 최초 밀집도를 생성한다.

population 어트리뷰트로 저장된다.

아래 파라미터들을 허용한다.

  • low: 초기 집단에서 유전자 값이 선택되는 무작위 범위의 낮은 값이다. 기본값은 -4이다.
  • high: 초기 집단에서 유전자 값이 선택되는 무작위 범위의 상한 값입니다. 기본값은 -4입니다.

이 메소드는 3개의 어트리뷰트의 값을 할당한다.

  1. pop_size: 집단의 크기
  2. population: 처음에는 초기 인구를 보유하고 나중에는 각 세대 이후에 업데이트된다.
  3. initial_population: 최초의 집단을 유지한다.

cal_pop_fitness()

계산하고 현재 집단에서 솔루션의 적합한 값을 반환한다.

호출 횟수를 줄여 시간을 절약하도록 최적화되어 있다.

과정은 아래와 같다.

  1. save_solutions 매개변수가 True로 설정되면 솔루션 인스턴스 속성에서 solutions가 이미 탐색되어 저장되어 있는지 확인한다. 그렇다면 적합성 함수를 호출하지 않고 solution_fitness 인스턴스 속성에서 적합성을 검색하기만 하면 된다.
  2. save_solutionsFalse로 설정되었거나 아직 솔루션이 탐색되지 않은 경우, cal_pop_fitness() 메서드는 keep_elitism 매개변수가 양의 정수로 설정되어 있는지 확인한다. 그렇다면 솔루션이 last_generation_elitism 인스턴스 속성에 저장되어 있는지 확인한다. 그렇다면 previous_generation_fitness 인스턴스 속성에서 적합성을 가져온다.
  3. 아래 세 가지 조건 중 어느 것도 적용되지 않는 경우
    • 1. save_solutionsFalse로 설정되어 있거나
    • 2. True이지만 아직 솔루션이 탐색되지 않았거나
    • 3. keep_elitism0으로 설정되어 있는 경우

cal_pop_fitness() 메서드는 keep_pather 매개변수가 -1 또는 양의 정수로 설정되어 있는지 확인한다.

그렇다면 솔루션이 last_generation_pather 인스턴스 속성에 저장되어 있는지 확인한다.

그렇다면 previous_generation_fitness 인스턴스 속성에서 적합성을 가져온다.

4. 위의 4가지 조건 중 어느 것도 적용되지 않는 경우 솔루션의 적합도를 계산하기 위해 적합도 함수를 호출해야한다. 이는 적합도_func 매개변수에 할당된 함수를 호출하는 것이다.

이 함수는 고려됩니다:

parallel_processing는 병렬 처리가 효과적인지 확인하기 위한 매개변수이다.

fitness_batch_size는 적합도를 여러 해로 나누어 계산해야 하는지 확인하기 위한 매개변수이다.

run()

유전 알고리즘을 실행한다.

유전 알고리즘이 일부 세대를 거쳐 진화하는 주요 방법이다.

인스턴스를 사용하여 모든 요구 사항에 액세스하기 때문에 매개변수가 없다.

각 세대에 대해, 모집단 내 모든 솔루션의 적합도 값은 각 솔루션에 대해 pygad.GA 클래스 생성자의 fitness_func 매개변수에 할당된 함수를 내부적으로 호출하는 cal_pop_fitness() 방법에 따라 계산된다.

모든 솔루션의 적합도 값에 따라 부모는 select_parents() 방법을 사용하여 선택된다.

이 방법의 동작은 pygad.GA 클래스 생성자의 parent_selection_type 매개변수에서 부모 선택 유형에 따라 결정된다.

선택된 부모를 기반으로 crossover()mutation() 방법을 사용하여 교차 및 돌연변이 연산을 적용하여 자손을 생성.

이러한 두 가지 방법의 동작은 pygad.GA 클래스 생성자의 crossover_typemutation_type 매개변수에 따라 정의된다.

세대가 완료되면 아래와 같은 일이 발생한다.

  • population 어트리뷰트는 새로운 population에 의해 업데이트된다.
  • generations_completed 어트리뷰트는 마지막으로 완료된 생성의 수에 따라 할당된다.
  • 만약 on_generation 어트리뷰트에 콜백 함수가 할당되어 있다면, 그 함수는 호출될 것이다.

run() 메서드가 완료되면 다음과 같은 작업을 수행한다.:

  • best_solution_generation에는 최적 적합도 값에 도달하는 세대 번호가 할당된다.
  • run_completed 어트리뷰트는 True로 설정됩니다.

부모 선택 메서드

pygad.utils.parent_selection 모듈 내부의 ParentSelection 클래스는 자손을 생성할 여러가지의 메서드가 있다.

모든 메서드에는 아래의 파라미터가 있다.

  • fitness: 현재 집단에서의 솔루션에 대한 적합한 값
  • num_parents: 선택될 부모 수

모든 메서드들은 선택된 부모의 배열을 반환한다.

아래는 부모 선택 메서드들이다.

steady_state_selection()

steady_state selection의 방법으로 부모를 선택한다.

rank_selection()

rank selection 기법대로 부모를 선택한다.

random_selection()

랜덤하게 부모를 선택한다.

tournament_selection()

tournament selection 기법대로 부모를 선택한다.

roulette_wheel_selection()

roulette_wheel selection 기법대로 부모를 선택한다.

stochastic_universal_selection()

stochastic_universal 기법대로 부모를 선택한다.

nsga2_selection()

다목적 최적화 문제를 해결하기 위해 NSGA-II 알고리즘의 부모를 선택한다.

비지배적 정렬 및 군집 거리를 기준으로 순위를 매겨 부모를 선택한다.

tournament_selection_nsga2()

다목적 최적화 문제를 해결하기 위해 NSGA-II 알고리즘의 부모를 선택한다.

비지배적 정렬 및 혼잡 거리를 기반으로 적용된 tournament selection 기법을 사용하여 부모를 선택한다.


Crossover 메서드

pygad.utils.crossover 모듈안에 있는 Crossover클래스는 선택된 부모들 사이에서 crossover를 적용하기 위해 도움을 주는 메서드들이 있다. 모든 메서드들은 아래 파라미터들이 존재한다.

  • parents: 자손을 생산하기 위한 부모
  • offspring_size: 생산 할 자식의 크기

모든 메서드들은 생산된 자식을 array형태로 반환한다.

single_point_crossover()

부모 쌍 사이에서 교차가 발생하는 지점을 무작위로 선택한다.

 

two_point_crossover()

부모 쌍 사이에서 교차가 발생하는 지점을 무작위로 두 개 선택한다.

 

uniform_crossover()

각 유전자에 대해 짝짓기 부모 2명 중 부모를 무작위로 선택하여 유전자를 복사한다.

 

scattered_crossover()

두 부모 중 한 명으로부터 유전자를 무작위로 선택한다.


Mutation 메서드

pygad.utils.mutation 모듈안에 있는 Mutation클래스는 mutation 적용하기 위해 도움을 주는 메서드들이 있다. 모든 메서드들은 아래 파라미터들이 존재한다.

  • offspring: mutation 시킬 자손

모든 메서드들의 반환값은 돌연변이가 된 자손의 array이다.

 

random_mutation()

일부 유전자의 값을 무작위로 변경하는 무작위 돌연변이를 적용한다. 유전자 수는 mutation_num_genes 또는 mutation_percent_genes 속성에 따라 지정된다.

각 유전자에 대해 random_mutation_min_val 및 random_mutation_max_val 속성으로 지정된 범위에 따라 무작위 값이 선택된다. 무작위 값은 선택된 유전자에 추가된다.

swap_mutation()

무작위로 선택된 두 유전자의 값을 교환한다.

inversion_mutation()

유전자의 하위 집합을 선택하고 이를 반전시킨다.

scramble_mutation()

유전자의 하위 집합을 선택하고 무작위로 순서를 바꾼다.

adaptive_mutation()

솔루션의 적합도에 따라 돌연변이를 일으킬 유전자의 수/비율을 선택합니다. 적합도가 높으면 적합도가 낮은 솔루션에 비해 적은 수/비율의 유전자가 돌연변이를 일으킨다.

 


best_solution()

유전 알고리즘이 찾은 최상의 솔루션을 반환한다.
다음 매개변수를 사용한다.
pop_fitness=none: 모집단의 솔루션 적합도 값 목록을 허용하는 선택적 매개변수이다. 만약 None 이면, cal_pop_fitness() 방법을 호출하여 모집단의 적합도 값을 계산합니다.

 

아래를 반환한다.
best_solution: 현재 밀집도에서 최고의 솔루션.
best_solution_fitness: 최고의 솔루션의 적합도.
best_match_idx: 현재 모집단에서 최적합 솔루션의 인덱스.

 

 

plot_fitness()

이전에 plot_result()는 세대별로 적합도 값이 어떻게 변화하는지 요약한 도형을 생성, 표시 및 반환한다.
최소 1세대를 거쳐야 동작한다. 세대가 완료되지 않은 경우(최소 1세대) 예외가 적용된다.

plot_new_solution_rate()

plot_new_solution_rate() 는 각 세대에서 탐색한 새로운 솔루션의 수를 보여주는 그림을 생성, 표시 및 반환한다.

이 방법은 pygad.GA 클래스의 생성자에서 save_solutions=True일 때만 작동합니다.
최소 1세대를 거쳐야 동작한다. 세대가 완료되지 않은 경우(최소 1세대) 예외가 적용된다.

plot_genes()

각 유전자를 설명하는 도형을 생성, 표시 및 반환한다.

도형을 생성하는 데 도움이 되는 옵션이 있다:

    1. 정규 그래프를 만들어 각 세대의 유전자 값 관찰.
    2. 각 유전자에 대한 히스토그램.
    3. 상자 그림.

이것은 graph_type 매개변수에 의해 제어된다.
최소 1세대를 거쳐야 동작한다. 세대가 완료되지 않은 경우(최소 1세대) 예외가 적용된다.

save()

유전자 알고리즘의 인스턴스를 저장한다.

아래 파라미터를 사용한다.

  • filename: 인스턴스를 저장할 파일 이름

Functions in pygad

pygad.GA 클래스에서 사용할 수 있는 메서드 외에도 pygad에서 사용할 수 있는 함수를 알아보자.

지금 버전은 load()라는 함수만 존재한다.

 

pygad.load()

저장된 유전자 알고리즘의 인스턴스를 불러온다.

pygad.load(filename) 이렇게 사용하면 되고, filename은 경로겠지?

 

불러온 유전자 알고리즘의 인스턴스를 반환한다.

 

Steps to use pygad

pygad 모듈을 사용하려면, 아래 단계를 만족해야한다.

  1. Preparing the fitness_func parameter.
  2. Preparing Other Parameters.
  3. Import pygad.
  4. Create an Instance of the pygad.GA Class.
  5. Run the Genetic Algorithm.
  6. Plotting Results.
  7. Information about the Best Solution.
  8. Saving & Loading the Results.

각 단계별로 자세히 알아보자.

1. Preparing the fitness_func Parameter

 

댓글 영역