ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 최적설계 | 파이썬 기반 유전 알고리즘 pygad.GA
    Engineering/Optimum Design 2026. 1. 2. 18:00
    반응형

    1. PyGAD

       PyGAD는 유전 알고리즘을 기반으로 다양한 최적화 기능을 제공하는 파이썬 오픈소스 패키지이다. 다양한 재생·교차·변이 프로토콜을 제공하며, 머신러닝·딥러닝 라이브러리인 Keras나 PyTorch와도 연동하여 사용할 수 있다. 해당 패키지는 아래 명령어를 명령 프롬프트에 입력하여 설치할 수 있으며, 아래 링크로 접속하면 PyGAD 패키지에 대한 자세한 설명을 확인할 수 있다.

    pip install pygad
     

    GitHub - ahmedfgad/GeneticAlgorithmPython: Source code of PyGAD, a Python 3 library for building the genetic algorithm and train

    Source code of PyGAD, a Python 3 library for building the genetic algorithm and training machine learning algorithms (Keras & PyTorch). - ahmedfgad/GeneticAlgorithmPython

    github.com

     

    2. pygad.GA

       PyGAD는 유전 알고리즘 인스턴스를 생성하면서 재생·교차·변이에 대한 속성을 설정하는 것으로 시작한다. 대부분의 속성은 기본값이 이미 할당되어 있으나, 인스턴스 생성을 위해 반드시 정의해야 하는 속성만을 정리하면 아래와 같다. 해당 변수들에 어떤 값을 할당하느냐에 따라 유전 알고리즘의 성능과 결과가 달라지므로 경험을 기반으로 적절하게 조정하는 것이 중요하다.

    ●  반복 수행의 수 (num_generations)
      다음 단계로 복사할 설계대안의 수 (num_parents_mating)
      적합성 함수 (fitness_func)
      한 단계에서 생성할 설계대안의 수 (sol_per_pop)
      설계변수의 수 (num_genes)

     

       위 필수 속성 외에 사용자 편의에 맞게 할당하면 편리한 속성들을 나열하면 아래와 같다. 해당 속성들은 이미 기본값이 할당되어 있기 때문에 새로운 값을 할당할 필요는 없지만, 유전 알고리즘을 이용하여 다양한 최적화 문제를 풀이하고자 한다면 알아두도록 하자.

    ○  첫 단계에서 생성할 설계변수의 하한값 (init_range_low = -4)
    ○  첫 단계에서 생성할 설계변수의 상한값 (init_range_high = 4)
    ○  다음 단계로 복사할 설계대안 선택 방법 (parent_selection_type = "sss")
    ○  설계대안 교차 방법 (crossover_type = "single_point")
    ○  설계대안 변이 방법 (mutation_type = "random")
    ○  설계대안 변이 확률 (mutation_percent_genes = "default")
    ○  각 설계변수 값의 범위 (gene_space = None)

     

    3. 적합성 함수 정의

       유전 알고리즘 인스턴스의 적합성 함수 속성에는 적합성 함수에 대한 정보를 담은 사용자 정의 함수를 할당한다. 이때 해당 함수에는 세 개의 위치 매개변수를 할당해야 하는데, 첫 번째 매개변수는 유전 알고리즘 인스턴스(ga_instance)를, 두 번째 매개변수는 설계변수 리스트(solution)를, 마지막 매개변수는 반복 수행 단계에서 선택할 설계대안 인덱스(solution_idx)를 전달인자로 할당받도록 정의해야 한다. 또한 함수를 종료할 때는 적합성 함수의 값을 반환해야 한다. 해당 함수 내부에서는 설계변수에 따라 적합성 함수의 값을 계산하도록 프로그램을 작성한다.

     

    4. 벌칙 함수 정의

       유전 알고리즘은 다른 최적화 알고리즘과는 다르게 제약조건을 고려하지 않는다. 따라서 만약 제약조건이 있는 최적화 문제를 유전 알고리즘으로 풀고자 한다면, 적합성 함수를 목적 함수와 제약조건을 중첩한 벌칙 함수(penalty function) 형태로 나타낸다. 다음과 같은 최적화문제를 고려해보자.

     

    $$ \begin{align} \mathrm{minimize}~~~~&f \left( \mathbf{x} \right) \\\\ \mathrm{subject~to}~~~~ &\mathbf{g}\left( \mathbf{x} \right) \leq 0 \\\\ &\mathbf{h}\left( \mathbf{x} \right) = 0 \end{align}$$

     

       위와 같이 등호제약조건과 부등호제약조건을 가진 최소화 문제에 대하여 벌칙 함수를 정의하면 아래와 같다. 각 제약조건 앞에 있는 가중치 계수를 조정하여 제약조건을 만족해야 하는 엄밀한 정도를 조정할 수 있으며, 승수를 1이 아닌 2 이상으로 설정할 경우 목적 함수에 더 강한 제약을 부과할 수 있다. 너무 강한 제약을 부과할 경우 유전 알고리즘이 전역적 해에 도달하지 못하고 종료될 수 있으니 주의하자.

     

    $$ \begin{align} \overline{f}\left( \mathbf{x} \right) = f\left( \mathbf{x} \right) + \sum_{i=1}^{m}u_i\cdot\mathrm{max}\left(0,g_i\left( \mathbf{x} \right)\right)^k + \sum_{j=1}^{n}v_j\left | h_j\left( \mathbf{x} \right)\right |^k \end{align}$$

     

       유전 알고리즘은 적합성 함수를 최대화하는 방향으로 동작하므로, 위와 같은 벌칙 함수를 적합성 함수로 이용하고자 한다면 다음과 같이 적합성 함수를 정의해야 한다.

     

    $$ \begin{align} F\left( \mathbf{x} \right) = -\overline{f}\left( \mathbf{x} \right) \end{align}$$

     

    5. 예제

       다음과 같은 최적화 문제를 유전 알고리즘을 이용해 풀이해보자.

     

    $$ \begin{align} \mathrm{minimize}~~~~&f = \left( x_1-3 \right)^2 + \left( x_2-3 \right)^2 \\\\ \mathrm{subject~to}~~~~&x_1 + x_2 \leq 4 \\\\ &x_1 - 3x_2 = 1 \\\\ &x_1 \geq 0,~~x_2 \geq 0 \end{align}$$

     

    # 라이브러리 추가
    import pygad
    
    # 단계 종료마다 실행할 함수 정의
    def on_gen_callback(ga_instance):
        print(f'Generation : {ga_instance.generations_completed}')
    
    # 적합성 함수 정의
    def fitness_func(ga_instance, solution, solution_idx):
        x1, x2 = solution
        obj_value = -((x1-3)**2 + (x2-3)**2)
        penalty_coef = 1000
        penalty1 = max(0, x1+x2-4)**2
        penalty2 = abs(x1-3*x2-1)**2
        penalty = penalty_coef * (penalty1 + penalty2)
        fitness = obj_value - penalty
        return fitness
    
    # 적합성 함수 할당
    fitness_function = fitness_func
    
    # 설계변수 범위 정의
    gene_space = [{'low': 0, 'high': 10},
                  {'low': 0, 'high': 10}]
    
    # 유전자 알고리즘 인스턴스 생성
    ga_instance = pygad.GA(num_generations=1000,
                           num_parents_mating=125,
                           fitness_func=fitness_function,
                           sol_per_pop=500,
                           num_genes=len(gene_space),
                           gene_space=gene_space,
                           on_generation=on_gen_callback
                           )
    
    # 유전자 알고리즘 실행
    ga_instance.run()
    
    # 유전자 알고리즘 결과 출력
    solution, solution_fitness, solution_idx = ga_instance.best_solution()
    print(f"Parameters of the best solution : {solution}")
    print(f"Fitness value of the best solution = {solution_fitness}")
    print(f"Optimized value of the best solution = {(solution[0]-3)**2 + (solution[1]-3)**2}")
    print(f"Index of the best solution : {solution_idx}")
    if ga_instance.best_solution_generation != -1:
        print(f"Best fitness value reached after {ga_instance.best_solution_generation} generations.")
    
    # 유전자 알고리즘 실행 결과 저장
    filename = 'genetic'
    ga_instance.save(filename=filename)
    
    # 유전자 알고리즘 결과 불러오기
    loaded_ga_instance = pygad.load(filename=filename)

     

     

     

     

     

    [함께 읽으면 좋은 페이지]

     

     

    파이썬이란?

    1. 프로그래밍 언어 컴퓨터가 작업을 수행하기 위해서는 논리적인 순서에 맞게 명령문이 나열된 작업지시서를 사람으로부터 전달 받아야 한다. 하지만 컴퓨터는 0과 1로 구성된 기계어(machine lang

    vedacube.tistory.com

     

    최적설계 | 자연 영감 탐색법(1): 유전 알고리즘 GA

    1. 자연 영감 탐색법 자연 영감 탐색법은 임의의 초기 설계점을 시작으로 확률적으로 최적점으로 접근하는 방법이다. 지금까지 다룬 방법론과는 다르게 국소 최소점이 아닌 전역 최소점으로 수

    vedacube.tistory.com

     

     

     

     

     

    참고문헌

    - Arora, J. S. (2016). Introduction to optimum design. Elsevier.

    - PyGAD - Python Genetic Algorithm!. (n.d.). https://pygad.readthedocs.io/en/latest/. 2025.06.26.

    반응형

    댓글

Designed by Tistory.