news 2026/9/5 15:05:47

基于遗传算法的最优化求解问题:简单多元函数极值问题的优化与通用性代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于遗传算法的最优化求解问题:简单多元函数极值问题的优化与通用性代码

基于遗传算法的最优化求解问题 其通过遗传算法对简单的多元函数求极值问题进行优化求解,得到了最优解和迭代收敛曲线 代码通用性很好 很适合小白入门

今天咱们来聊聊怎么教计算机自己找答案——这事儿听着玄乎,其实用遗传算法就能轻松搞定。举个栗子,假设我们要找函数f(x,y)=x²+y²的最小值,人类肉眼一看就知道在(0,0)处,但计算机可不会代数运算,这时候就该让基因进化大法上场了。

先准备个种群,就像养鱼塘放鱼苗:

import numpy as np def create_population(size, dim, lbound, rbound): return np.random.uniform(lbound, rbound, (size, dim))

这函数生成了20条染色体(解),每条有x,y两个基因,取值范围定在-10到10。好比在鱼塘里随机撒下不同品种的鱼苗,等着看哪些能适应环境。

接下来是适者生存环节:

def fitness(individual): return -sum(individual**2) # 求最小值转换为求负数的最大值 def selection(pop, fitnesses, elite_size=4): elite_indices = np.argsort(fitnesses)[-elone_size:] return pop[elite_indices]

这里有个骚操作:把求最小值转换成求负数的最大值。选择阶段就像选美比赛,表现最好的前4名直接晋级,保留下优质基因。

重点来了——交配和变异:

def crossover(parent1, parent2): cross_point = np.random.randint(1, len(parent1)) return np.hstack((parent1[:cross_point], parent2[cross_point:])) def mutate(individual, mutation_rate=0.1): mask = np.random.rand(len(individual)) < mutation_rate individual[mask] += np.random.normal(0, 0.5, sum(mask)) return individual

交叉操作像父母各剪一段基因拼接成新个体,变异则是随机给某些基因加点噪声。注意变异幅度用正态分布,这样既不会突变太猛也不会完全不变,比固定步长聪明多了。

整套进化流程封装成:

def genetic_algorithm(func, dim=2, iter_num=50): pop = create_population(20, dim, -10, 10) best_values = [] for _ in range(iter_num): fitnesses = np.array([func(ind) for ind in pop]) elites = selection(pop, fitnesses) selected = elites.copy() while len(selected) < 20: parents = elites[np.random.choice(len(elites), 2, replace=False)] child = crossover(*parents) child = mutate(child) selected = np.vstack((selected, child)) pop = selected best_values.append(-np.max(fitnesses)) # 转换回原函数值 return best_values

迭代过程中始终保持种群数量稳定,每一代都保留精英并补充新血。记录最优解的变化趋势,方便后续画收敛曲线。

跑完50代后画个进化轨迹:

import matplotlib.pyplot as plt history = genetic_algorithm(fitness) plt.plot(history, 'g', linewidth=2) plt.title('进化过程曲线') plt.xlabel('迭代次数') plt.ylabel('函数值') plt.show()

你会发现曲线像滑梯一样往下溜,最后稳稳停在0附近。实际跑几次会发现,基本在10代以内就能找到精度1e-4级别的解,比随机搜索高效不止一个量级。

这套代码的妙处在于改个目标函数就能解决其他优化问题。比如把fitness函数改成sum(np.sin(individual)individual*2),立马变成求解震荡函数的最小值。参数调整也简单,种群规模、变异率、选择数量这些都可以根据问题复杂度灵活配置。

刚入门的同学可能会问:为什么不直接用梯度下降?问得好!遗传算法的优势在于:1)不依赖梯度信息,2)能跳出局部最优,3)特别适合离散/非线性问题。当然,计算量确实大些,但对于小白理解优化算法的本质,这可比推导数学公式直观多啦。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 20:45:22

实战笔记】CP1H电子手轮控制伺服硬核操作

OMRON CP1HPLC 电子手轮控制伺服&#xff0c;如何接线&#xff0c;设定&#xff0c;编写程序。 PDF文档&#xff0c;我自己总结编写的教程&#xff0c;实际项目应用&#xff0c;私家珍藏。一、硬件接线踩坑实录电子手轮三根线&#xff08;A/B相5V&#xff09;接到CP1H的X0-X2&a…

作者头像 李华
网站建设 2026/9/3 22:15:38

电子电路中的负反馈机制:全面讲解与应用

负反馈&#xff1a;让电路“自我纠正”的智慧你有没有想过&#xff0c;为什么你的耳机能清晰还原音乐中的每一个音符&#xff1f;为什么工业传感器能在嘈杂的工厂里准确读出微弱的温度变化&#xff1f;这些看似理所当然的背后&#xff0c;藏着一个模拟电路中最古老却最强大的设…

作者头像 李华
网站建设 2026/9/1 23:08:14

通俗解释Scanner类缓冲区原理:结合常用方法分析

为什么你的Java程序“跳过”了用户输入&#xff1f;——深入理解Scanner的缓冲区陷阱你有没有遇到过这样的情况&#xff1a;System.out.print("请输入年龄&#xff1a;"); int age sc.nextInt();System.out.print("请输入姓名&#xff1a;"); String name…

作者头像 李华
网站建设 2026/9/1 16:27:02

通俗解释OllyDbg中代码段与数据段的识别方法

从零搞懂OllyDbg&#xff1a;如何一眼看穿代码段和数据段&#xff1f;你有没有在用 OllyDbg 调试程序时&#xff0c;盯着内存发过懵&#xff1f;明明是一堆十六进制数字&#xff0c;有的地方反汇编出来是PUSH EBP、CALL指令&#xff0c;清清楚楚&#xff1b;可换一个地址点进去…

作者头像 李华
网站建设 2026/9/1 23:07:11

揭秘!提示工程架构师眼中Agentic AI在智能设备的独特应用

揭秘&#xff01;提示工程架构师眼中Agentic AI在智能设备的独特应用——从被动响应到主动服务的进化 引言&#xff1a;当智能设备不再“听话”&#xff0c;而是“懂你” 清晨7点&#xff0c;你揉着眼睛起床&#xff0c;智能音箱突然响起&#xff1a;“早啊&#xff0c;昨天你说…

作者头像 李华
网站建设 2026/9/3 0:21:11

Matlab实现粒子群优化算法求解含压缩储能设备的综合能源系统运行优化的结果及代码注释与参考文献

matlab采用粒子群优化算法求解含压缩储能设备的综合能源系统运行优化。 结果包含储能设备24时出力&#xff0c;内燃机发电和发热出力&#xff0c;电制冷机出力等。 代码包含相关注释&#xff0c;方便对算法进行改进。 附相关参考文献。最近在折腾综合能源系统的优化问题&#x…

作者头像 李华