1.算法-Python遗传算法实例

题记

        以下是一个python遗传算法实例,包括全过程和解析。

编辑main.py文件

        main.py文件如下:

#导入生成伪随机数的模块
import random

# 随机生成初始种群
# 1.初始化种群,在搜索空间内随机生成一组个体,称为种群
# 定义函数,参数为种群数量,基因数量或者长度,随机生成的是基因
def generate_population(size, num_genes):
    return [[random.randint(0, 100) for _ in range(num_genes)] for _ in range(size)]

# 计算适应度函数(这里是目标函数,即列表中的最大数)
# 2.评估适应度,对每个个体计算适应度,适应度表示个体解的优劣程度。适应度函数通常是问题特定的,目标是最大化或最小化适应度函数的值。
# 个体中的最大值
def fitness(individual):
    return max(individual)

# 选择父代
# 3.选择,根据个体的适应度选择父代个体。适应度高的个体被选中的概率较大,模拟了自然选择中适者生存的原则。
# 参数为种群,选择的父代数
def select_parents(population, num_parents):
    parents = []
    for _ in range(num_parents):
        selected = random.choice(population)
        parents.append(selected)
    return parents

# 交叉操作
# 4.交叉,通过某种方式交换两个父代个体的基因信息,产生新的子代个体。交叉操作模拟了生物界的基因交换。
# 参数为父代,和要生成的子代数
def crossover(parents, num_offspring):
    offspring = []
    for _ in range(num_offspring):
        # 从父代随机选两个
        parent1, parent2 = random.sample(parents, 2)
        # 选择交叉的位置
        crossover_point = random.randint(1, len(parent1) - 1)
        #对父代切割,组合
        child = parent1[:crossover_point] + parent2[crossover_point:]
        offspring.append(child)
    return offspring

# 变异操作
# 5.变异,对子代个体的基因信息进行突变操作,引入新的基因特征。变异操作是为了维持种群的多样性,避免陷入局部最优解
# 参数为子代列表,和变异的概率
def mutate(offspring, mutation_rate):
    for child in offspring:
        # 如果生成的0,1的随机数小于概率就变异
        if random.random() < mutation_rate:
            # 选择变异点
            mutate_point = random.randint(0, len(child) - 1)
            child[mutate_point] = random.randint(0, 100)
    return offspring

# 主函数
# 6.替换 ,用新生成的子代个体替代原始种群中适应度较差的个体,形成新一代种群。
# 7.终止条件,判断是否满足停止条件(例如达到最大迭代次数或者找到满足要求的解),如果满足则算法结束,否则返回步骤2
def genetic_algorithm(num_generations, population_size, num_genes, num_parents, num_offspring, mutation_rate):
    # 初始化
    population = generate_population(population_size, num_genes)
    # 进化过程,参数为换代的次数
    for generation in range(num_generations):
        # 计算适应度
        fitness_scores = [fitness(individual) for individual in population]
        # 找到当前种群中适应度最高的个体
        max_fitness = max(fitness_scores)
        best_individual = population[fitness_scores.index(max_fitness)]
        print(f"当前代数 {generation + 1}: 最佳个体 - {best_individual}, 适应度 - {max_fitness}")
        # 选择父代
        parents = select_parents(population, num_parents)
        # 交叉操作
        offspring = crossover(parents, num_offspring)
        # 变异操作
        offspring = mutate(offspring, mutation_rate)
        # 替换当前种群
        population = offspring

# 调用遗传算法函数
genetic_algorithm(num_generations=50, population_size=100, num_genes=10, num_parents=50, num_offspring=50, mutation_rate=0.1)
python">#导入生成伪随机数的模块
import random

# 随机生成初始种群
# 1.初始化种群,在搜索空间内随机生成一组个体,称为种群
# 定义函数,参数为种群数量,基因数量或者长度,随机生成的是基因
def generate_population(size, num_genes):
    return [[random.randint(0, 100) for _ in range(num_genes)] for _ in range(size)]

# 计算适应度函数(这里是目标函数,即列表中的最大数)
# 2.评估适应度,对每个个体计算适应度,适应度表示个体解的优劣程度。适应度函数通常是问题特定的,目标是最大化或最小化适应度函数的值。
# 个体中的最大值
def fitness(individual):
    return max(individual)

# 选择父代
# 3.选择,根据个体的适应度选择父代个体。适应度高的个体被选中的概率较大,模拟了自然选择中适者生存的原则。
# 参数为种群,选择的父代数
def select_parents(population, num_parents):
    parents = []
    for _ in range(num_parents):
        selected = random.choice(population)
        parents.append(selected)
    return parents

# 交叉操作
# 4.交叉,通过某种方式交换两个父代个体的基因信息,产生新的子代个体。交叉操作模拟了生物界的基因交换。
# 参数为父代,和要生成的子代数
def crossover(parents, num_offspring):
    offspring = []
    for _ in range(num_offspring):
        # 从父代随机选两个
        parent1, parent2 = random.sample(parents, 2)
        # 选择交叉的位置
        crossover_point = random.randint(1, len(parent1) - 1)
        #对父代切割,组合
        child = parent1[:crossover_point] + parent2[crossover_point:]
        offspring.append(child)
    return offspring

# 变异操作
# 5.变异,对子代个体的基因信息进行突变操作,引入新的基因特征。变异操作是为了维持种群的多样性,避免陷入局部最优解
# 参数为子代列表,和变异的概率
def mutate(offspring, mutation_rate):
    for child in offspring:
        # 如果生成的0,1的随机数小于概率就变异
        if random.random() < mutation_rate:
            # 选择变异点
            mutate_point = random.randint(0, len(child) - 1)
            child[mutate_point] = random.randint(0, 100)
    return offspring

# 主函数
# 6.替换 ,用新生成的子代个体替代原始种群中适应度较差的个体,形成新一代种群。
# 7.终止条件,判断是否满足停止条件(例如达到最大迭代次数或者找到满足要求的解),如果满足则算法结束,否则返回步骤2
def genetic_algorithm(num_generations, population_size, num_genes, num_parents, num_offspring, mutation_rate):
    # 初始化
    population = generate_population(population_size, num_genes)
    # 进化过程,参数为换代的次数
    for generation in range(num_generations):
        # 计算适应度
        fitness_scores = [fitness(individual) for individual in population]
        # 找到当前种群中适应度最高的个体
        max_fitness = max(fitness_scores)
        best_individual = population[fitness_scores.index(max_fitness)]
        print(f"当前代数 {generation + 1}: 最佳个体 - {best_individual}, 适应度 - {max_fitness}")
        # 选择父代
        parents = select_parents(population, num_parents)
        # 交叉操作
        offspring = crossover(parents, num_offspring)
        # 变异操作
        offspring = mutate(offspring, mutation_rate)
        # 替换当前种群
        population = offspring

# 调用遗传算法函数
genetic_algorithm(num_generations=50, population_size=100, num_genes=10, num_parents=50, num_offspring=50, mutation_rate=0.1)

 执行程序

        python main.py 

展示图 

 后记

        觉得有用可以点赞或收藏!


http://www.niftyadmin.cn/n/5091880.html

相关文章

YOLOV7量化第一步: 准备模型

1. 准备模型 手动/自动插入QDQ节点 1.1 准备容器 准备容器的时候有可能出现共享内存的问题, 这里在启动容器的时候设置一下, # 增加了里面的共享内存 docker run --gpus all -it --shm-size64g --name env_pyt_1.12 -v $(pwd):/app nvcr.io/nvidia/pytorch:22.03-py3 美式的…

【Eclipse】解决插件下载速度太慢

解决方案&#xff1a;修改镜像 下面列出几个国内的镜像网站&#xff1a; 中国科学技术大学(5.6MB/s) http://mirrors.ustc.edu.cn/eclipse/ 北京理工大学&#xff08;600KB/s&#xff09; http://mirror.bit.edu.cn/eclipse/ 大连东软信息学院(400KB/s) http://mirrors.neuso…

因为写保护,U盘会“假死”。如何在Windows 10上删除写保护

本文介绍如何从USB驱动器、SD卡或单个文件中删除写保护。说明适用于Windows 10、Windows 8和Windows 7。 如何使用锁定开关解除写保护 如果你的计算机告诉你介质受写保护&#xff0c;请在USB或SD卡上查找写保护开关&#xff08;也称为锁定开关&#xff09;。如果介质有此开关…

C语言程序设计 三四节课堂笔记

C语言程序设计 三四节课堂笔记 C语言程序设计 三四节课堂笔记3.0 程序编写顺序&#xff08;了解&#xff09;3.1 C语言的特点3.2 认识C程序1. C程序的基本框架2. C语言程序的结构特点3. C程序的开发过程 C语言程序设计 第四节课4.1 开发环境dev-C的使用1. 如何将英文界面调整为…

蓝桥杯每日一题2023.10.15

数列求值 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 我们发现如果一项一项相加会造成结果过大从而答案错误&#xff0c;所以我们每次只需要取后四位经行计算即可 #include<bits/stdc.h> using namespace std; int a[20190329]; int main() {a[1] 1, a[2] 1, a[3]…

[LeetCode周赛复盘] 第 115 场双周赛20231014

[LeetCode周赛复盘] 第 115 场双周赛20231014 一、本周周赛总结100095. 上一个遍历的整数1. 题目描述2. 思路分析3. 代码实现 100078. 最长相邻不相等子序列 I1. 题目描述2. 思路分析3. 代码实现 100077. 最长相邻不相等子序列 II1. 题目描述2. 思路分析3. 代码实现 100029. 和…

GP与LP的区别,有限责任、无限责任、无限连带责任

GP与LP的区别 GP是General Partner / 普通合伙人&#xff08;英文直译&#xff09; LP是Limited Partner / 有限合伙人&#xff08;英文直译&#xff09; GP和LP是经常出现在私募股权投资中的词汇&#xff0c;其实私募股权呢就是大家合力干一件事。很多时候&#xff0c;一个…

Java8新特性实战

Java 8 作为一个里程碑式的版本&#xff0c;其中所做出的改变&#xff0c;在许多方面比Java历史上任何一次改变都深远。Java为什么会一直在改变&#xff0c;因为编程语言就像生态系统一样&#xff0c;更优秀语言的出现&#xff0c;落后的语言就会被取代&#xff0c;除非它们不断…