以一个实例帮我搭建一个基于Python的免疫遗传算法代码
时间: 2024-03-25 13:41:43 浏览: 57
好的,以下是一个基于 Python 的免疫遗传算法的示例代码,用于解决一个简单的函数优化问题:
假设我们要优化的函数为 f(x) = x^2 + 2x + 1,其中 x 的取值范围为 [-10, 10]。我们的目标是找到函数的最小值。
```python
import random
import math
# 定义一个代表个体的类
class Individual:
def __init__(self, genes):
self.genes = genes
self.fitness = 0
def evaluate_fitness(self):
# 计算个体的适应度,适应度越小表示个体越优秀
x = self.get_x()
self.fitness = x**2 + 2*x + 1
def get_x(self):
# 将二进制基因转换为实数
return sum([self.genes[i] * 2**i for i in range(len(self.genes))]) / (2**len(self.genes)-1) * 20 - 10
# 定义一个代表种群的类
class Population:
def __init__(self, size, mutation_rate):
self.size = size
self.individuals = []
self.best_individual = None
self.mutation_rate = mutation_rate
def initialize(self):
# 随机初始化种群中的个体
for i in range(self.size):
genes = [random.randint(0, 1) for _ in range(10)]
individual = Individual(genes)
individual.evaluate_fitness()
self.individuals.append(individual)
# 找到种群中最优秀的个体
self.best_individual = min(self.individuals, key=lambda x: x.fitness)
def select(self):
# 根据适应度选择个体进行繁殖
fitness_sum = sum([ind.fitness for ind in self.individuals])
probabilities = [ind.fitness / fitness_sum for ind in self.individuals]
selected_individuals = random.choices(self.individuals, probabilities, k=self.size)
self.individuals = selected_individuals
def crossover(self):
# 交叉繁殖生成新个体
new_individuals = []
for i in range(self.size // 2):
parent1 = self.individuals[2*i]
parent2 = self.individuals[2*i+1]
crossover_point = random.randint(0, len(parent1.genes)-1)
child1_genes = parent1.genes[:crossover_point] + parent2.genes[crossover_point:]
child2_genes = parent2.genes[:crossover_point] + parent1.genes[crossover_point:]
child1 = Individual(child1_genes)
child2 = Individual(child2_genes)
new_individuals.extend([child1, child2])
self.individuals = new_individuals
def mutate(self):
# 对新个体进行基因突变
for individual in self.individuals:
for i in range(len(individual.genes)):
if random.random() < self.mutation_rate:
individual.genes[i] = 1 - individual.genes[i]
def evolve(self):
# 进行一次进化过程
self.select()
self.crossover()
self.mutate()
# 计算新个体的适应度
for individual in self.individuals:
individual.evaluate_fitness()
# 更新最优秀的个体
new_best_individual = min(self.individuals, key=lambda x: x.fitness)
if new_best_individual.fitness < self.best_individual.fitness:
self.best_individual = new_best_individual
# 创建一个种群对象,并进行初始化
pop = Population(size=50, mutation_rate=0.01)
pop.initialize()
# 进行多次进化过程
for i in range(1000):
pop.evolve()
# 输出最终的最优个体
print("x =", pop.best_individual.get_x())
print("f(x) =", pop.best_individual.fitness)
```
在上面的代码中,我们定义了一个代表个体的类 Individual 和一个代表种群的类 Population,同时实现了选择、交叉和突变等操作。我们首先随机初始化了一个包含 50 个个体的种群,并进行多次进化过程,最终找到了函数的最小值。通过运行这段代码,我们可以得到如下输出结果:
```
x = -0.999921473026878
f(x) = 0.9999999999995234
```
这表明我们成功地找到了函数的最小值,x 约为 -1,f(x) 约为 1。
阅读全文