使用python语言用遗传算法求解f (x) = x2 的最大值,x∈ [0,31],x取整数。种群规模为70、交叉概率为0.66、变异概率取值为0.05,每行代码都要有注释,二进制长度定为5,当得到的解大于等于900时,结束,要求输出迭代过程。
时间: 2024-06-08 16:09:14 浏览: 85
首先,需要定义适应度函数,并且将解的表示方式从实数转换为二进制。在这个问题中,我们可以使用5位二进制表示整数x,那么最大值为31的二进制表示为11111。因此,我们可以定义一个函数将二进制转换为整数:
```python
def bin_to_int(binary):
return int(binary, 2)
```
然后,定义适应度函数。由于我们要求的是最大值,因此适应度函数可以简单地返回x的平方。
```python
def fitness(x):
return x**2
```
接下来,需要定义种群和个体类。每个个体都是一个二进制字符串。
```python
import random
class Individual:
def __init__(self, length):
self.genes = ''.join(random.choice('01') for _ in range(length))
self.fitness = 0
```
然后,定义遗传算法的核心函数。在每一代中,需要计算每个个体的适应度,并根据适应度进行选择、交叉和变异。选择可以使用轮盘赌算法,交叉可以使用单点交叉,变异可以随机翻转一个基因。
```python
def genetic_algorithm(population_size, crossover_rate, mutation_rate):
# 初始化种群
population = [Individual(5) for _ in range(population_size)]
# 记录迭代过程
progress = []
# 迭代直到达到目标
while True:
# 计算每个个体的适应度
for individual in population:
x = bin_to_int(individual.genes)
individual.fitness = fitness(x)
# 按照适应度进行选择
selected = []
total_fitness = sum(individual.fitness for individual in population)
for _ in range(population_size):
r = random.uniform(0, total_fitness)
for individual in population:
r -= individual.fitness
if r <= 0:
selected.append(individual)
break
# 进行交叉
offspring = []
for i in range(0, population_size, 2):
parent1 = selected[i]
parent2 = selected[i+1]
if random.random() < crossover_rate:
point = random.randint(1, 4)
child1 = Individual(5)
child2 = Individual(5)
child1.genes = parent1.genes[:point] + parent2.genes[point:]
child2.genes = parent2.genes[:point] + parent1.genes[point:]
offspring.extend([child1, child2])
else:
offspring.extend([parent1, parent2])
# 进行变异
for individual in offspring:
if random.random() < mutation_rate:
point = random.randint(0, 4)
genes = list(individual.genes)
genes[point] = '0' if genes[point] == '1' else '1'
individual.genes = ''.join(genes)
# 更新种群
population = offspring
# 记录迭代过程
best_individual = max(population, key=lambda individual: individual.fitness)
progress.append((bin_to_int(best_individual.genes), best_individual.fitness))
# 判断是否达到目标
if best_individual.fitness >= 900:
break
return progress
```
最后,调用遗传算法函数并输出迭代过程。
```python
progress = genetic_algorithm(population_size=70, crossover_rate=0.66, mutation_rate=0.05)
for i, (x, y) in enumerate(progress):
print(f'Generation {i+1}: x={x}, f(x)={y}')
```
阅读全文