遗传算法求函数最大值实验
时间: 2023-06-29 15:17:22 浏览: 160
好的,遗传算法是一种基于生物进化原理的优化算法,可以用来求解函数最大值问题。下面是一个简单的实验代码,以求解函数 f(x) = x^2 + 2x + 1 在 [-5, 5] 区间内的最大值为例:
```
import random
# 定义适应度函数
def fitness(x):
return x ** 2 + 2 * x + 1
# 定义遗传算法参数
pop_size = 50 # 种群大小
chrom_len = 10 # 染色体长度
pc = 0.6 # 交叉概率
pm = 0.01 # 变异概率
max_gen = 100 # 最大迭代次数
# 初始化种群
pop = []
for i in range(pop_size):
chrom = [random.randint(0, 1) for j in range(chrom_len)]
pop.append(chrom)
# 开始迭代
for g in range(max_gen):
# 计算适应度并选择父代
fit_values = [fitness(int(''.join(map(str, chrom)), 2)) for chrom in pop]
total_fit = sum(fit_values)
parents = []
for i in range(pop_size):
r = random.uniform(0, total_fit)
for j, fit in enumerate(fit_values):
r -= fit
if r <= 0:
parents.append(pop[j])
break
# 交叉
offspring = []
for i in range(pop_size // 2):
if random.random() < pc:
p1, p2 = parents[i * 2], parents[i * 2 + 1]
pt = random.randint(1, chrom_len - 1)
c1 = p1[:pt] + p2[pt:]
c2 = p2[:pt] + p1[pt:]
offspring.append(c1)
offspring.append(c2)
else:
offspring.append(parents[i * 2])
offspring.append(parents[i * 2 + 1])
# 变异
for i in range(pop_size):
if random.random() < pm:
j = random.randint(0, chrom_len - 1)
offspring[i][j] = 1 - offspring[i][j]
# 更新种群
pop = offspring
# 输出最优解
best_chrom = max(pop, key=lambda chrom: fitness(int(''.join(map(str, chrom)), 2)))
print('最优解:', int(''.join(map(str, best_chrom)), 2))
print('最大值:', fitness(int(''.join(map(str, best_chrom)), 2)))
```
在这个实验中,我们首先定义了一个适应度函数 fitness(x),用来计算染色体对应的解 x 的适应度值。然后,我们初始化种群,设置遗传算法参数,并开始迭代。在每一代中,我们先计算每个染色体的适应度值,并根据适应度值选择父代。接着,我们进行交叉和变异操作,生成新的后代,并更新种群。迭代结束后,输出最优解和最大值。
需要注意的是,在本实验中,我们使用了二进制编码来表示染色体,因此需要进行二进制和十进制的转换。另外,本实验只是一个简单的示例,实际应用中可能需要根据具体问题进行调整和优化。
阅读全文