遗传算法及python实现

article/2025/11/6 21:37:07

目录

一、遗传算法概念

二、遗传算法应用实例

基础概念:       

1、种群和个体:

2、编码、解码与染色体:

3、适应度和选择:

4、 交叉、变异:

三、遗传算法python完整代码


适者生存,不适者淘汰

一、遗传算法概念

        用于解决最优化问题的一种搜索算法

 (1)具有相同或类似的功能的算法:

  • 粒子群算法(PSO)
  • 退火算法
  • 蚁群算法

 (2)常用场景:求解目标函数的最大值或者最小值问题

二、遗传算法应用实例

目标函数:

z=3(1-x)^{2}e^{-x^{2}-(y+1)^{2}}-10(\frac{x}{5}-x^{3}-y^{5})e^{-x^{2}-y^{2}}-\frac{1}{3}^{e^{-(x+1)^{2}-y^{2}}}

函数图像:

        

基础概念:       

1、种群和个体:

        在遗传算法里,个体通常为某个问题的一个解,并且该解在计算机中被编码为一个向量表示

在该例子中,问题的一个可能解的通用形式为(x,y),例如(0,1),(2,3)......而这一组组可能解组成的集合叫作种群。

2、编码、解码与染色体:

  • 编码:将一组可能解编码成一个向量,即我们将不同的实数转化成不同的0,1二进制串表示,其中保持某种映射关系y=f(x)。考虑到遗传算法的程序中,我们首先是对二进制串进行操作的,而不是先随机生成十进制数再编码的,因此我们无需知道具体的映射关系。  
  • 解码:将编码后的二进制串转换成十进制串,也就是需要y=f(x)的逆映射。

        1. 将二进制码按权展开,转化成十进制数

                例如:二进制码为 [1 1 0 1 0] ,转化成十进制数为                1*2^{4}+1*2^{3}+0*2^{2}+1*2^{1}+0*2^{0}=26

        2. 将转化的十进制数压缩到[0,1]之间的小数

                                       例如:\frac{26}{2^{5}-1}=0.8387

        3. 将这个小数映射到我们所需要的区间内

                                        例如:我们此时函数中x的取值范围为[-3,3],y的取值范围为[-3,3]

                                          x_{1}=0.8387\times (3-(-3))+(-3)=2.0323

y1=0.8387\times (3-(-3))+(-3)=2.0323

        通用公式:num为2步得到的小数,x_{high}为x的上限,x_{low}为x的下限,y_{high}为y的上限,      ,y_{low}为y的下限

        x1 = num*(x_{high}-x_{low})+x_{low}

      y1=num*(y_{high}-y_{low})+y_{low}

3、适应度和选择:

        我们在求最大值的问题中可以直接用可能解(个体)对应的函数的函数值的大小来评估,这样可能解对应的函数值越大越有可能被保留下来。在求最小值问题上,函数值越小的可能解对应的适应度应该越大,同时适应度也不能为负值,先将适应度减去最大预测值,将适应度可能取值区间压缩为 [ n p . m i n ( p r e d ) − n p . m a x ( p r e d ) , 0 ] [np.min(pred)-np.max(pred), 0] [np.min(pred)−np.max(pred),0],然后添加个负号将适应度变为正数,同理为了不出现0,最后在加上一个很小的正数。

#求解函数最大值
def get_fitness(pop): x,y = translateDNA(pop) #解码过程pred = F(x, y) #代入原函数求解适应度return (pred - np.min(pred)) + 1e-3 #减去最小的适应度是为了防止适应度出现负数,通过这一步fitness的范围为[0, np.max(pred)-np.min(pred)],最后在加上一个很小的数防止出现为0的适应度#求解函数最小值
def get_fitness(pop): x,y = translateDNA(pop)pred = F(x, y)return -(pred - np.max(pred)) + 1e-3

  选择时的原则: 适应度越高,被选择的机会越高,而适应度低的,被选择的机会就低。而不是完全以适应度高低为导向,否则容易陷入局部最优解。

def select(pop, fitness):    # nature selection wrt pop's fitnessidx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,p=(fitness)/(fitness.sum()) )return pop[idx]

4、 交叉、变异:

        交叉是指每一个个体是由父亲和母亲两个个体繁殖产生,子代个体的DNA(二进制串)获得了一半父亲的DNA,一半母亲的DNA,但是这里的一半并不是真正的一半,这个位置叫做交配点,是随机产生的,可以是染色体的任意位置。通过交叉子代获得了一半来自父亲一半来自母亲的DNA,但是子代自身可能发生变异,使得其DNA即不来自父亲,也不来自母亲,在某个位置上发生随机改变,通常就是改变DNA的一个二进制位(0变到1,或者1变到0)。        

找交配片段的方法:对DNA进行剪接,找到两处随机点位置,对中间的片段进行交叉操作。

交叉概率,范围一般是0.6~1,突变常数(又称为变异概率),通常是0.1或者更小。

#交叉
def crossover_and_mutation(pop, CROSSOVER_RATE = 0.8):new_pop = []for father in pop:		#遍历种群中的每一个个体,将该个体作为父亲child = father		#孩子先得到父亲的全部基因(这里我把一串二进制串的那些0,1称为基因)if np.random.rand() < CROSSOVER_RATE:			#产生子代时不是必然发生交叉,而是以一定的概率发生交叉mother = pop[np.random.randint(POP_SIZE)]	#再种群中选择另一个个体,并将该个体作为母亲cross_points = np.random.randint(low=0, high=DNA_SIZE*2)	#随机产生交叉的点child[cross_points:] = mother[cross_points:]		#孩子得到位于交叉点后的母亲的基因mutation(child)	#每个后代有一定的机率发生变异new_pop.append(child)return new_pop#变异
def mutation(child, MUTATION_RATE=0.003):if np.random.rand() < MUTATION_RATE: 				#以MUTATION_RATE的概率进行变异mutate_point = np.random.randint(0, DNA_SIZE)	#随机产生一个实数,代表要变异基因的位置child[mutate_point] = child[mutate_point]^1 	#将变异点的二进制为反转

三、遗传算法python完整代码

转载:遗传算法详解 附python代码实现_重学CS的博客-CSDN博客_python遗传算法


import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3DDNA_SIZE = 24
POP_SIZE = 200
CROSSOVER_RATE = 0.8
MUTATION_RATE = 0.005
N_GENERATIONS = 50
X_BOUND = [-3, 3]
Y_BOUND = [-3, 3]def F(x, y):return 3*(1-x)**2*np.exp(-(x**2)-(y+1)**2)- 10*(x/5 - x**3 - y**5)*np.exp(-x**2-y**2)- 1/3**np.exp(-(x+1)**2 - y**2)def plot_3d(ax):X = np.linspace(*X_BOUND, 100)Y = np.linspace(*Y_BOUND, 100)X,Y = np.meshgrid(X, Y)Z = F(X, Y)ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=cm.coolwarm)ax.set_zlim(-10,10)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')plt.pause(3)plt.show()def get_fitness(pop): x,y = translateDNA(pop)pred = F(x, y)return (pred - np.min(pred)) + 1e-3 #减去最小的适应度是为了防止适应度出现负数,通过这一步fitness的范围为[0, np.max(pred)-np.min(pred)],最后在加上一个很小的数防止出现为0的适应度def translateDNA(pop): #pop表示种群矩阵,一行表示一个二进制编码表示的DNA,矩阵的行数为种群数目x_pop = pop[:,1::2]#奇数列表示Xy_pop = pop[:,::2] #偶数列表示y#pop:(POP_SIZE,DNA_SIZE)*(DNA_SIZE,1) --> (POP_SIZE,1)x = x_pop.dot(2**np.arange(DNA_SIZE)[::-1])/float(2**DNA_SIZE-1)*(X_BOUND[1]-X_BOUND[0])+X_BOUND[0]y = y_pop.dot(2**np.arange(DNA_SIZE)[::-1])/float(2**DNA_SIZE-1)*(Y_BOUND[1]-Y_BOUND[0])+Y_BOUND[0]return x,ydef crossover_and_mutation(pop, CROSSOVER_RATE = 0.8):new_pop = []for father in pop:		#遍历种群中的每一个个体,将该个体作为父亲child = father		#孩子先得到父亲的全部基因(这里我把一串二进制串的那些0,1称为基因)if np.random.rand() < CROSSOVER_RATE:			#产生子代时不是必然发生交叉,而是以一定的概率发生交叉mother = pop[np.random.randint(POP_SIZE)]	#再种群中选择另一个个体,并将该个体作为母亲cross_points = np.random.randint(low=0, high=DNA_SIZE*2)	#随机产生交叉的点child[cross_points:] = mother[cross_points:]		#孩子得到位于交叉点后的母亲的基因mutation(child)	#每个后代有一定的机率发生变异new_pop.append(child)return new_popdef mutation(child, MUTATION_RATE=0.003):if np.random.rand() < MUTATION_RATE: 				#以MUTATION_RATE的概率进行变异mutate_point = np.random.randint(0, DNA_SIZE*2)	#随机产生一个实数,代表要变异基因的位置child[mutate_point] = child[mutate_point]^1 	#将变异点的二进制为反转def select(pop, fitness):    # nature selection wrt pop's fitnessidx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,p=(fitness)/(fitness.sum()) )return pop[idx]def print_info(pop):fitness = get_fitness(pop)max_fitness_index = np.argmax(fitness)print("max_fitness:", fitness[max_fitness_index])x,y = translateDNA(pop)print("最优的基因型:", pop[max_fitness_index])print("(x, y):", (x[max_fitness_index], y[max_fitness_index]))if __name__ == "__main__":fig = plt.figure()ax = Axes3D(fig)	plt.ion()#将画图模式改为交互模式,程序遇到plt.show不会暂停,而是继续执行plot_3d(ax)pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE*2)) #matrix (POP_SIZE, DNA_SIZE)for _ in range(N_GENERATIONS):#迭代N代x,y = translateDNA(pop)if 'sca' in locals(): sca.remove()sca = ax.scatter(x, y, F(x,y), c='black', marker='o');plt.show();plt.pause(0.1)pop = np.array(crossover_and_mutation(pop, CROSSOVER_RATE))#F_values = F(translateDNA(pop)[0], translateDNA(pop)[1])#x, y --> Z matrixfitness = get_fitness(pop)pop = select(pop, fitness) #选择生成新的种群print_info(pop)plt.ioff()plot_3d(ax)

在Visual Studio Code中运行结果如下:

 

 

  •  max_fitness: 0.001246770880719005
  • 最优的基因型: [1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1

                                 0 0 1 0 1 0 0 1 1 1 1]

  • (x, y): (0.09614021159054165, 1.4999898970121084)

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

相关文章

遗传算法详解python代码实现以及实例分析

遗传算法 文章目录 遗传算法前言一、遗传算法是什么&#xff1f;二、实例讲解例题11.初始化种群2.优胜劣汰3.根据优胜劣汰的结果&#xff0c;交配生殖、变异5.生物遗传进化 例题21.初始化参数2.定义环境&#xff08;定义目标函数&#xff09;3.DNA解码&#xff08;计算x&#x…

遗传算法实例解析

遗传算法实例及MATLAB程序解析 遗传算法Genetic Algorithms&#xff0c;GA&#xff09;是一种基于自然选择原理和自然遗传机制的搜索&#xff08;寻优&#xff09;算法&#xff0c;它是模拟自然界中的生命进化机制&#xff0c;在人工系统中实现特定目标的优化。遗传算法的实质是…

遗传算法详解及代码实现

遗传算法 定义相关术语交叉变异产生子代完整过程 遗传算法应用问题的提出与解决方案“袋鼠跳”问题爬山法&#xff08;最速上升爬山法&#xff09;模拟退火遗传算法 遗传算法实现过程遗传算法的一般步骤遗传算法图解进化细节种群和个体编码方法二进制编码浮点编码法符号编码法 …

遗传算法详解

转载&#xff1a;https://blog.csdn.net/u010451580/article/details/51178225 三&#xff1a;遗传算法 照例先给出科学定义&#xff1a; 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起…

遗传算法(Genetic Algorithm)详解与实现

遗传算法&#xff08;Genetic Algorithm&#xff09;详解与实现 遗传算法简介类比达尔文进化论达尔文进化理论遗传算法对应概念 遗传算法理论图式定理&#xff08;schema theorem&#xff09; 遗传算法与传统算法的差异遗传算法的优缺点优点局限性 遗传算法应用场景遗传算法的组…

经典遗传算法及MATLAB实例

经典遗传算法及简单实例&#xff08;MATLAB&#xff09; 1. 遗传算法简单介绍1.1 理论基础1.2 算法要点1.1 编码1.2 适应度函数 1.3 基本流程 2. 代码实例&#xff08;MATLAB&#xff09;2.1 代码汇总2.1 初始化种群2.2 计算适应度2.3 迭代终止判断2.4 自然选择&#xff08;轮盘…

遗传算法及实例

遗传算法是模拟生物在自然环境下遗传的过程而形成的自适应全局优化搜索算法。如果把某个问题的可行域看作是一个族群&#xff0c;目标函数看作是自然选择的条件&#xff0c;那么&#xff0c;这个族群通过一代又一代的繁衍和进化最终变成最接近筛选条件的样子。遗传算法就是利用…

遗传算法原理及算法实例

遗传算法原理解析 遗传算法&#xff08;GA&#xff09;是一种元启发式自然选择的过程&#xff0c;属于进化算法&#xff08;EA&#xff09;大类。遗传算法通常是利用生物启发算子&#xff0c;如变异、交叉和选择来生成高质量的优化和搜索问题的解决方案。 借鉴生物进化理论&…

遗传算法小结及算法实例(附Matlab代码)

目录 1、遗传算法流程 2、关键参数说明 &#xff08;1&#xff09;群体规模 \(NP\) &#xff08;2&#xff09;交叉概率 \(P_c\) &#xff08;3&#xff09;变异概率 \(P_m\) &#xff08;4&#xff09;进化代数 \(G\) 3、MATLAB仿真实例 3.1 遗传算法求解一元函数的极…

遗传算法(Genetic Algorithm,GA)实例详解

遗传算法是模拟生物在自然环境中的遗传和进化的过程而形成的自适应全局优化搜索算法&#xff0c;他能有效求解NP问题以及非线性、多峰函数优化和多目标优化问题。 1.理论基础 1.1生物学基础 遗传算法的生物学基础是借鉴了达尔文的进化论和孟德尔的遗传学说&#xff0c;一个种…

遗传算法设计实例

1.遗传算法实例程序设计 随机初始化种群P(t){x1,x2…xn),计算P(t)中个体的适应值。其MATLAB程序的基本格式如下: Begin t0 初始化P(t) 计算P(t)的适应值; while (不满足停止准则)dobegintt1从P(t1)中选择P(t)重组P(t)计算P(t)的适应值 end例1 求函数 f(x) 9*sin(5x) cos(4x)…

遗传算法GA原理详解及实例应用 附Python代码

遗传算法GA 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型&#xff0c;是一种通过模拟自然进化过程搜索最优解的方法。 生物在自然界中的生存繁衍&#xff0c;显示了其对自然环境的优异的自适…

vue实现点击下载exe,运行报错shellexecuteex失败 代码2

页面效果 exe插件放在vue项目的public文件夹里&#xff0c;然后用a标签实现点击下载 <a href"/VideoWebPlugin.exe">下载插件</a> 成功下载后运行报错 解决方法&#xff1a;选择在文件夹中显示&#xff0c;右击属性&#xff0c;在兼容性设置里的以管理员…

VC++分别使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx来启动程序(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)

API函数ShellExecute与ShellExecuteEx用法

ShellExecute: 1.函数功能:你可以给它任何文件的名字,它都能识别出来并打开它。2.函数原型: HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); 3.参数说明:hwnd:用于指定父窗口句…

C/C++ 使用 API 函数 ShellExecuteEx 实现文件打印

本文章主要介绍使用ShellExecuteEx实现打印文件的功能。 函数原型&#xff1a;BOOL ShellExecuteExA(__inout SHELLEXECUTEINFOA *pExecInfo) 输入输出参数都是 SHELLEXECUTEINFO 结构体。 SHELLEXECUTEINFO定义&#xff1a; typedef struct _SHELLEXECUTEINFO { DWORD c…

Windows函数 ShellExecuteEx

点击进入视频教程 代码&#xff1a; #include<windows.h> #include<tchar.h> #pragma comment(lib, "Urlmon.lib") int WINAPI _tWinMain(HINSTANCE hinstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nShowCmd) {// 下载图片&#xff0c;并保…

UpdatePanel终于可以上传文件了!

我们要做的&#xff0c;只是在页面上添加一个控件而已。 不过&#xff0c;其实这只是个半成品&#xff0c;或者说是一个原型&#xff0c;但是很明显&#xff0c;我们做对了。:) 在实现上&#xff0c;我曾经在两个做法上斟酌了许久&#xff0c;第一种是继承ScriptManager&#x…

updatepanel 排版问题

使用 ASP.NET AJAX 開發人員&#xff0c;一定不會錯過 UpdatePanel 這個超級控制項&#xff0c;它可以讓輕易的讓原有設計的頁面很輕易的具有 AJAX 的效果。可是在設計階段使用 UpdatePanel 去排版常造成我們的困擾&#xff0c;放置在 UpdatePanel 中的控制項無法正確呈現實際的…

学习UpdatePanel控件-

原文可以显示图片&#xff08;转载&#xff1a;http://blog.csdn.net/ILOVEMSDN/archive/2007/11/11/1879343.aspx&#xff09; UpdatePanel控件的使用 2008-10-07 05:46 P.M. ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是…