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,一经查实,立即删除!

相关文章

政务窗口服务满意度调查如何开展

首先要明确调查的目的和重点&#xff0c;群狼调研(长沙窗口满意度调查)根据客户需求开展政务窗口的整体服务满意度&#xff0c;首先要确定调查的范围和对象&#xff0c;如面向全市的所有政务窗口&#xff0c;还是只针对某个区县的政务窗口进行调查。 根据调查目的和范围&#…

Hadoop3教程(二):HDFS的定义及概述

文章目录 &#xff08;40&#xff09;HDFS产生的背景和定义&#xff08;41&#xff09;HDFS的优缺点&#xff08;42&#xff09;HDFS组成架构&#xff08;43&#xff09;HDFS文件块大小&#xff08;面试重点&#xff09;参考文献 &#xff08;40&#xff09;HDFS产生的背景和定…

功能集成,不占空间,同为科技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;我们一起来…

Vue_Bug npm install报错 code:128

Bug描述&#xff1a; npm install报错 code&#xff1a;128 npm ERR! Warning: Permanently added ‘github.com’ (ED25519) to the list of known hosts. npm ERR! gitgithub.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote repository. n…

lil-gui

前言 你是否因为想做个demo&#xff0c;要写配置项看效果&#xff0c;但是antd等组件库太大了&#xff0c;自己写又太累而烦恼&#xff1f;lil-gui库可以解决这个问题。这是一个轻量级浮窗配置项ui组件库。 官网 https://lil-gui.georgealways.com/#Examples由于是脱离框架写…

解决 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…

多线程并发篇---第十四篇

系列文章目录 文章目录 系列文章目录一、什么是AQS?二、了解Semaphore吗?三、什么是Callable和Future?一、什么是AQS? 简单说一下AQS,AQS全称为AbstractQueuedSychronizer,翻译过来应该是抽象队列同步器。 如果说java.util.concurrent的基础是CAS的话,那么AQS就是整个J…

微信小程序开发之框架篇

目录 一&#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 …

Java两个线程使用最基础wait/notify轮流打印数字和字符

背景&#xff1a; 最基础的java线程协同工作题目&#xff0c;也是笔试常见题目。 题目要求两个线程轮流打印数字&#xff08;1-26&#xff09;和字符&#xff08;a到z&#xff09;。 代码 class PrintNumRunnable implements Runnable {final Object object;final static in…

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

如果你也跟我一样有这种想法, 那真的太酷了!!! 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.先…

PostgreSQL | CTE | 使用with子句的通用表达式

CTE&#xff08;Common Table Expressions&#xff09; 简单讲&#xff0c;CTE就是日常SQL中出现的with语句&#xff0c;其原理就是通过提前将数据查询出来后作为临时结果集使用&#xff0c;可以与SELECT \ INSERT \ UPDATE \ DELETE的SQL连用。 优点 可读性强 CTE 允许你将…

老卫带你学---leetcode刷题(122. 买卖股票的最佳时机 II)

122. 买卖股票的最佳时机 II 问题 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回…

【vim 学习系列文章 8 -- vim中 has 函数和 let g:介绍】

文章目录 1.1 vim has 函数1.2 vim let g: 介绍 1.1 vim has 函数 在 Vim 中&#xff0c;has 是一个内置的函数&#xff0c;用于检查 Vim 是否支持某个特定的特性或者是否包含某个特定的扩展。 此函数的基本语法是&#xff1a; if has(feature)其中&#xff0c;‘feature’ …

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

数据结构与算法--其他算法 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;和其他…