import numpy as np
# 目标函数
def fitness(x):
return x**2 - 4*x + 4
# 初始种群大小
pop_size = 100
# 种群染色体长度(即解的精度)
chromosome_length = 10
# 变异概率
mutation_rate = 0.01
# 最大迭代次数
max_iter = 1000
# 创建初始种群
pop = np.random.randint(0, 2, (pop_size, chromosome_length))
for generation in range(max_iter):
# 评估当前种群适应度
fitness_values = np.array([fitness(np.binary_repr(x, width=chromosome_length)[::-1]).sum() for x in pop])
# 选择最适应的染色体进行繁殖
parents_indices = np.random.choice(np.arange(pop_size), size=pop_size, replace=True, p=fitness_values/fitness_values.sum())
parents = pop[parents_indices]
# 通过交叉和变异产生新一代
offspring = np.empty((pop_size, chromosome_length))
for i in range(pop_size):
# 随机选择两个父母进行交叉
parent1 = parents[np.random.randint(0, pop_size)]
parent2 = parents[np.random.randint(0, pop_size)]
crossover_point = np.random.randint(1, chromosome_length-1)
offspring[i, :crossover_point] = parent1[offspring[i, :crossover_point].astype(int)]
offspring[i, crossover_point:] = parent2[offspring[i, crossover_point:].astype(int)]
# 对新个体进行变异
for j in range(chromosome_length):
if np.random.rand() < mutation_rate:
offspring[i, j] = 1 if offspring[i, j] == 0 else 0
pop = offspring
# 输出最优解的染色体和适应度值
best_fitness_index = np.argmax(fitness_values)
best_solution = np.binary_repr(pop[best_fitness_index, :], width=chromosome_length)[::-1].astype(int)
print(f"Best solution: {best_solution}, Fitness: {fitness(best_solution)}")
遗传算法求解最值 用于理解遗传算法的工作原理
最新推荐文章于 2023-11-09 11:51:45 发布