자연 선택과 유전자 변형 같은 진화생물학의 원리를 컴퓨터 알고리즘으로 모방한 최적화 기법.
복잡한 문제에서 최적해 또는 근사해를 찾기 위해 사용.
유전 알고리즘은 자연 선택을 모방합니다. 다음 과정을 통해 더 좋은 해답을 점진적으로 생성합니다.
1. 초기 집단 생성 : 문제를 해결할 후보들을 초기화
2. 적합도 평가 : 각 후보 해의 품질을 측정
3. 유전자 연산 : 교배와 돌연변이를 통해 새로운 후보 생성
4. 선택 : 더 나은 해를 생존시키고, 나쁜 해를 도태
import numpy as np
# 적합도 함수
def fitness_function(x):
return -x**2 + 10 * x + 5 # 예제: 간단한 2차 함수
# 초기화
def initialize_population(size, lower_bound, upper_bound):
return np.random.uniform(lower_bound, upper_bound, size)
# 선택
def selection(population, fitness):
probabilities = fitness / fitness.sum()
return population[np.random.choice(range(len(population)), p=probabilities)]
# 교차
def crossover(parent1, parent2):
alpha = np.random.rand()
return alpha * parent1 + (1 - alpha) * parent2
# 돌연변이
def mutate(individual, mutation_rate, lower_bound, upper_bound):
if np.random.rand() < mutation_rate:
return np.random.uniform(lower_bound, upper_bound)
return individual
# 유전 알고리즘
def genetic_algorithm(iterations, population_size, lower_bound, upper_bound, mutation_rate):
population = initialize_population(population_size, lower_bound, upper_bound)
for _ in range(iterations):
fitness = np.array([fitness_function(ind) for ind in population])
new_population = []
for _ in range(len(population)):
parent1 = selection(population, fitness)
parent2 = selection(population, fitness)
child = crossover(parent1, parent2)
child = mutate(child, mutation_rate, lower_bound, upper_bound)
new_population.append(child)
population = np.array(new_population)
return population[np.argmax([fitness_function(ind) for ind in population])]
# 실행
best_solution = genetic_algorithm(100, 20, 0, 10, 0.1)
print("최적해:", best_solution)```