GA遗传算法

news2024/11/29 8:40:30

储备知识

GA算法主要解决数学模型中最优化搜索算法,是进化算法中的一种,基因算法借鉴了自然界基因的遗传的主要现象,分别为遗传,变异,自然选择,杂交等。

GA算法参数

GA算法的参数如下所示。

  • 种群规模(即一般为行数,即为个体数量)
  • 字符串长度(会将一个变量编码成字符串,一般为0-1二进制字符串)
  • 交配(杂交)概率(让适应度高的个体产生后代变量的概率更大,但其他个体的概率为非负数)
  • 突变概率(让个体基因存在一定的突变概率,一般为1e-3)
  • 终止条件,一般的终止条件如下所示。
  1. 循环迭代产生基因的次数
  2. 计算资源使用殆尽
  3. 已经找到全局最优质值
  4. 一定人为干预

GA算法的流程

GA算法最重要的为适应度函数以及自变量的取值范围,以及变量的个数,因此代码实现流程如下所展示。

  1. 算法随机生成一定数量的个体,生成初始种群的质量
  2. 对每一代评价每个个体,确定适应度数值
  3. 产生下一代,这过程包括交叉操作以及突变操作。一般按照适应度数值排序,但不完全以适应度高地为导向,因为有可能造成局部最优解。
  4. 继续循环2-3的步骤,直到满足终止条件(上述已经说明)

具体流程如图所示。
在这里插入图片描述

GA算法的适应度函数

适应度函数一般都是用目标函数确定的。目标函数即为因变量与自变量之间的映射函数。而适应度函数主要目的是确定优化的方向,即为最小化还是最大化目标函数值。最小化最大化的代码如下所示。

def Function_(x, y): # Function_(x, y)为目标函数
	pass 
def get_fitness(pop, type='min'):  
# get_fitness(pop, type='min')为自适应函数,一般为确定min为追求最小化,max为追求最大化
# x,y的参数主要根据目标函数的自变量个数去确定
    if  type  is 'min':
   		x,y = translateDNA(pop)
   		pred = Function_(x, y)
   		return -(pred - np.max(pred)) + 1e-3
   elfi type is 'max':
   	    x,y = translateDNA(pop)
   		pred = Function_(x, y)
   		return (pred - np.min(pred)) + 1e-3 

GA算法的编码

此外在运用遗传算法的时候,最重要的是会将自变量编码为我们所需要的字符串,这个过程称之为编码,编码方式为二进制编码,将十进制的数字转化为二进制,如5编码之后变成101。后续编码会将补全到某个特定的二进制编码,如变成0000000101(10位二进制编码)。

GA算法的遗传因子选择

选择

交叉

变异

代码实现过程

具体问题具体分析,文中主要以Rosenbrock函数的极大值为例子(参考了知乎某位大佬的例子遗传算法python(含例程代码与详解))
该函数又称为香蕉函数。具体如图所示。
具体的函数解析式如下所示。
f ( x , y ) = ( 1 − x ) 2 + 100 ( y − x 2 ) 2 . f(x,y)=(1-x)^{2}+100(y-x^{2})^{2}. f(x,y)=(1x)2+100(yx2)2.

在这里插入图片描述

代码

import numpy as np
import matplotlib.pyplot as plt


# 适应度函数,求取最大值
#因为GA函数是求最小值,所以我在适应度函数上加一个负号
#GA要求输入维度2维及其以上,所以我传入2个参数,第二维x2不用,
def fitness(y, x):
   # x1, x2 = x
   # return -(x1 + 16 * np.sin(5 * x1) + 10 * np.cos(4 * x1))
   return -(100.0 * (y - x ** 2.0) ** 2.0 + (1 - x) ** 2.0)


# 个体类
from sko.GA import GA
up_bound = [2.048, 2.048]
low_boound = [-2.048, -2.048]
n_dim = 2
iter_num = 800
precision = 1e-7
size_pop = 50
ga = GA(func=fitness, n_dim=n_dim, size_pop=size_pop, max_iter=iter_num, lb=low_boound, ub=up_bound, precision=precision)
# 具体代码的修改需要根据n_dim以及lb和ub的个数,个人理解lb是下限,ub为上限,此外,修改为适应度函数的时候需要注意,即为修改以及调整适应度函数的自变量个数以及表达式
best_x, best_y = ga.run()
# best_x 输出的是坐标,所以就是为一个元组,best_y为因变量,所以输出是一个数值
print('best_x:', best_x[0], '\n', 'best_y:', -best_y)


def func(y, x):
   # return x + 16 * np.sin(5 * x) + 10 * np.cos(4 * x)
   return 100.0 * (y - x ** 2.0) ** 2.0 + (1 - x) ** 2.0

# 绘制二维图像
# x = np.linspace(-10, 10, 100000)
# y = func(x)
#
# plt.plot(x, y)
# plt.scatter(best_x[0], -best_y, c='r', label='best point')

# 绘制三维图像
ax3 = plt.axes(projection='3d')
X = np.linspace(low_boound[0], up_bound[0], 100)
Y = np.linspace(low_boound[1], up_bound[1], 100)
X, Y = np.meshgrid(X, Y)
Z = 100.0 * (Y - X ** 2.0) ** 2.0 + (1 - X) ** 2.0
# plt.scatter(best_x[0], best_x[1], -best_y, c='r', label='best point')
ax3.scatter(best_x[0], best_x[1], -best_y, c='r', label='best point')
ax3.plot_surface(X, Y, Z, cmap='rainbow')
# # ax3.contour(X, Y, Z, zdim='z',offset=-2, cmap='rainbow')   #等高线图,要设置offset,为Z的最小值
plt.legend()
plt.show()

最终绘制结果如下所示。
在这里插入图片描述

参考

维基百科遗传算法介绍
matlab遗传算法介绍——寻找高度非线性问题的全局极小值
遗传算法python(含例程代码与详解)(知乎)
遗传算法python进阶理解+论文复现(纯干货,附前人总结引路)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967632.html

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

相关文章

c++ vs2019 cpp20规范的STL库的map与multimap源码分析

map就是一个红黑树。 标准平衡二叉树,要求左右子树的高度差不超过1 。红黑树只要求左右子树的高度差不超过一倍即可。兼顾了树平衡与效率。避免了AVL树的频繁调整树平衡。 b站 的“可雷曼土”大师,讲红黑树的理论讲的很透彻,再结合看代码&…

va_list使用及两个注意项(可能导致崩溃和少1个字符)

两个注意项: 1、linux平台上vsnprintf会破坏va_list变量,需要重新调用va_start,否则可能访问错位崩溃。 2、vsnprintf会留一个字节补0结束,但返回值不包含,所以必须判断返回值小于分配的空间。 具体代码分析&#xff1…

【包过滤防火墙——firewalld动态防火墙】的简单使用

文章目录 firewald与iptables区别firewalld九个区域firewalld配置方法firewalld参数和命令firewalld两种模式firewalld使用实验 firewalld不要与iptables混用 firewald与iptables区别 iptables 主要是基于接口,来设置规则,从而判断网络的安全性。firewa…

卡特兰数和算法

在组合数学中,卡特兰数是一系列自然数,出现在各种组合计数问题中,通常涉及递归定义的对象。它们以比利时数学家尤金查尔斯卡特兰(Eugne Charles Catalan)的名字命名。 卡特兰数序列是1, 1, 2, 5, 14, 42......&#xf…

AAC之处理码流分析工具(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

websocket基础

下面就以代码来进行说明 1&#xff0c;先导入websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.编写websocket相关bean管理配置 Config…

牛客网刷题

牛客网刷题-C&C 2023年9月3日15:58:392023年9月3日16:37:01 2023年9月3日15:58:39 2023年9月3日16:37:01 整型常量和实型常量的区别

一、了解[mysql]索引底层结构和算法

目录 一、索引1.索引的本质2.mysql的索引结构 二、存储引擎1.MyISAM2.InnoDB3.为什么建议InnoDB表要建立主键并且推荐int类型自增&#xff1f;4.innodb的主键索引和非主键索引&#xff08;二级索引&#xff09;区别5.联合索引 一、索引 1.索引的本质 索引:帮助mysql高效获取数…

01-为什么阿里巴巴强制要求使用包装类型定义属性?【Java面试题总结】

1.为什么阿里巴巴强制要求使用包装类型定义属性&#xff1f; 我认为主要有以下几个方面的原因&#xff1a; 默认值问题&#xff1a;使用基本数据类型定义属性时&#xff0c;如果没有给属性赋初始值&#xff0c;会使用默认值&#xff08;如 int 的默认值为 0&#xff09;&…

C++:初识类与this指针

文章目录 前言一、类类的定义和实例化类的访问限定符类的作用域计算类的大小 二、类的成员函数的this指针总结 个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 前言 一、类 类的定义和实例化 注意类定义结束时后面分号( ; )不能省略。 类…

基于粒子群算法的考虑需求响应的风-光-柴-储容量优化配置

目录 文章摘要&#xff1a; 研究背景&#xff1a; 考虑柔性负荷的风、光、柴、储微电网模型&#xff1a; 储能配置模型&#xff1a; 粒子群算法&#xff1a; 运行结果&#xff1a; 1. 全年运行效果展示&#xff1a; 2. 典型日运行效果&#xff1a; Matlab代码数据分享…

博客系统自动化测试项目实战(测试系列9)

目录 前言&#xff1a; 1.博客前端页面测试用例图 2.测试用例的代码实现 2.1登录页面的测试 2.2博客列表页面的测试 2.3写博客测试 2.4博客详情页面的测试 2.5已发布博客的标题和时间的测试 2.6注销用户的测试 结束语&#xff1a; 前言&#xff1a; 之前小编给大家讲…

js实现点击查看全部/收起功能

在上一篇文章实现用js截取文本后&#xff0c;我的另一个需求也迎刃而解了。需求就是一段长文本需要溢出隐藏&#xff0c;然后点击全部时显示全部文本&#xff0c;点击收起又回到溢出隐藏的状态。实现的效果如下图&#xff1a; 实现的思路时点击全部时使用这条数据的原文本&…

04-过滤器和拦截器有什么区别?【Java面试题总结】

过滤器和拦截器有什么区别&#xff1f; 运行顺序不同&#xff1a;过滤器是在 Servlet 容器接收到请求之后&#xff0c;但在 Servlet被调用之前运行的&#xff1b;而拦截器则是在Servlet 被调用之后&#xff0c;但在响应被发送到客户端之前运行的。 过滤器Filter 依赖于 Servle…

【优先级队列】

文章目录 基于无序数组实现基于有序数组的实现基于堆的实现合并多个有序链表-力扣 23 题 基于无序数组实现 要点 入队保持顺序&#xff0c;在数组尾部插入即可出队前找到优先级最高的出队&#xff0c;相当于一次选择排序 基于有序数组的实现 要点 入队后排好序&#xff0c…

企业架构LNMP学习笔记8

1、 运维人员需要考虑安全性、稳定性。 安装&#xff1a; 解压进入到目录&#xff1a; shell > tar zxf php-7.2.12.tar.gz shell > cd php-7.2.12 安装依赖软件&#xff1a; yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel op…

企业应用系统 PHP项目支持管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 项目支持管理系统是一套完善的web设计系统 应用于企业项目管理&#xff0c;从企业内部的各个业务环境总体掌握&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php项目支撑管理系统2 二、功能介绍 (1)权限管理&#xff1…

Android 使用OpenCV实现实时人脸识别,并绘制到SurfaceView上

1. 前言 上篇文章 我们已经通过一个简单的例子&#xff0c;在Android Studio中接入了OpenCV。 之前我们也 在Visual Studio上&#xff0c;使用OpenCV实现人脸识别 中实现了人脸识别的效果。 接着&#xff0c;我们就可以将OpenCV的人脸识别效果移植到Android中了。 1.1 环境说…

一个基于YAPI接口生产代码的开源工具

前后端分离的开发模式是一种趋势&#xff0c;但如果缺少好的开发工具跟管理模式&#xff0c;会使得前后端开发人员相互等待&#xff0c;扯皮等问题。从而影响项目的交付进度。 通过实践摸索&#xff0c;YAPI是一款很适合前后端分离开发的协助工具。它以项目为维度&#xff0c;可…

arduino仿真 SimulIDE1.0仿真器

SimulIDE 是一个开源的电子电路模拟器&#xff0c;支持模拟各种电子元器件的行为&#xff0c;可以帮助电子工程师和爱好者进行电路设计和测试。以下是 SimulIDE 的安装和使用说明&#xff1a; 安装 SimulIDE SimulIDE 可以在 Windows、Linux 和 Mac OS X 等操作系统上安装。您…