下面是关于“Python优化算法之遗传算法案例代码”的完整攻略。
1. 遗传算法简介
遗传算法是一种基于自然选择和遗传学原理的优化算法,它通过模拟自然界中的进化过程,从而实现对问题的优化。遗传算法的基本思想是将问题转化为染色体编码,然后通过交叉、变异等操作,不断优化染色体,从而得到最优解。
2. Python实现遗传算法
在Python中,我们可以使用 DEAP
库实现遗传算法。下面是一个使用遗传算法优化函数的示例:
import random
from deap import base, creator, tools
# 定义目标函数
def func(x):
return x**2 - 3*x + 4
# 定义适应度函数
def eval_func(individual):
return func(individual[0]),
# 定义个体和种群
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, -10, 10)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# 定义遗传算法操作
toolbox.register("evaluate", eval_func)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1)
toolbox.register("select", tools.selTournament, tournsize=3)
# 定义遗传算法主函数
def main():
pop = toolbox.population(n=50)
CXPB, MUTPB, NGEN = 0.5, 0.2, 50
for g in range(NGEN):
offspring = toolbox.select(pop, len(pop))
offspring = list(map(toolbox.clone, offspring))
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if random.random() < CXPB:
toolbox.mate(child1, child2)
del child1.fitness.values
del child2.fitness.values
for mutant in offspring:
if random.random() < MUTPB:
toolbox.mutate(mutant)
del mutant.fitness.values
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
pop[:] = offspring
fits = [ind.fitness.values[0] for ind in pop]
best_ind = tools.selBest(pop, 1)[0]
print("Generation:", g, "Best:", best_ind, "Fitness:", best_ind.fitness.values[0])
if __name__ == "__main__":
main()
在这个示例中,我们定义了一个目标函数 func(x)
,并将其作为适应度函数 eval_func(individual)
的输入。我们使用 creator
模块定义了个体和种群,并使用 toolbox
模块注册了遗传算法操作。我们使用 population()
函数初始化种群,并使用 select()
、mate()
、mutate()
函数进行遗传算法操作。最后,我们使用 main()
函数执行遗传算法,并输出每一代的最优解和适应度值。
下面是另一个使用遗传算法优化函数的示例:
import random
from deap import base, creator, tools
# 定义目标函数
def func(x):
return x**2 - 3*x + 4
# 定义适应度函数
def eval_func(individual):
return func(individual[0]),
# 定义个体和种群
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, -10, 10)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# 定义遗传算法操作
toolbox.register("evaluate", eval_func)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1)
toolbox.register("select", tools.selTournament, tournsize=3)
# 定义遗传算法主函数
def main():
pop = toolbox.population(n=50)
CXPB, MUTPB, NGEN = 0.5, 0.2, 50
for g in range(NGEN):
offspring = toolbox.select(pop, len(pop))
offspring = list(map(toolbox.clone, offspring))
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if random.random() < CXPB:
toolbox.mate(child1, child2)
del child1.fitness.values
del child2.fitness.values
for mutant in offspring:
if random.random() < MUTPB:
toolbox.mutate(mutant)
del mutant.fitness.values
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
pop[:] = offspring
fits = [ind.fitness.values[0] for ind in pop]
best_ind = tools.selBest(pop, 1)[0]
print("Generation:", g, "Best:", best_ind, "Fitness:", best_ind.fitness.values[0])
if __name__ == "__main__":
main()
在这个示例中,我们同样定义了一个目标函数 func(x)
,并将其作为适应度函数 eval_func(individual)
的输入。我们使用 creator
模块定义了个体和种群,并使用 toolbox
模块注册了遗传算法操作。我们使用 population()
函数初始化种群,并使用 select()
、mate()
、mutate()
函数进行遗传算法操作。最后,我们使用 main()
函数执行遗传算法,并输出每一代的最优解和适应度值。
3. 示例说明
下面是两个使用遗传算法优化函数的示例:
3.1 遗传算法优化Rastrigin函数
import random
from deap import base, creator, tools
# 定义目标函数
def rastrigin(x):
return 10 * len(x) + sum([xi**2 - 10 * math.cos(2 * math.pi * xi) for xi in x])
# 定义适应度函数
def eval_func(individual):
return rastrigin(individual),
# 定义个体和种群
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, -5.12, 5.12)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=10)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# 定义遗传算法操作
toolbox.register("evaluate", eval_func)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1)
toolbox.register("select", tools.selTournament, tournsize=3)
# 定义遗传算法主函数
def main():
pop = toolbox.population(n=50)
CXPB, MUTPB, NGEN = 0.5, 0.2, 50
for g in range(NGEN):
offspring = toolbox.select(pop, len(pop))
offspring = list(map(toolbox.clone, offspring))
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if random.random() < CXPB:
toolbox.mate(child1, child2)
del child1.fitness.values
del child2.fitness.values
for mutant in offspring:
if random.random() < MUTPB:
toolbox.mutate(mutant)
del mutant.fitness.values
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
pop[:] = offspring
fits = [ind.fitness.values[0] for ind in pop]
best_ind = tools.selBest(pop, 1)[0]
print("Generation:", g, "Best:", best_ind, "Fitness:", best_ind.fitness.values[0])
if __name__ == "__main__":
main()
在这个示例中,我们定义了一个目标函数 rastrigin(x)
,并将其作为适应度函数 eval_func(individual)
的输入。我们使用 creator
模块定义了个体和种群,并使用 toolbox
模块注册了遗传算法操作。我们使用 population()
函数初始化种群,并使用 select()
、mate()
、mutate()
函数进行遗传算法操作。最后,我们使用 main()
函数执行遗传算法,并输出每一代的最优解和适应度值。
3.2 遗传算法优化Ackley函数
import random
from deap import base, creator, tools
# 定义目标函数
def ackley(x):
n = len(x)
sum1 = sum([xi**2 for xi in x])
sum2 = sum([math.cos(2 * math.pi * xi) for xi in x])
return -20 * math.exp(-0.2 * math.sqrt(sum1 / n)) - math.exp(sum2 / n) + 20 + math.e
# 定义适应度函数
def eval_func(individual):
return ackley(individual),
# 定义个体和种群
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, -32.768, 32.768)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=10)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# 定义遗传算法操作
toolbox.register("evaluate", eval_func)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.1)
toolbox.register("select", tools.selTournament, tournsize=3)
# 定义遗传算法主函数
def main():
pop = toolbox.population(n=50)
CXPB, MUTPB, NGEN = 0.5, 0.2, 50
for g in range(NGEN):
offspring = toolbox.select(pop, len(pop))
offspring = list(map(toolbox.clone, offspring))
for child1, child2 in zip(offspring[::2], offspring[1::2]):
if random.random() < CXPB:
toolbox.mate(child1, child2)
del child1.fitness.values
del child2.fitness.values
for mutant in offspring:
if random.random() < MUTPB:
toolbox.mutate(mutant)
del mutant.fitness.values
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = toolbox.map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
pop[:] = offspring
fits = [ind.fitness.values[0] for ind in pop]
best_ind = tools.selBest(pop, 1)[0]
print("Generation:", g, "Best:", best_ind, "Fitness:", best_ind.fitness.values[0])
if __name__ == "__main__":
main()
在这个示例中,我们定义了一个目标函数 ackley(x)
,并将其作为适应度函数 eval_func(individual)
的输入。我们使用 creator
模块定义了个体和种群,并使用 toolbox
模块注册了遗传算法操作。我们使用 population()
函数初始化种群,并使用 select()
、mate()
、mutate()
函数进行遗传算法操作。最后,我们使用 main()
函数执行遗传算法,并输出每一代的最优解和适应度值。
4. 说明
遗传算法是一种基于自然选择和遗传学原理的优化算法,它通过模拟自然界中的进化过程,从而实现对问题的优化。在Python中,我们可以使用 DEAP
库实现遗传算法。在使用遗传算法时,我们需要根据具体的问题选择合适的目标函数和适应度函数,并据模型的特点和数据集的特征进行调参。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python优化算法之遗传算法案例代码 - Python技术站