Python遗传算法求一元函数最大值

本文介绍了作者在理解遗传算法后,根据已有资源进行修改,实现了一段寻找一元函数最大值的Python代码。文章提供代码示例,并鼓励读者交流讨论。参考了CSDN上的多个教程和视频资源。
摘要由CSDN通过智能技术生成

Python遗传算法求一元函数最大值

前言

最近接触遗传算法,参考了众多例子,有些又不尽然对,所以自己边理解边修改,然后写出了下面这堆传说中的屎山。。。
PS1:遗传算法原理啥的太多了,就不赘述了,CSDN里面很多帖子都讲得很透彻了;
PS2:要看简洁的,直接油管搜遗传算法,看莫烦的视频。

代码

不废话了,赶紧上车,啊不,上代码。

import math
import numpy as np
import matplotlib.pyplot as plt
import random


class GA(object):
    # 目标求解2*sin(x)+cos(x)最大值
    def __init__(self, population_size, chromosome_length, pm):
        self.population_size = population_size
        self.chromosome_length = chromosome_length
        self.pm = pm

    # 初始化种群
    def species_origin(self):  # 生成染色体和基因
        population = [[]]  # 二维列表,包含染色体和基因
        for i in range(self.population_size):
            temporary = []  # 染色体寄存器
            for j in range(self.chromosome_length):
                temporary.append(random.randint(0, 1))  # 生成基因,二进制
            population.append(temporary)  # 将基因添加到染色体中
        return population[1:]  # 返回种群,包含染色体和基因

    # 种群解码,用于适应度判断
    def translation(self, population):  # 二进制转十进制
        chromosome_d_list = []  # 创建染色体十进制列表
        for i in range(len(population)):
            chromosome_value_d = 0
            for j in range(len(population[0])):
                chromosome_value_d += population[i][j] * (math.pow(2, len(population[0])-j-1))  
            chromosome_d_list.append(chromosome_value_d)  
        return chromosome_d_list

    # 适应度计算
    def function(self, population, lower_bound, upper_bound):
        all_fitness_list = []  # 创建所有染色体适应度列表
        fv_list = self.translation(population)
        for i in range(len(fv_list)):
            x = lower_bound + fv_list[i] * (upper_bound - lower_bound)/(math
  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python中的遗传算法是一种模拟自然选择和遗传机制的优化算法,用于解决复杂问题,如寻找函数的最小值或最优解。遗传算法主要包含以下几个步骤: 1. 初始化种群:随机生成一组解(称为个体或染色体),这些解代表可能的函数值。 2. 适应度评估:计算每个个体对应的目标函数值,适应度越高,表示该个体越接近解。 3. 选择:基于适应度值,选择一部分个体进入下代,概率较高的个体被选中的可能性越大。 4. 变异:对选择的个体进行变异操作,可能包括基因突变(改变某个基因)或交叉(交换部分基因)。 5. 进化:重复步骤3和4,逐步迭代种群,直到满足停止条件(如达到预设的迭代次数或适应度达到预设阈值)。 6. 返回最优解:最终的种群中,适应度最高的个体通常就是所函数最小值近似解。 在Python中,你可以使用一些库如`deap`(Distributed Evolutionary Algorithms in Python)来实现遗传算法。以下是一个简单的例子: ```python from deap import base, creator, tools # 创建适应度函数和种群 creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) creator.create("Individual", list, fitness=creator.FitnessMin) def evalOneMax(individual): return -sum(individual), # 函数最小值对应最大适应度 toolbox = base.Toolbox() toolbox.register("attr_bool", random.randint, 0, 1) # 二进制编码 toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, n=10) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("evaluate", evalOneMax) toolbox.register("mate", tools.cxTwoPoint) toolbox.register("mutate", tools.mutFlipBit, indpb=0.05) toolbox.register("select", tools.selTournament, tournsize=3) # 运行遗传算法 pop = toolbox.population(n=50) best_gen = tools.selBest(pop, k=1) for gen in range(100): # 迭代次数 offspring = toolbox.select(pop, len(pop)) offspring = [toolbox.clone(ind) for ind in offspring] for child1, child2 in zip(offspring[::2], offspring[1::2]): if random.random() < 0.5: toolbox.mate(child1, child2) del child1.fitness.values del child2.fitness.values for mutant in offspring: if random.random() < 0.2: 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 best = tools.selBest(pop, k=1) # 获取当前最佳解 print("Best individual: ", best, " with fitness: ", best.fitness.values) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值