遗传算法原理及其python实现

article/2025/10/18 11:19:05

遗传算法原理

基本思想:

  • 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则,它最初由美国Michigan大学的J. Holland教授于1967年提出。
  • 遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。因此,第一步需要实现从表现型到基因型的映射即编码工作。初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,幵借助于自然遗传学的遗传算子(genetic operators)进行组合交叉和变异,产生出代表新的解集的种群。这个过程将导致种群像自然进化一样,后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。

基本概念
与进化论相似,遗传算法有几个核心概念。知道进化论或学过生物的很容易理解。

  • 个体(Individual):一个猴子,一个猩猩,一个人。
  • 种群(Population):一群猴子,一群猩猩,一群人。
  • 基因(Gene):个体携带的基因。
  • 染色体(Chromosome):由基因拼接组成;作为个体的蓝本,在算法中一般代表个体自身。

遗传算法有三个基本操作:选择(Selection)、交叉(Crossover)和变异(Mutation)。

  • 选择 选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁衍子孙。根据各个个体的适应度值,按照一定的规则或方法从上一代群体中选择出一些优良的个体遗传到下一代种群中。选择的依据是适应性强的个体为下一代贡献一个或多个后代的概率大。选择的基准就是个体的适应度。而选择的策略根据问题和程序员自身意图,可以采用多种策略。一般使用较广、且易于实现的是轮盘赌策略(roulette wheel selection)。 假设种群中有6个个体,适应度值分别是[2,3,10,5,12,19],其轮盘是如下形式:

    我们转动轮盘,显然适应度越大的有更大的概率被选中。其简单的解释性代码可以表示如下:轮盘赌也有一定的限制。如果适应度值有正有负,就不好处理。所以轮盘赌只是选择策略的一种。最简单的是随机选择策略,在种群中随机选择个体进行进化。

# -*- coding: utf-8 -*-
import numpy as np
s = [2, 3, 10, 5, 12, 19] # 种群和个体
s_sum = sum(s) # 所有适应度的和
m = 0
r = np.random.random() # 0-1之间的随机数
c = 0
for i in range(len(s)):m += s[i] / s_sumif r <= m:c = ibreak
print(c) # 最后选中个体的序号
  • 交叉。通过交叉操作可以得到新一代个体,新个体组合了父辈个体的特性。将群体中的各个个体随机搭配成对,对每一个个体,以交叉概率交换它们之间的部分染色体。 两个个体parent1和parent2,各分成2部分基因片段。分别将parent1的前部分 基因片段和parent2的后部分基因片段,parent1的后部分基因片段和parent2的前部分基因片段相结合,生成了2个后代child1和child2。每个后代都拥有parent1和parent2的一部分基因。 在每一代进化中,交叉过程不是一定发生的,一般基于设定的概率发生。而这个概率设定的较高,一般在0.6以上。如果交叉不发生,parent1和parent2直接复制进入新种群。如果交叉发生,则对child1,child2,parent1,parent2进行适应度比较后,保留较好的进入新种群,也可以都进入新种群,具体怎么做没有标准,可以根据具体问题自行选择。
  • 变异。对种群中的每一个个体,以变异概率改变某一个或多个基因座上的基因值为其他的等位基因。同生物界中一样,变异发生的概率很低,变异为新个体的产生提供了机会。

基本步骤

原理python实现

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt# 适应度函数,求取最大值
def fitness(x):return x + 16 * np.sin(5 * x) + 10 * np.cos(4 * x)# 个体类
class indivdual:def __init__(self):self.x = 0  # 染色体编码self.fitness = 0  # 个体适应度值def __eq__(self, other):self.x = other.xself.fitness = other.fitness# 初始化种群
#pop为种群适应度存储数组,N为个体数
def initPopulation(pop, N):for i in range(N):ind = indivdual()#个体初始化ind.x = np.random.uniform(-10, 10)#  个体编码。-10,10的正态分布,可以自己设定限定边界ind.fitness = fitness(ind.x)#计算个体适应度函数值pop.append(ind)#将个体适应度函数值添加进种群适应度数组pop# 选择过程
def selection(N):# 种群中随机选择2个个体进行变异(这里没有用轮盘赌,直接用的随机选择)return np.random.choice(N, 2)# 结合/交叉过程
def crossover(parent1, parent2):child1, child2 = indivdual(), indivdual()#父亲,母亲初始化child1.x = 0.9 * parent1.x + 0.1 * parent2.x #交叉0.9,0.1,可以设置其他系数child2.x = 0.1 * parent1.x + 0.9 * parent2.xchild1.fitness = fitness(child1.x)#子1适应度函数值child2.fitness = fitness(child2.x)#子2适应度函数值return child1, child2
# 变异过程
def mutation(pop):# 种群中随机选择一个进行变异ind = np.random.choice(pop)# 用随机赋值的方式进行变异ind.x = np.random.uniform(-10, 10)ind.fitness = fitness(ind.x)# 最终执行
def implement():# 种群中个体数量N = 40# 种群POP = []# 迭代次数iter_N = 400# 初始化种群initPopulation(POP, N)# 进化过程for it in range(iter_N):#遍历每一代a, b = selection(N)#随机选择两个个体if np.random.random() < 0.65:  # 以0.65的概率进行交叉结合child1, child2 = crossover(POP[a], POP[b])new = sorted([POP[a], POP[b], child1, child2], key=lambda ind: ind.fitness, reverse=True)#将父母亲和子代进行比较,保留最好的两个POP[a], POP[b] = new[0], new[1]if np.random.random() < 0.1:  # 以0.1的概率进行变异mutation(POP)POP.sort(key=lambda ind: ind.fitness, reverse=True)return POPif __name__ =='__main__':pop = implement()# 绘图代码def func(x):return x + 16 * np.sin(5 * x) + 10 * np.cos(4 * x)x = np.linspace(-10, 10, 100000)y = func(x)scatter_x = np.array([ind.x for ind in pop])scatter_y = np.array([ind.fitness for ind in pop])best=sorted(pop,key=lambda pop:pop.fitness,reverse=True)[0]#最佳点print('best_x',best.x)print('best_y',best.fitness)plt.plot(x, y)#plt.scatter(scatter_x, scatter_y, c='r')plt.scatter(best.x,best.fitness,c='g',label='best point')plt.legend()plt.show()

参考文献
https://blog.csdn.net/saltriver/article/details/63679701

遗传算法工具箱

python也有诸如遗传算法/粒子群算法等启发式算法工具包,链接如下:

GitHub链接
scikit-opt是一个封装了7种启发式算法的 Python 代码库(差分进化算法、遗传算法、粒子群算法、模拟退火算法、蚁群算法、鱼群算法、免疫优化算法)

中文文档

import numpy as np
import matplotlib.pyplot as plt# 适应度函数,求取最大值
#因为GA函数是求最小值,所以我在适应度函数上加一个负号
#GA要求输入维度2维及其以上,所以我传入2个参数,第二维x2不用
def fitness(x):x1, x2 = x#x1=xreturn -(x1 + 16 * np.sin(5 * x1) + 10 * np.cos(4 * x1))# 个体类
from sko.GA import GAga = GA(func=fitness, n_dim=2, size_pop=50, max_iter=800, lb=[-10,0], ub=[10,0],precision=1e-7)
best_x, best_y = ga.run()
print('best_x:', best_x[0], '\n', 'best_y:', -best_y)def func(x):return x + 16 * np.sin(5 * x) + 10 * np.cos(4 * x)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')plt.legend()
plt.show()

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/hK02A2b0.shtml

相关文章

智能算法——遗传算法原理、应用汇总

一、遗传算法原理 遗传算法&#xff08;GA&#xff09;是一种基于生物界规律和自然遗传机制的并行搜索算法。1975 年&#xff0c;J. Holland 教授首次在书中提出“自然组合人工智能系统的适应性”。它是一种多参数&#xff0c;多组合同时优化方法&#xff0c;模拟自然进化过程中…

遗传算法原理

一、遗传算法简介 遗传算法是进化算法的一个分支. 它将达尔文的进化理论搬进了计算机. 科学定义如下&#xff1a; **遗传算法&#xff08;Genetic Algorithm, GA&#xff09;**起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优…

遗传算法

目录 一、算法原理 二、代码实现 三、结果分析 优化目标函数为Rastrigin(x) 目标函数为Schaffer(x) 目标函数为Griewank(x) 总结 一、算法原理 1、基本原理 遗传算法是一种典型的启发式算法&#xff0c;属于非数值算法范畴。其目的是抽象和严谨地解释自然界的适应过程以…

遗传算法(GA)详解

遗传算法&#xff08;GA&#xff09;详解 遗传算法主要作用是求解最优解&#xff0c;例如求函数极值&#xff0c;或是飞机巡航问题中的最短巡航路线的求解等&#xff0c;其作用与模拟退火算法的作用较为相似。本文将从GA算法的原理&#xff0c;结构与两个实践应用进行比较详细…

html中热区如何设置,Dreamweaver中如何设置热区?DW设置热区方法图解

Dreamweaver中如何设置热区?下面小编就为大家详细介绍一下&#xff0c;一起来看看吧&#xff01; 方法/步骤 向平时一样&#xff0c;这里我们在设置Dreamweaver热区的时候。同样这里是需要建立一个新的HTML界面的。 建立完毕&#xff0c;如下图中所示的一个新的文档(HTML) 按照…

用html编写或在dw中完成,Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码

Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码,代码,教程,标签,光标,文本 Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码 易采站长站&#xff0c;站长之家为您整理了Dreamweaver教程-在 Dreamweaver 中编写 HTML 代码的相关内容。 1.启动 Dreamweaver CS5 2.点击左上角…

dw写HTML怎么设置背景颜色,dreamweaver cs6设置div背景颜色的具体操作教程

最近有不少刚刚接触dreamweaver cs6的伙伴们&#xff0c;并不是很熟悉其中是怎么设置div背景颜色?本期为你们分享的文章就讲述dreamweaver cs6设置div背景颜色的具体流程介绍。 dreamweaver cs6设置div背景颜色的具体操作教程 首先需要打开dreamweaver cs6软件&#xff0c;添加…

dw html转为css,DIV+CSS辅助软件Dreamweaver介绍

DIVCSS开发软件之Adobe Dreamweaver介绍 接下来我们(www.divcss5.com)给大家介绍是大家最熟悉不过的软件Adobe Dreamweaver&#xff0c;他被称为网页三剑客之一主要成员。 Dreamweaver我们常称他为DW,是开发DIVCSS比较好的工具。 Dreamweaver特点 1、开发css具体完善快捷简便提…

html中水平线颜色代码,网页设计水平线代码 怎么在dw中修改水平线的颜色

在Dreamweaver里有以下办法&#xff1a; 设计视图&#xff0c;点插入菜单-HTML-水平线&#xff0c;或者在代码视图&#xff0c;直接输入即可&#xff1b; 插入一个高度为1px的表格或div&#xff0c;一定要删除空格符 &#xff0c;div的话还要设置超出隐藏&#xff1b; 可以用CS…

html基础dw,HTML基础DW使用教程

1、打开文件拓展名&#xff1a; 方法一.打开计算机→组→文件夹和搜索选项→查看&#xff0c;把隐藏拓展名的勾取掉。 方法二.打开计算机→文件夹选项→查看&#xff0c;把隐藏拓展名的勾取掉。 2.桌面新建一个记事本&#xff0c;把.txt后缀改成HTML。 3.右键打开方式&#xff…

前端基础--DW的使用

前端基础–DW 开发工具与关键技术&#xff1a;DW/浏览器 &#xff1b; DW的使用。 作者&#xff1a;刘佳明 撰写时间&#xff1a;2019年1月 28 日 在学习前端的第一步首先便是学会正确的使用DW这一个编程app&#xff1b;下面便由我自己编写关于DW的使用过程 第一步&#xff…

dw怎么让html使用css样式,dw怎么用css样式?

dw怎么用css样式&#xff1f; 首先介绍一下CSS样式的属性&#xff1a; CSS样式属性被分为八大类&#xff1a;类型&#xff0c;背景&#xff0c;区块&#xff0c;方框&#xff0c;边框&#xff0c;列表&#xff0c;定位&#xff0c;扩展。 类型主要定义文本的字体&#xff0c;大…

Dwr 实例教程

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者&#xff1a; 永恒の_☆ 地址&#xff1a; http://blog.csdn.net/chenghui0317/article/details/9842873 一、Dwr的介绍 Dwr 简称 Direct…

Dreamweaver css盒模型

CSS盒模型概述&#xff1a;CSS盒模型(Box Model)规定了元素处理元素内容&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;、外边距&#xff08;margin&#xff09;的方式。 下图为盒模型模型图 盒模型各部分说明…

Dreamweaver css定位

规定元素的定位类型。 说明&#xff1a;这个属性定义建立元素布局所用的定位机制。任何元素都可以定位&#xff0c;不过绝对定位或固定元素会生成一个块级框&#xff0c;而不论该元素本身是什么类型。相对定位元素会相对于它在正常流中的默认位置偏移。 通过设置top bottom l…

DWR(2):DWR配置详情

下面我们通过一个简单的入门项目来讲解DWR的配置。 首先新建一个maven项目&#xff0c;结构如下&#xff1a; 1 引入依赖 <dependency><groupId>org.directwebremoting</groupId><artifactId>dwr</artifactId><version>3.0.0-RELEASE<…

DreamWeaver下如何应用CSS样式

首先介绍一下CSS样式的属性&#xff1a; CSS样式属性被分为八大类&#xff1a;类型&#xff0c;背景&#xff0c;区块&#xff0c;边框&#xff0c;列表&#xff0c;定位&#xff0c;扩展。 类型主要定义文本的字体&#xff0c;大小&#xff0c;颜色&#xff0c;行高和修饰等…

DW的基本操作

1、首先先打开我们的DW软件。 2、进去之后点新建创建一个HTML的文档。 3、在桌面先创建一个文件夹&#xff0c;方便放文档之类的。 4、进去之后鼠标右键点右上角的Untitled- &#xff0c;再点另存为找到你之前创的那个文件夹&#xff0c;点进去&#xff0c;然后把他存放在这个文…

【CF #782 Div2】 A-D

A. Red Versus Blue 题目 分析 红方蓝方打比赛&#xff0c;确定红方比蓝方厉害&#xff0c;连胜的概率最低&#xff0c;排出比赛结果可能的序列。 因为R比B多&#xff0c;所以考虑在B之间插入R&#xff0c;b个B需要将R分为b1组&#xff0c;需要连胜数最小&#xff0c;就把R…

Dreamweaver css选择器

在 CSS 中&#xff0c;选择器是选取需设置样式的元素的模式。 下面我们介绍几种常用选择器: 元素选择器:通过选择html标签设置css样式 示例&#xff1a;直接选取p标签设置文本颜色 类选择器&#xff1a;通过设置class类设置css样式 注意&#xff1a;class命名不能以数字开头…