当前位置: 首页 > news >正文

绍兴市网站建设_网站建设公司_留言板_seo优化

国外网站域名查询,建设部的网站,安阳县公共资源交易中心,深圳市住房和建设局网站公示前言 其实最优化问题#xff0c;从小学开始学习数学的时候就可以说已经接触到了#xff0c;在我印象中有个问题#xff0c;用一个平底锅煎饼#xff0c;每次只能放2只饼#xff0c;煎一只饼要2分钟#xff08;正反各用1分钟#xff09;#xff0c;煎三只饼要几分钟。这…前言 其实最优化问题从小学开始学习数学的时候就可以说已经接触到了在我印象中有个问题用一个平底锅煎饼每次只能放2只饼煎一只饼要2分钟正反各用1分钟煎三只饼要几分钟。这个问题其实已经可以归为最优化问题我们实际计算出的时间和真实最节省的时间不断对比去调整煎饼方案得到时间花费最短的方案得到最优解。其实这个问题将对象换一下将煎饼时间换为损失函数将煎饼换为训练模型那这个问题就是最优化问题了。根据我们训练出的模型不论是回归还是分类总体上总归和原标签是有损失的要得到更为优秀的模型就要不断的去降低损失值。深度学习系列文章已经把损失函数体系全部都讲解完毕不论是回归模型、分类模型、聚类模型还是生成模型问题如果有需要的同学不要错过。此章节将梳理模型训练最优化问题原理和基础理论以及讲解常用的最优化算法设计和实现。 博主专注建模四年参与过大大小小数十来次数学建模理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。若你渴望突破数学建模的瓶颈不要错过笔者精心打造的专栏。愿你能在这里找到你所需要的灵感与技巧为你的建模之路添砖加瓦。 一文速学-数学建模常用模型 一、最优化问题基础 以文字去说明最优化问题理解起来是十分抽象且难以起到工程化总结归纳的效果固我们用数学模型来表示最优化问题的数学模型一般形式可以描述为下面的结构 m i n i m i z e f ( x ) minimize f(x) minimizef(x) s u b j e c t t o g i ( x ) ≤ 0 , i 1 , . . . , m subject to g_{i}(x)≤0,i1,...,m subjecttogi​(x)≤0,i1,...,m h j ( x ) 0 , j 1 , . . . , p h_{j}(x)0,j1,...,p hj​(x)0,j1,...,p 这里的各个组成部分含义如下 f ( x ) f(x) f(x)目标函数它是我们希望最小化或最大化的函数。在最大化问题中通常将其取负后转化为最小化问题。 x x x决策变量可以是标量或向量。在多维情况下 x x x 表示一个决策向量。 g i ( x ) g_{i}(x) gi​(x)不等式约束函数它限制了决策变量的可行解必须位于一定的范围内。 h j ( x ) h_{j}(x) hj​(x)等式约束函数它精确地限制了某些变量的关系。 在没有约束的情况下最优化问题可以简化为仅最小化或最大化目标函数 f ( x ) f(x) f(x)。可能讲到这里大家一看到数学公式又犯懵了我们再来这么理解 想象你在玩一款视频游戏你的目标是得到尽可能多的分数这就像是你的目标函数 f ( x ) f(x) f(x)分数是由你的游戏行为决策变量 x x x)决定的。但是游戏中有一些规则 有一些任务你必须避免做到这就是不等式约束 g i ( x ) ≤ 0 g_{i}(x)≤0 gi​(x)≤0比如说你的角色不能掉入陷阱里否则你会失分或者游戏结束。另外有一些必须完成的任务等式约束 h j ( x ) 0 ℎ_{j}(x)0 hj​(x)0比如说你需要收集所有的金币才能过关。. 在游戏的可行区域就是你能在游戏规则下行动的空间内你需要找到最好的策略来完成关卡并且得到最高分。这就是你在最优化问题中尝试完成的任务在一定的规则内找到最佳的解决方案。在现实世界的问题中你可能会寻找成本最低的生产策略、最快的路线或者最有效的广告投放方案而这些都需要在特定的限制和规则下进行。 在不同的领域这个一般形式的最优化问题可能有更具体的变体。例如 线性规划Linear Programming, LP目标函数和所有约束都是线性的。非线性规划Nonlinear Programming, NLP目标函数或某些约束是非线性的。整数规划Integer Programming所有或部分决策变量被限制为整数。混合整数线性规划Mixed Integer Linear Programming, MILP某些决策变量是整数且目标函数和约束都是线性的。动态规划Dynamic Programming用于多阶段决策过程优化的方法可以分解为一系列相互关联的子问题。 理解了以上最优化算法的大体框架之后我们需要开始学习一些更细致化的理论知识。从最优化算法的建模步骤开始我们来逐渐拆解建模过程 定义问题明确目标函数变量以及任何可能的约束条件。选择合适的优化方法根据问题的特性选择一个有效的优化算法。初始化参数为变量选择一个初始值。迭代优化通过迭代过程改进变量以最小化目标函数。终止条件设定一个停止标准例如迭代次数、目标函数的变化量或计算资源限制。 1.目标函数 目标函数或成本函数、损失函数是最优化问题的核心它是需要最大化或最小化的函数。在机器学习中目标函数通常衡量模型预测值与实际值之间的差异因为之前有详细讲过各个模型的类型函数这里不过多讲解 2. 变量 在最优化问题中变量是决定目标函数值的因素。在机器学习模型中变量通常指模型的参数如权重和偏置。通过损失函数的值不断的调整变量权重就是优化过程。 3.约束条件 在最优化问题中约束条件定义了解决方案必须遵守的规则。这些规则可以限制解决方案的取值范围或指定某些变量之间的关系。约束条件通常分为两类等式约束和不等式约束。 3.1等式约束 等式约束指定了变量之间必须满足的精确关系。举个例子如果我们正在设计一个小工具其中一个部件的长度加上另一个部件的两倍长度必须总共等于10厘米那么这就是一个等式约束。数学表达为 h j ( x ) 0 h_{j}(x)0 hj​(x)0,其中 h j ( x ) h_{j}(x) hj​(x)是一个函数它描述了变量 x x x之间的关系而 j j j只是一个索引用于当有多个等式约束时进行区分。 3.2不等式约束 不等式约束定义了变量的取值范围而不是确切的值。例如如果你有一个背包它的承重限制是20公斤那么你放入背包的物品总重量就受到了一个不等式约束。数学表达为 g i ( x ) ≤ 0 g_{i}(x)≤0 gi​(x)≤0,其中 g i ( x ) g_{i}(x) gi​(x)表示变量 x x x与允许的极限值之间的差距 i i i是约束的索引用于区分多个不等式约束。 3.3约束条件的重要性 约束条件在最优化问题中至关重要因为它们确保了解决方案是可行的。在没有约束的情况下最优化问题可能会导致不现实或不可行的解决方案。例如在工程设计问题中如果没有考虑材料的强度或成本可能会得到理论上效率最高但实际上无法构建或成本过高的设计。 4.最优化算法 最优化算法是一系列解决最优化问题的数学方法它们的目标是在给定的条件下寻找最佳的决策变量值。这些变量值可以最小化或最大化一个目标函数。也就是找到最优权重的 x x x,这里简单介绍一下各类最优化算法: 4.1梯度下降Gradient Descent 梯度下降是最常见的最优化算法之一特别是在机器学习领域。这种方法通过计算目标函数的梯度来找到函数值下降最快的方向。然后它按照这个方向调整变量值以此来减少函数值。梯度下降分为几种类型 批梯度下降在每一步使用所有数据计算梯度。随机梯度下降SGD在每一步只使用一个数据样本来计算梯度。小批量梯度下降介于批梯度下降和随机梯度下降之间它在每一步使用一小批数据来计算梯度。 4.2牛顿法和拟牛顿法 这些方法利用了目标函数的二阶导数信息即海森矩阵提供了更快的收敛速率特别是接近最优解时。拟牛顿法是一类不需要显式计算海森矩阵的方法例如BFGS和L-BFGS它们适用于大规模问题的优化。 4.3动量方法 动量方法在SGD的基础上增加了一个动量项有助于加速SGD在相关方向上的导数并抑制震荡从而加快收敛速度。 4.4AdamAdaptive Moment Estimation Adam结合了动量方法和RMSprop的优点。它计算了梯度的一阶矩即平均值和二阶矩即未中心化的方差然后用这些矩来调整每个参数的学习率。 4.5约束最优化 在有约束的情况下拉格朗日乘数法是处理等式约束的经典方法。对于不等式约束可以使用KKTKarush-Kuhn-Tucker条件它是拉格朗日乘数法的一种推广。 4.6启发式和元启发式算法 对于某些复杂的或非凸优化问题传统的梯度方法可能不适用或效率较低。启发式算法如遗传算法、粒子群优化PSO和模拟退火提供了替代的全局搜索策略。 4.7贝叶斯优化 贝叶斯优化是一种基于概率模型的全局优化策略特别适用于那些目标函数评估代价很高的问题。它使用高斯过程来建立目标函数的代理模型并使用这个模型来指导搜索。 5.凸性 凸性是最优化和数学分析中的一个核心概念。它描述了一个数学对象如集合或函数的形状特性。当我们说一个集合或函数是凸的我们在描述其内部的结构和与其相关的直观几何属性。 5.1凸集 一个集合被称为凸集如果它内部的任意两点之间的直线段都完全包含在该集合内部。形式化地说一个集合 C C C是凸的如果对于任意两点 x , y ∈ C x,y∈C x,y∈C 和任意 θ θ θ满足 0 ≤ θ ≤ 1 0≤θ≤1 0≤θ≤1,以下条件成立 θ x ( 1 − θ ) y ∈ C θx(1-θ)y∈C θx(1−θ)y∈C 5.2凸函数 一个函数 f : R n − R f:R^n-R f:Rn−R被称为凸函数如果它的定义域是一个凸集并且对于定义域内的任意两点x和y以及任意 θ θ θ满足 0 ≤ θ ≤ 1 0≤θ≤1 0≤θ≤1以下不等式成立 f ( θ x ( 1 − θ ) y ) ≤ θ f ( x ) ( 1 − θ ) f ( y ) f(θx(1-θ)y)≤θf(x)(1-θ)f(y) f(θx(1−θ)y)≤θf(x)(1−θ)f(y) 直观上这意味着函数的图形之上的任意一点和图形上任意两点连线之间的区域也在图形之上。这也意味着凸函数的局部最小值也是全局最小值。 函数 f ( x ) x 2 f(x)x^2 f(x)x2是一个典型的凸函数。我们可以观察到对于定义域内的任意两点函数图像上的线段始终位于函数曲线的上方这是凸函数的关键特性。在整个定义域内这个函数的任何局部最小值也是全局最小值而对于这个特定的函数最小值在 x 0 x0 x0处取得。 5.3凸性的重要性 凸性在最优化问题中非常重要因为它保证了最优化问题具有良好的数学性质 全局最优解凸优化问题的任何局部最优解也是全局最优解。优化算法针对凸问题的优化算法通常更简单更容易分析并且更容易实现。稳定性凸问题的解通常对问题数据的微小变化具有稳定性。 5.4凸优化 凸优化是研究凸函数或凸集合上的优化问题的一个子领域。由于凸问题的特殊性质凸优化通常比一般的优化问题要容易解决得多。 5.5判断凸性 对于凸集判断凸性相对直观。而对于凸函数判断一个函数是否为凸可以通过计算其二阶导数如果存在来完成。如果函数的二阶导数是正的对于一维函数或者海森矩阵是半正定的对于多维函数那么这个函数是凸函数。 6.导数与梯度 在最优化问题中导数和梯度是核心的数学概念用来描述目标函数如何随变量变化而变化并指导我们如何找到函数的最小值或最大值。 6.1导数Derivative 导数是单变量微积分中的基本概念它描述了函数在某一点处随变量的变化率。对于函数 f ( x ) f(x) f(x)在点 x x x处的导数通常表示为 f ′ ( x ) f(x) f′(x)或 d f d x \frac{df}{dx} dxdf​​。导数告诉我们函数在这一点的斜率以及函数值是增加还是减少。如果导数为正那么函数在这一点上随着变量增加而增加如果导数为负函数随变量增加而减少。如果导数为零那么这一点可能是函数的局部极大值、局部极小值或鞍点。在最优化中我们通常寻找使导数为零的点因为这些点是潜在的最优点。 6.2梯度 梯度下降算法基于的思想是要找到函数的最小值最好的方法是沿着该函数的下降方向探寻。对此我们需要明白代表函数变化快慢的导数以及偏导数在此基础上我们不仅要知道函数在坐标轴正方向上的变化率即偏导数而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。梯度与方向导数有一定的关联性在微积分里面对多元函数的参数求delta偏导数把求得的各个参数的偏导数以向量的形式写出来就是梯度。 纯数理化的知识可能比较难懂我们可以结合实际例子来了解一座高度在 ( x , y ) (x,y) (x,y)点是 H ( x , y ) H(x,y) H(x,y)的山。 H H H这一点的梯度是在该点坡度或者说斜度最陡的方向。梯度的大小告诉我们坡度到底有多陡。 梯度也可以告诉我们一个数量在不是最快变化方向的其他方向的变化速度。再次结合山坡的例子。可以有条直接上山的路其坡度是最大的则其坡度是梯度的大小。也可以有一条和上坡方向成一个角度的路例如投影在水平面上的夹角为60°。则若最陡的坡度是40%这条路的坡度小一点是20%也就是40%乘以60°的余弦。 这个现象可以如下数学的表示。山的高度函数 H H H的梯度点积一个单位向量给出表面在该向量的方向上的斜率。这称为方向导数。梯度的方向是函数在该点增长最快的方向而梯度的大小模表示在该方向上函数增长的速率。在最优化问题中我们通常希望找到函数的全局最小值对于最小化问题。通过计算梯度并沿着梯度的反方向即最陡下降方向迭代更新变量值我们可以逼近函数的最小值。 那么了解了以上最优化问题的解答基础之后可以开始逐步关联这些相关理论学习一些最优化算法来达到融会贯通。 二、最优化算法计算原理和实现 1.梯度下降法Gradient Descent 梯度下降算法(GradientDescent Optimization)是常用的最优化方法之一“最优化方法”属于运筹学方法是指在某些约束条件下为某些变量选取哪些值可以使得设定的目标函数达到最优问题。最优化方法有很多种常见的有梯度下降法、牛顿法、共轭梯度法等等。 import numpy as np import matplotlib.pyplot as plt if __name__ __main__:plot_x np.linspace(-1,6,141)#从-1到6选取141个点plot_y (plot_x - 2.5)**2 -1 #二次方程的损失函数plt.scatter(plot_x[5],plot_y[5],colorr) #设置起始点颜色为红色plt.plot(plot_x,plot_y)#设置坐标轴名称plt.xlabel(theta,fontpropertiessimHei,fontsize15)plt.ylabel(损失函数,fontpropertiessimHei,fontsize15)plt.show()上述代码画出损失函数示意图x轴代表的是参数thetay轴代表的是损失函数的值(即Loss值)曲线y代表的是损失函数。我们的目标是希望通过大量的数据训练和调整参数theta使得损失函数的值最小可以通过求导数的方式达到二次方程的最小值点使得导数为0即可。梯度下降中有个比较重要的参数学习率eta它控制模型寻找最优解的速度。 首先定义损失函数以及导数 def J(theta): #损失函数return (theta-2.5)**2-1 def dJ(theta): #损失函数的导数return 2*(theta-2.5)通过matplotlib绘制梯度下降迭代过程 theta 0.0 #初始点 theta_history [theta] eta 0.1 #步长 epsilon 1e-8 #精度问题或者eta的设置无法使得倒数为0 while True:gradient dJ(theta)last_theta theta #先记录下上一个theta的值theta theta - eta * gradient #得到一个新的thetatheta_history.append(theta)if(abs(J(theta)-J(last_theta))epsilon):break #当两个theta值非常接近的时候终止循环 plt.plot(plot_x,J(plot_x),colorr) plt.plot(np.array(theta_history),J(np.array(theta_history)),colorb,markerx) plt.show() #一开始的时候导数比较大因为斜率比较陡后面慢慢平缓了 print(len(theta_history)) #一共走了46步学习率对梯度下降法的影响 首先看两个例子一个学习率为0.01另一个为0.8 第一个例子很明显学习的速度变慢了第二个例子蓝色的步长在损失函数之间发生了跳跃不过在跳跃的过程中损失函数的值依然在不断地变小步数是22步因此学习率为0.8时优化过程的时间缩短。当学习率为1.1时 一元二次函数不收敛。学习率是一个需要认真调整的参数过小会导致收敛过慢而过大又可能导致模型不收敛。 2.随机梯度下降Stochastic Gradient Descent, SGD 随机梯度下降Stochastic Gradient Descent简称SGD是一种用于最优化目标函数的算法尤其是在机器学习和深度学习中用于最小化损失函数。它是梯度下降算法的一种变体主要区别在于SGD每次更新参数时只使用一个样本或一个小批量样本来计算梯度而不是像标准梯度下降算法那样使用整个数据集。 SGD的基本步骤如下 随机选择从数据集中随机选择一个样本或一小批样本。计算梯度计算选中样本在当前参数下损失函数的梯度。更新参数根据梯度和学习率更新模型参数。 伪代码如下 for each epoch:Shuffle the datasetfor each sample in the dataset:gradient compute_gradient(sample, parameters)parameters parameters - learning_rate * gradient这种每次只使用一个样本的更新方式使SGD特别适合大规模数据集的训练。SGD能更快地进行参数更新因为它不需要在每次迭代中查看所有数据。此外随机性有助于SGD跳出局部最小值增加找到全局最小值的可能性。然而SGD的缺点是它的更新可能会很嘈杂导致目标函数的收敛路径变得非常波动。为了克服这一点通常会随着时间逐渐减小学习率或者使用SGD的变体如带动量的SGD或者Adam优化器。 import numpy as np# 假设我们有一个简单的线性关系 y 2x 3 noise # 我们将生成一些样本数据来模拟这一关系 np.random.seed(0) x np.random.rand(100, 1) y 2 * x 3 np.random.randn(100, 1) * 0.1# 初始化参数 w np.random.randn(1) b np.random.randn(1)# 学习率 learning_rate 0.1# 进行100次迭代 for epoch in range(100):# 在所有样本中随机选择一个idx np.random.randint(100)x_sample x[idx]y_sample y[idx]# 计算梯度gradient_w -2 * x_sample * (y_sample - (w * x_sample b))gradient_b -2 * (y_sample - (w * x_sample b))# 更新参数w w - learning_rate * gradient_wb b - learning_rate * gradient_b# 输出学习到的参数值 print(fLearned linear function: y {w[0]}x {b[0]}) 输出Learned linear function: y 2.127594940622086x 2.941043061188159 在实际的深度学习应用中梯度的计算会更复杂并且通常会使用自动微分库如TensorFlow或PyTorch来计算梯度。此外为了提高收敛速度和稳定性通常会使用SGD的变体如带动量的SGD、Adam或RMSprop等。 3.AdamAdaptive Moment Estimation AdamAdaptive Moment Estimation算法是一种用于深度学习中的优化算法它结合了Momentum动量和RMSprop均方根传播的思想。Adam 通过计算梯度的一阶矩即均值和二阶矩即未中心化的方差估计来自适应地调整每个参数的学习率。 Adam 算法的关键特点 动量考虑了过去梯度的指数衰减平均帮助加速学习过程。自适应学习率为每个参数计算梯度平方的指数衰减平均调整学习率。偏差校正对一阶矩和二阶矩的估计进行校正以防止它们在训练初期接近于0的偏差。 Adam 算法的更新规则 对于每个参数 θ在每个时间步 t 计算梯度 g t g_{t} gt​。更新有偏一阶矩估计 m t β 1 ∗ m t − 1 ( 1 − β 1 ) ∗ g t m_{t}β_{1}*m_{t-1}(1-β_{1})*g_{t} mt​β1​∗mt−1​(1−β1​)∗gt​更新有偏二阶矩估计 v t β 2 ∗ v t − 1 ( 1 − β 2 ) ∗ g t 2 v_{t}β_{2}*v_{t-1}(1-β_{2})*g^2_{t} vt​β2​∗vt−1​(1−β2​)∗gt2​计算偏差校正后的一阶矩估计 m t ^ m t 1 − β 2 t \hat{m_{t}}\frac{m_{t}}{1-β^t_{2}} mt​^​1−β2t​mt​​计算偏差校正后的二阶矩估计 v t ^ v t 1 − β 2 t \hat{v_{t}}\frac{v_{t}}{1-β^t_{2}} vt​^​1−β2t​vt​​更新参数 θ t 1 θ t − α ∗ m t ^ / ( v t ^ c ) θ_{t1}θ_{t}-α*\hat{m_{t}}/(\sqrt{\hat{v_{t}}c}) θt1​θt​−α∗mt​^​/(vt​^​c ​) 其中 α α α是学习率 β 1 β_{1} β1​和 β 2 β_{2} β2​是衰减率参数通常取值接近1ϵ 是为了保持数值稳定性而加入的一个小常数。下面我们来实现Adam算法 import numpy as np# 假设我们有一个简单的线性关系 y 2x 3 noise np.random.seed(0) x np.random.rand(100, 1) y 2 * x 3 np.random.randn(100, 1) * 0.1# 初始化参数 params np.random.randn(2) m, v np.zeros(2), np.zeros(2)# Adam 参数 alpha, beta1, beta2, epsilon 0.01, 0.9, 0.999, 1e-8# 运行Adam优化 for t in range(1, 1001):# 随机获取样本idx np.random.randint(100)x_i, y_i x[idx], y[idx]# 计算梯度grads 2 * np.array([x_i * (params[0] * x_i params[1] - y_i), (params[0] * x_i params[1] - y_i)]).squeeze()# 更新一阶和二阶矩估计m beta1 * m (1 - beta1) * gradsv beta2 * v (1 - beta2) * (grads ** 2)# 计算偏差校正后的估计m_hat m / (1 - beta1 ** t)v_hat v / (1 - beta2 ** t)# 更新参数params - alpha * m_hat / (np.sqrt(v_hat) epsilon)# 输出学习到的参数值 print(fLearned parameters: {params}) 代码执行成功并且经过Adam优化算法的迭代Learned parameters: [2.68152662 2.64279962]我们得到了参数值[2.68152662,2.64279962]。 这意味着学习到的线性模型大致为 y 2.68 x 2.64 y2.68x2.64 y2.68x2.64接近于我们模拟数据的真实关系。 4.遗传算法Genetic Algorithms, GAs 遗传算法Genetic AlgorithmGA最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。 其主要特点是直接对结构对象进行操作不存在求导和函数连续性的限定具有内在的隐并行性和更好的全局寻优能力采用概率化的寻优方法不需要确定的规则就能自动获取和指导优化的搜索空间自适应地调整搜索方向。 遗传算法以一种群体中的所有个体为对象并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中选择、交叉和变异构成了遗传算法的遗传操作参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。 遗传算法的基本步骤 初始化随机生成一开始的种群。种群由一系列候选解组成每个候选解个体通常是问题解空间中的一个点。评估计算种群中每个个体的适应度Fitness适应度反映了个体解决问题的能力。选择Selection根据个体的适应度选择较优秀的个体进行繁殖。常用的选择方法有轮盘赌选择、锦标赛选择等。交叉Crossover随机选取一对个体作为父母按照某种规则交换它们的部分基因产生新的个体子代。这个过程模拟了生物的交配。变异Mutation以较小的概率随机改变个体中的某些基因这增加了种群的多样性有助于算法跳出局部最优解。替换新一代的个体替换掉旧的个体形成新的种群。这可能会完全替换或是部分替换。终止重复以上步骤直到满足某个终止条件比如达到了最大迭代次数或者种群已经足够优化。 下面我们来简单实现遗传算法 import numpy as np# 目标函数 def fitness_function(x):return np.sum(x**2)# 初始化 def initialize_population(size, n):return np.random.rand(size, n)# 选择 def selection(pop, fitness):idx np.argsort(fitness)return pop[idx[:int(len(idx)/2)]]# 交叉 def crossover(parents, n_children):children []for _ in range(n_children):parent1, parent2 parents[np.random.choice(len(parents), 2, replaceFalse)]child parent1[:len(parent1)//2]child np.concatenate((child, parent2[len(parent2)//2:]))children.append(child)return np.array(children)# 变异 def mutation(children, mutation_rate0.01):for child in children:if np.random.rand() mutation_rate:idx np.random.choice(len(child))child[idx] np.random.rand()return children# 遗传算法 def genetic_algorithm(fitness_function, n_iterations, population_size, n_variables):pop initialize_population(population_size, n_variables)best_fit float(inf)best_solution Nonefor _ in range(n_iterations):fitness np.apply_along_axis(fitness_function, 1, pop)best_idx np.argmin(fitness)if fitness[best_idx] best_fit:best_fit fitness[best_idx]best_solution pop[best_idx]selected selection(pop, fitness)children crossover(selected, len(pop) - len(selected))children mutation(children)pop np.concatenate((selected, children))return best_solution, best_fit# 使用遗传算法 best_solution, best_fitness genetic_algorithm(fitness_function,n_iterations100,population_size50,n_variables5 )print(fBest solution: {best_solution}) print(fBest fitness: {best_fitness}) 在上述代码中目标函数 fitness_function 被定义为 np.sum(x**2)这意味着它会计算一个向量 x 中所有元素的平方和。在遗传算法的上下文中该函数作为一个适应度函数其目的是最小化这个函数值。因此遗传算法在这里的目标是找到一个向量 x使得 x 中元素的平方和尽可能小。由于 x 中的元素都是非负的由于是平方因此最小化平方和实际上等同于找到接近零的向量。上述代码执行结果为 Best solution: [0.02683969 0.07490378 0.34308792 0.01243034 0.06044091] Best fitness: 0.12784788404801556 遗传算法通过模拟自然选择的过程来逐步改进种群中个体的质量最终找到能够产生最低适应度在这个例子中即最小的平方和的解。代码中的 best_solution 就是算法找到的最佳解而 best_fitness 是这个解的适应度值即目标函数的最小值。 itness_function被定义为np.sum(x**2)这意味着它会计算一个向量 x中所有元素的平方和。在遗传算法的上下文中该函数作为一个适应度函数其目的是最小化这个函数值。因此遗传算法在这里的目标是找到一个向量x使得 x中元素的平方和尽可能小。由于x 中的元素都是非负的由于是平方因此最小化平方和实际上等同于找到接近零的向量。上述代码执行结果为 Best solution: [0.02683969 0.07490378 0.34308792 0.01243034 0.06044091] Best fitness: 0.12784788404801556 遗传算法通过模拟自然选择的过程来逐步改进种群中个体的质量最终找到能够产生最低适应度在这个例子中即最小的平方和的解。代码中的 best_solution 就是算法找到的最佳解而 best_fitness 是这个解的适应度值即目标函数的最小值。 点关注防走丢如有纰漏之处请留言指教非常感谢 以上就是本期全部内容。我是fanstuck 有问题大家随时留言讨论 我们下期见。
http://www.ihoyoo.com/news/82667.html

相关文章:

  • 工信部备案网站打不开浙江省住房和城乡建设厅官网
  • 途牛旅游网站建设方案2022一级造价停考
  • 做网站怎么找客户注册营业执照名字查询系统
  • 网站优化如何做pc指数电子商务和网络营销的区别
  • 朝阳seo建站php网站建设考试
  • 微信触屏版网站开发电子政务与网站建设经验
  • 阳曲网站建设推荐咨询小天才电话手表网站
  • 河南最新政策seo优化排名方法
  • 行情网免费网站大全wordpress cms主题 怎么用
  • 深圳罗湖企业网站建设报价足球比赛直播中国队
  • 工程建设部网站南京代做网站制作
  • 查询行业信息的网站WordPress去掉管理员邮箱
  • 知名的网站建设公司企业购网站建设
  • 医疗网站建设行情济南网站搜索优化
  • 东莞中小企业网站建设国美电器网上商城
  • 岳阳建设厅网站淘宝网站建设的主要工作
  • 上海网站设计成功柚v米科技360免费wifi电脑版怎么使用
  • 地方门户网站的前途网页qq官网
  • 自己做的网站怎么查网上购物软件
  • 凡科做网站的方法深圳网站定制设计
  • 做的网站缩小内容就全乱了网站建设咨询有客诚信网站建
  • 东莞市房管局官方网站企业网站建立网络虚拟社区时对于企业
  • 杭州品牌网站建设公司佛山市seo推广哪家好
  • 什么网站ppt做的最好看wordpress设置自动登陆
  • 个体工商户是否能够做网站河南那家做网站实力强
  • 网站程序问题设计建筑
  • 网站建设实训室长春seo搜索排名
  • it培训网站模板网站建设与管理基础及实训
  • 商务网站建设是什么响应式布局网站开发
  • 建筑网站开发青岛代理记账