함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (2025)

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (1)

이 기사에서는 유전 알고리즘이 어떻게 작동하는지에 대한 아이디어를 제공하고 함수 최적화를위한 유전 알고리즘을 구현할 것입니다. 자, 시작합시다.

유전 알고리즘은 검색 기반 최적화 기술입니다. 최적 또는 가장 가까운 최적 솔루션을 찾는 데 자주 사용됩니다. John Holland가 소개했습니다. 그것은 Darwins Natural Selection Theory를 기반으로합니다. 유전 알고리즘이 어떻게 작동하는지 설명하기 전에 먼저 자연 선택에 대한 다윈의 이론을 설명하겠습니다. 그의 이론에서 그는 자연 선택을 "[특성의] 약간의 변화가 유용하다면 보존되는 원리"로 정의했다. 개념은 간단하지만 강력했습니다. 환경에 가장 잘 적응 한 개인은 생존하고 번식 할 가능성이 더 큽니다. [ Wikipedia] 때때로이 이론은 "적자 생존"으로 묘사됩니다. 다른 사람들보다 적자 인 사람들은이 진화에서 살아남을 기회가 있습니다. 유전 알고리즘은 이것에 관한 것입니다. 최상의 솔루션을 찾기 위해 자연 선택 과정을 모방합니다.

유전학에서는 인구, 염색체, 유전자, 선택, 교차, 돌연변이와 같은 생물학적 용어를 사용할 것입니다. 자, 먼저이 용어가 무엇을 의미하는지 이해하려고 노력합시다.

인구, 염색체, 유전자

이 프로세스를 시작할 때이 문제에 대한 몇 가지 가능한 솔루션을 초기화해야합니다. 모집단은 주어진 문제에 대한 가능한 모든 솔루션의 하위 집합입니다. 다른 방식으로, 우리는 인구가 염색체의 집합이라고 말할 수 있습니다. 염색체는 현재 문제에 대한 해결책 중 하나입니다. 그리고 각 염색체는 유전자의 집합입니다.

간단하게 염색체를 문자열로 설명 할 수 있습니다. 따라서 모집단은 일부 문자열의 모음이라고 말할 수 있습니다 (각 문자는 이진 값, 0 또는 1). 그리고 문자열의 각 문자는 유전자입니다.

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (2)

유전 알고리즘 과정을 시작하려면 먼저 모집단을 초기화해야합니다. 두 가지 방법으로 모집단을 초기화 할 수 있습니다. 첫 번째는 무작위이고 두 번째는 경험적입니다. 임의의 모집단으로 알고리즘을 시작하는 것이 항상 좋습니다.

피트니스 기능

모집단을 초기화 한 후이 염색체의 적합성 값을 계산해야합니다. 이제 문제는이 피트니스 함수가 ​​무엇이며 피트니스 값을 계산하는 방법입니다.

예를 들어 방정식 f (x) = -x² + 5가 있다고 가정 해 보겠습니다. 최대 값을 갖고 제약 조건이 0≤x≤31 인 해가 필요합니다.

이제 아래와 같이 4 개의 염색체로 구성된 무작위 집단이 있다고 가정 해 봅시다. 염색체의 길이는 2⁵ = 32이고 0≤x≤31이므로 5입니다.

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (3)

피트니스 함수는 문제 설명에 명시된대로 각 염색체의 기능적 값을 계산합니다.

첫 번째 염색체의 경우 01110은 정수로 14를 의미합니다. 따라서 f (x) =-(14 * 14) + 5 = -191입니다.

두 번째 염색체의 경우 10101은 정수로 21을 의미합니다. 따라서 f (x) =-(21 * 21) + 5 = -436입니다.

세 번째 염색체의 경우 00011은 정수로 3을 의미합니다. 따라서 f (x) =-(3 * 3) + 5 = -4입니다.

네 번째 염색체의 경우 10111은 정수로 23을 의미합니다. 따라서 f (x) =-(23 * 23) + 5 = -524입니다.

부모 선택

부모 선택은 피트니스 함수로 계산 된 염색체의 피트니스 값을 사용하여 수행됩니다. 이러한 피트니스 값을 기반으로 피트니스 값이 가장 높은 쌍 염색체를 선택해야합니다.

룰렛 휠 선택, 순위 선택과 같은 피트니스 계산 방법에는 여러 가지가 있습니다.

룰렛 휠 선택에서 피트니스 값이 가장 높은 염색체는 부모로 선택 될 수있는 최대 가능성을 갖습니다. 그러나이 선택 과정에서 더 낮은 것을 선택할 수 있습니다.

순위 선택에서 염색체는 체력 값을 기준으로 높은 것에서 낮은 것으로 순위가 매겨집니다. 예를 들어, 위에서 계산 한 피트니스 값에 따라 3rd> 1st> 2nd> 4th와 같이 염색체의 순위를 높게 지정할 수 있습니다. 따라서 선택 단계에서는 피트니스 함수에서 계산 된 피트니스 값을 기준으로 3 번째 및 1 번째 염색체가 선택됩니다.

크로스 오버

크로스 오버는 어린이나 자손을 생성하여 한 세대에서 다른 세대로 염색체 프로그래밍을 변경하는 데 사용됩니다. 부모 염색체는 이러한 자손 (생성 된 염색체)을 만드는 데 사용됩니다.

자손을 만들려면 단일 포인트 크로스 오버, 2 포인트 또는 멀티 포인트 크로스 오버와 같은 몇 가지 방법이 있습니다.

단일 지점 교차의 경우 먼저 지점을 선택한 다음이 지점으로 나누어 진 부분을 부모 염색체간에 교환하여 자손을 만들어야합니다. 쉽게 이해할 수 있도록 색상 조합을 사용할 수 있습니다.

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (4)

2 점 크로스 오버의 경우 2 점을 선택한 다음 비트를 교환해야합니다.

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (5)

마지막으로,이 새로운 자손이 인구에 추가됩니다.

돌연 변이

돌연변이는 인구에 다양성을 가져옵니다. Bit Flip 뮤 테이션, Swap 뮤 테이션, Inversion 뮤 테이션 등과 같은 다양한 종류의 뮤 테이션이 있습니다. 너무 간단합니다.

비트 뒤집기 변형에서 하나 이상의 비트를 선택한 다음 뒤집습니다. 선택한 비트가 0이면 1로 바꾸고 선택한 비트가 1이면 0으로 바꾸십시오.

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (6)

스왑 비트 변형에서 두 비트를 선택하고 스왑하기 만하면됩니다.

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (7)

역 변이에서는 비트를 반전하십시오.

함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (8)

함수 최적화를 위해 파이썬에서 유전 알고리즘을 구현해 봅시다.

문제 설명

방정식 f (x) = -x² + 5가 있다고 가정 해 봅시다. 최대 값이 있고 제약 조건이 0≤x≤31 인 솔루션이 필요합니다. 초기 모집단을 선택하려면 확률 0.2를 사용하십시오.

여기 에서 전체 코드를 찾을 수 있습니다 .

초기 인구

무작위 초기화는 휴리스틱 초기화보다 낫습니다. 따라서 여기서 무작위 초기화는 채우기 초기화에 사용됩니다.

#initialize populationimport randombest=-100000populations =([[random.randint(0,1) for x in range(6)] for i in range(4)])print(type(populations))parents=[]new_populations = []print(populations)

fitness 함수는 염색체의 적합성 값을 계산합니다. 피트니스 기능의 기능은 문제의 요구 사항에 따라 다릅니다.

#fitness score calculation ............def fitness_score() : global populations,best fit_value = [] fit_score=[] for i in range(4) : chromosome_value=0 for j in range(5,0,-1) : chromosome_value += populations[i][j]*(2**(5-j)) chromosome_value = -1*chromosome_value if populations[i][0]==1 else chromosome_value print(chromosome_value) fit_value.append(-(chromosome_value**2) + 5 ) print(fit_value) fit_value, populations = zip(*sorted(zip(fit_value, populations) , reverse = True)) best= fit_value[0] fitness_score()

적합한 염색체는 피트니스 점수에 따라 선택됩니다. 여기서 순위 선택 프로세스가 사용됩니다.

def selectparent(): global parents #global populations , parents parents=populations[0:2] print(type(parents)) print(parents)selectparent()

가장 적합한 부모를 선택한 후 자손을 생성하려면 크로스 오버가 필요합니다. 여기에서는 단일 포인트 크로스 오버가 사용됩니다.

def crossover() : global parents cross_point = random.randint(0,5) parents=parents + tuple([(parents[0][0:cross_point +1] +parents[1][cross_point+1:6])]) parents =parents+ tuple([(parents[1][0:cross_point +1] +parents[0][cross_point+1:6])]) print(parents)

교차가 완료된 후 한 세대에서 다른 세대로 다양성을 유지하기 위해 돌연변이가 수행됩니다. 여기에서는 단일 포인트 비트 플립 돌연변이를 사용합니다.

def mutation() : global populations, parents mute = random.randint(0,49) if mute == 20 : x=random.randint(0,3) y = random.randint(0,5) parents[x][y] = 1-parents[x][y] populations = parents print(populations)

Kaggle 에서 전체 코드를 찾을 수 있습니다.

참고 문헌

  1. 유전 알고리즘 — 돌연변이
  2. 유전 알고리즘 — 크로스 오버
  3. 유전 알고리즘-부모 선택
  4. 유전 알고리즘 — 인구 초기화
함수 최적화를위한 유전 알고리즘 및 Python 구현 소개 (2025)

References

Top Articles
Latest Posts
Recommended Articles
Article information

Author: Errol Quitzon

Last Updated:

Views: 6474

Rating: 4.9 / 5 (79 voted)

Reviews: 86% of readers found this page helpful

Author information

Name: Errol Quitzon

Birthday: 1993-04-02

Address: 70604 Haley Lane, Port Weldonside, TN 99233-0942

Phone: +9665282866296

Job: Product Retail Agent

Hobby: Computer programming, Horseback riding, Hooping, Dance, Ice skating, Backpacking, Rafting

Introduction: My name is Errol Quitzon, I am a fair, cute, fancy, clean, attractive, sparkling, kind person who loves writing and wants to share my knowledge and understanding with you.