遗传算法Python代码
时间: 2023-12-25 12:28:35 浏览: 24
以下是一个简单的遗传算法Python代码示例:
```python
import random
# 适应度函数
def fitness(individual):
# 计算个体的适应度值
return sum(individual)
# 生成初始种群
def generate_population(population_size, individual_size):
population = []
for i in range(population_size):
individual = [random.randint(0, 1) for _ in range(individual_size)]
population.append(individual)
return population
# 选择操作
def selection(population):
# 选择两个个体
return random.sample(population, 2)
# 交叉操作
def crossover(individual1, individual2):
# 随机选择交叉点
crossover_point = random.randint(1, len(individual1) - 1)
# 交叉
new_individual1 = individual1[:crossover_point] + individual2[crossover_point:]
new_individual2 = individual2[:crossover_point] + individual1[crossover_point:]
return new_individual1, new_individual2
# 变异操作
def mutation(individual, mutation_rate):
for i in range(len(individual)):
if random.random() < mutation_rate:
individual[i] = 1 - individual[i]
return individual
# 遗传算法主函数
def genetic_algorithm(population_size, individual_size, mutation_rate, generations):
# 生成初始种群
population = generate_population(population_size, individual_size)
for generation in range(generations):
# 计算种群中每个个体的适应度值
fitnesses = [fitness(individual) for individual in population]
# 选择两个个体
individual1, individual2 = selection(population)
# 交叉
new_individual1, new_individual2 = crossover(individual1, individual2)
# 变异
new_individual1 = mutation(new_individual1, mutation_rate)
new_individual2 = mutation(new_individual2, mutation_rate)
# 计算新个体的适应度值
new_fitness1 = fitness(new_individual1)
new_fitness2 = fitness(new_individual2)
# 替换种群中适应度值最低的两个个体
min_fitness_index = fitnesses.index(min(fitnesses))
if new_fitness1 > new_fitness2:
population[min_fitness_index] = new_individual1
else:
population[min_fitness_index] = new_individual2
# 返回适应度值最高的个体
return max(population, key=fitness)
# 示例
individual_size = 10
population_size = 100
mutation_rate = 0.01
generations = 100
result = genetic_algorithm(population_size, individual_size, mutation_rate, generations)
print(result)
```