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)
#导入生成伪随机数的模块
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.mzph.cn/news/107218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

功能集成,不占空间,同为科技TOWE嵌入式桌面PDU超级插座

随着现代社会人们生活水平的不断提高&#xff0c;消费者对生活质量有着越来越高的期望。生活中&#xff0c;各式各样的电气设备为我们的生活带来了便利&#xff0c;在安装使用这些用电器时&#xff0c;需要考虑电源插排插座的选择。传统的插排插座设计多暴露于空间之中&#xf…

LeetCode讲解篇之138. 随机链表的复制

LeetCode讲解篇之138. 随机链表的复制 文章目录 LeetCode讲解篇之138. 随机链表的复制题目描述题解思路题解代码 题目描述 题解思路 先遍历一遍链表&#xff0c;用哈希表保存原始节点和克隆节点的映射关系&#xff0c;先只克隆节点的Val&#xff0c;然后再次遍历链表&#xff…

逐字稿 | 视频理解论文串讲(上)【论文精读】

大家好&#xff0c;前两期我们讲了视频理解领域里的两篇经典的论文&#xff0c;一个是双流网络&#xff0c;第一个是 I3D 网络&#xff0c;所以说对视频理解这个问题有了个基本的了解。 那今天我们就从 2014 年开始&#xff0c;一直到最近 2021 年的工作&#xff0c;我们一起来…

解决 vscode使用Prettier格式化js文件报错:Cannot find module ‘./parser-babylon‘

报错如下&#xff1a; ["ERROR" - 11:48:58] Error formatting document. ["ERROR" - 11:48:58] Cannot find module ./parser-babylon Require stack: - d:\VueCode\VueProject\myqqmusic\node_modules\prettier\index.js - c:\Users\Administrator.SKY-2…

微信小程序开发之框架篇

目录 一&#xff0c;框架 1.页面管理 2.基础组件 3.丰富的API 二、小程序视图层 1.响应的数据绑定 2.列表渲染 3.条件渲染 4.模板 三、逻辑层 App Service 1.注册小程序 2.注册页面 2.1.使用 Page 构造器注册页面 2.2.在页面中使用 behaviors 3.页面路由 4.小…

Linux文件系统 struct file 结构体解析

文章目录 一、open系统调用1.1 简介1.2 files_struct1.2.1 简介1.2.2 init_files1.2.2 CLONE_FILES 1.3 源码分析1.3.1 get_unused_fd_flags1.3.2 do_filp_open1.3.3 fd_install 二、struct file简介三、其他参考资料 一、open系统调用 1.1 简介 NAMEopen, creat - open and …

旧手机热点机改造成服务器方案

如果你也跟我一样有这种想法, 那真的太酷了!!! ok,前提是得有root,不然体验大打折扣 目录 目录 1.做一个能爬墙能走百度直连的热点机(做热点机用) 2.做emby视频服务器 3.做文件服务, 存取文件 4.装青龙面板,跑一些定时任务 5.做远程摄像头监控 6.做web服务器 7.内网穿…

51单片机点阵

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、点阵是什么&#xff1f;1.点阵的原理2. 3*3 点阵显示原理3. 8*8点阵实物图4. 8*8点阵内部原理图5. 16*16点阵实物图&#xff0c;显示原理 二、使用步骤1.先…

数据结构与算法--其他算法

数据结构与算法--其他算法 1 汉诺塔问题 2 字符串的全部子序列 3 字符串的全排列 4 纸牌问题 5 逆序栈问题 6 数字和字符串转换问题 7 背包问题 8 N皇后问题 暴力递归就是尝试 1&#xff0c;把问题转化为规模缩小了的同类问题的子问题 2&#xff0c;有明确的不需要继续…

设计模式之是简单工厂模式

分类 设计模式一般分为三大类&#xff1a;创建型模式、结构型模式、行为型模式。 创建型模式&#xff1a;用于创建对象&#xff0c;共五种&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式&#xff1a;用于处理类或对…

超火爆的6 个必学持续集成工具,测试人的福音

开发人员喜欢把写的代码当成自己的孩子&#xff0c;他们会被当成艺术品一样呵护。作为家长&#xff0c;总是会认为自己的孩子是最好的&#xff0c;也会尽全力给自己的孩子最好的&#xff0c;就算有时候会超出自己的能力范围。 最终&#xff0c;孩子会走出去&#xff0c;和其他…

android studio检测不到真机

我的情况是&#xff1a; 以前能检测到&#xff0c;有一天我使用无线调试&#xff0c;发现调试有问题&#xff0c;想改为USB调试&#xff0c;但是半天没反应&#xff0c;我就点了手机上的撤销USB调试授权&#xff0c;然后就G了。 解决办法&#xff1a; 我这个情况比较简单&…

Leetcode刷题笔记--Hot61-70

1--课程表&#xff08;207&#xff09; 主要思路&#xff1a; 用 in 记录每一门课程剩余的先修课程个数&#xff0c;当剩余先修课程个数为0时&#xff0c;将该课程加入到队列q中。 每修队列q中的课程&#xff0c;以该课程作为先修课程的所有课程&#xff0c;其剩余先修课程个数…

vue elementui的select组件实现滑到底部分页请求后端接口

vue elementui的select组件实现滑到底部分页请求后端接口 1.实现效果2.实现原理 1.实现效果 老规矩&#xff0c;直接上最后的实现效果 2.实现原理 直接上代码 <el-form-item class"diagmosisItem" label"诊断" v-scroll"handleScroll">…

✔ ★【备战实习(面经+项目+算法)】 10.15学习时间表

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

【微信小程序开发】基础语法篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.视图层 1.数据绑定 wxml js 2 .列…

Python学习六

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

AnolisOS升级SSH,不升级SSL

由于ssh有漏洞需要升级&#xff0c;但是为了最小化升级不影响ssl&#xff0c;因为ssl里面带了加密库&#xff0c;系统中很多核心服务的加密都是用ssl进行加密的&#xff08;像网络服务&#xff0c;系统用户登录等&#xff09;&#xff0c;如果ssl升级出现不兼容&#xff0c;就可…

Java实现B树

1.介绍 B树是一种自平衡的搜索树数据结构&#xff0c;常用于数据库和文件系统中的索引结构。它具有以下好处和功能&#xff1a; 高效的查找操作&#xff1a;B树的特点是每个节点可以存储多个关键字&#xff0c;并且保持有序。通过在节点上进行二分查找&#xff0c;可以快速定位…

260. 只出现一次的数字 III

给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&#xff1a; 输入&…