怎么建公司网站教程ui设计最好的培训机构
2025/12/26 17:17:30 网站建设 项目流程
怎么建公司网站教程,ui设计最好的培训机构,广西网站建设哪家有,网站建设怎么建设遗传算法小白入门教程#xff1a;用“自然法则”解决优化问题 1. 背景溯源#xff1a;从进化论到遗传算法 要理解遗传算法#xff08;Genetic Algorithm, GA#xff09;#xff0c;先回到达尔文的进化论——生物通过“遗传、变异、自然选择”不断进化#xff0c;适应环境…遗传算法小白入门教程用“自然法则”解决优化问题1. 背景溯源从进化论到遗传算法要理解遗传算法Genetic Algorithm, GA先回到达尔文的进化论——生物通过“遗传、变异、自然选择”不断进化适应环境的个体存活并繁衍不适应的被淘汰。20世纪60年代美国科学家**约翰·霍兰德John Holland**受到进化论启发提出了遗传算法的雏形用“生物进化”的逻辑解决工程与数学中的优化问题。简单来说就是把“问题的解”模拟成“生物个体”通过“自然选择”筛选优秀解“遗传变异”产生更优解最终迭代出接近最优的结果。到20世纪80-90年代遗传算法逐步成熟被广泛应用于函数优化、组合调度、机器学习等领域比如神经网络的超参数调优。2. 核心思想用“生物语言”重构优化问题遗传算法的本质是**“种群迭代优化”**核心逻辑可以概括为三句话解生物个体把问题的一个解编码成一个“染色体”比如二进制串优解适者生存用“适应度函数”给每个解打分分数越高越“优秀”进化遗传变异通过“选择选优秀解当父母、交叉父母基因重组生小孩、变异小孩基因随机突变”产生新一代解迭代后得到更优解。3. 基础概念定义解的“生物化”表达在开始算法前必须先明确遗传算法的“生物术语”与“问题术语”的对应关系这是理解后续内容的关键生物术语问题术语解释举例染色体Chromosome解的编码比如用12位二进制串001011001011表示函数f(x)x*sin(10πx)2的解x-0.478基因Gene编码的基本单位二进制串中的某一位比如001011001011的第3位是1种群Population一组解的集合比如10个二进制串组成的集合代表10个候选解适应度Fitness解的优劣评分用目标函数值衡量比如f(x)2.294就是x-0.478的适应度基因型Genotype编码后的解二进制/实数串001011001011表型Phenotype解码后的实际解问题变量x-0.4784. 算法核心原理三大遗传操作详解遗传算法的“进化”过程由选择、交叉、变异三个操作完成每个操作都有明确的目标4.1 选择Selection选出“优秀父母”目标从当前种群中选出适应度高的个体作为“父母”来生下一代保证“优秀基因”传递。常见方法1轮盘赌选择Roulette Wheel Selection原理把每个个体的适应度占比当作“轮盘面积”随机转指针选个体——适应度越高占的面积越大被选中的概率越高。计算步骤4. 计算种群总适应度F Σ_{i1}^N f(i)N是种群大小f(i)是个体i的适应度5. 计算个体i的选择概率p(i) f(i) / F6. 生成0~1的随机数落在哪个个体的概率区间就选哪个。例子若3个个体的适应度是5、3、2总适应度是10则概率分别是0.5、0.3、0.2——轮盘上50%的面积属于第一个个体被选中的概率最高。2锦标赛选择Tournament Selection原理随机选k个个体比如k2选其中适应度最高的当父母——避免轮盘赌中“极端高适应度个体垄断”的问题。优点更公平更适合大规模种群。4.2 交叉Crossover父母基因重组生“小孩”目标通过父母基因的交换产生兼具父母优点的子代探索新的解空间。关键交叉需要“编码方式”匹配——常见编码有二进制编码适合离散问题和实数编码适合连续问题。1二进制编码的交叉单点交叉Single-Point Crossover7. 随机选一个“交叉点”比如二进制串的第5位后8. 交换两个父母交叉点后的基因。例子父代110110 | 101交叉点在第5位后父代211001 | 010子代110110 010父1前5位父2后3位子代211001 101父2前5位父1后3位两点交叉Two-Point Crossover选两个交叉点交换中间的基因更灵活适合长染色体。2实数编码的交叉算术交叉Arithmetic Crossover用线性组合生成子代公式为子代1x1 α·x1 (1-α)·x2子代2x2 α·x2 (1-α)·x1其中α∈[0,1]是“混合系数”比如α0.5就是父母的平均值。例子父代1是x11.2父代2是x23.4α0.5则子代12.3子代22.3。交叉概率Pc控制交叉操作的频率通常取0.6~0.9——概率太高会破坏好基因太低则探索不足。4.3 变异Mutation给“小孩”随机突变目标随机修改子代的某几个基因避免种群“同质化”防止陷入局部最优。常见方法1二进制编码的变异原理对每个基因位以“变异概率Pm”翻转0变11变0。例子个体10110101变异概率0.01——每个位有1%的概率翻转比如第3位翻转后变成10010101。2实数编码的变异原理给实数变量加一个小的随机扰动比如正态分布N(0,σ²)的随机数。公式x x σ·N(0,1)σ是扰动幅度通常取变量范围的1%~5%。例子x1.234σ0.1随机数是0.05则变异后x1.284。变异概率Pm控制变异频率通常取0.001~0.05——概率太高会变成“随机搜索”太低则无法跳出局部最优。5. 完整求解步骤从问题到答案的全流程现在用**“最大化函数f(x)x·sin(10πx)2x∈[-1,2]”**这个简单例子 step by step 演示遗传算法的求解过程5.1 步骤1问题建模与目标函数定义首先明确优化目标和约束条件目标函数max f(x) x·sin(10πx) 2要最大化的函数约束条件x∈[-1,2]变量范围精度要求ε0.001x要精确到小数点后3位。5.2 步骤2解的编码染色体设计遗传算法操作的是“染色体”所以需要把实际解x编码成染色体关键。1选择编码方式这里选二进制编码适合连续变量的离散化。2计算染色体长度要表示x∈[-1,2]且精度ε0.001需要的离散份数是M (b - a)/ε 1 (2 - (-1))/0.001 1 3001a是下限b是上限。染色体长度L需要满足2^L ≥ M二进制能表示的数要覆盖所有份数。计算得2^124096 ≥ 3001所以L1212位二进制串。5.3 步骤3初始化种群生成N个随机染色体N是种群大小通常取50~200这里取N10。比如生成10个12位二进制串001011001011,110010110010,011001011001, …,101100101100。5.4 步骤4适应度函数计算目标给每个染色体打分适应度衡量解的优劣。1解码染色体→实际解x二进制串b b_{11}b_{10}...b_1b_012位从高位到低位对应的十进制值是dec(b) Σ_{i0}^{11} b_i·2^ib_i是第i位的二进制数0或1。解码成x的公式x a (b - a)·dec(b)/(2^L - 1)把二进制值映射到[-1,2]区间。代入数值x -1 3·dec(b)/4095因为2^12-14095。2计算适应度目标是最大化f(x)所以直接用f(x)作为适应度函数fit(x) f(x) x·sin(10πx) 2。例子染色体001011001011的十进制值dec(b)715计算0*2^11 0*2^10 1*2^9 0*2^8 1*2^7 1*2^6 0*2^5 0*2^4 1*2^3 0*2^2 1*2^1 1*2^051212864821715。解码得x -1 3*715/4095 ≈ -0.478。适应度fit(x) -0.478·sin(10π*(-0.478)) 2 ≈ 2.294。5.5 步骤5遗传操作选择→交叉→变异现在用步骤4得到的适应度进行遗传操作1选择轮盘赌选父母计算10个个体的适应度总和FΣfit(x_i)再计算每个个体的选择概率p(i)fit(x_i)/F。比如个体1的适应度是2.294总和是20则p(1)2.294/20≈0.1147。生成随机数选10个父母因为要保持种群大小10。2交叉单点交叉生子代设置交叉概率Pc0.880%的父母会交叉。随机选交叉点比如第5位后交换父母基因。比如父母1是001011|001011父母2是110010|110010交叉后子代1是001011110010子代2是110010001011。3变异随机突变子代设置变异概率Pm0.01每个基因位有1%的概率翻转。比如子代1是001011110010第3位翻转后变成001010110010。5.6 步骤6种群更新与精英保留目标保证下一代种群比上一代更优避免最优解丢失。1精英保留策略把上一代适应度最高的2个个体直接保留到下一代防止优秀解被交叉变异破坏。2种群更新将“保留的精英”“交叉变异后的子代”合并选适应度最高的10个个体作为下一代种群保持种群大小不变。5.7 步骤7迭代终止判断重复步骤4~6直到满足终止条件选其中一个即可9. 达到最大迭代次数比如100次10. 连续K次迭代适应度变化小于阈值比如连续10次迭代最优适应度变化小于0.00111. 适应度达到预期值比如fit(x)≥3.8因为f(x)的理论最大值约为3.8。5.8 步骤8解码得到最优解迭代终止后下一代种群中适应度最高的个体就是“最优解”。比如最后一代的最优染色体是110100110010解码得x≈1.85适应度fit(x)≈3.8接近理论最大值。6. 适用边界与局限性知道什么时候用遗传算法是启发式算法Heuristic Algorithm——不保证得到全局最优但能在合理时间内找到“较优解”。以下是它的适用场景和不适用场景6.1 适合的问题非线性/非凸问题目标函数有多个局部最优比如f(x)x·sin(10πx)2有多个峰高维问题变量数多比如100个变量的函数优化无导数问题无法计算目标函数的梯度比如黑箱函数只能算函数值组合优化问题如旅行商问题TSP、背包问题、调度问题变量是离散的排列机器学习超参数优化比如神经网络的学习率、隐藏层大小超参数多无法用梯度下降。6.2 不适合的问题凸优化问题目标函数是凸的只有一个全局最优用梯度下降、牛顿法更高效线性规划问题有精确的单纯形法比如max c^T x s.t. Ax≤b小规模问题变量少比如3个变量精确解容易得到需要绝对精确解的问题比如航天工程中的关键参数必须精确到小数点后10位遗传算法达不到。6.3 局限性随机性每次运行结果可能不同需要多次运行取平均参数敏感种群大小、交叉/变异概率、迭代次数需要调优新手可能踩坑计算成本高维问题需要大种群和多次迭代计算量很大适应度函数依赖若适应度函数不能准确反映解的优劣结果会很差比如目标是最小化成本但适应度函数用了最大化利润没转换。7. 新手常见误区解答1误区变异概率越高越好错变异是“小概率扰动”——概率太高会破坏好基因变成“随机搜索”太低则无法跳出局部最优通常取0.001~0.05。2误区种群越大越好错种群太大计算量爆炸比如1000个个体迭代100次就是10万次计算太小则缺乏多样性容易陷入局部最优通常取50~200。3误区不需要精英保留错精英保留能保证“最优解不丢失”——比如上一代的最优解适应度是3.8若不保留交叉变异后可能变成3.5导致结果变差。4误区遗传算法能找到全局最优错遗传算法是“近似算法”——只能找到“较优解”不一定是全局最优但通过调参和多次运行能接近全局最优。8. 总结遗传算法的“本质”遗传算法的核心是**“用种群的多样性探索解空间用选择压力引导进化方向”**——它模拟了自然选择的“试错优化”过程适合解决那些“传统方法搞不定”的复杂问题。作为新手建议从简单函数优化比如本文的f(x)开始练习再逐步尝试组合优化比如TSP问题最后应用到机器学习超参数优化——多练几次就能掌握遗传算法的精髓案例介绍importnumpyasnpimportrandom# -------------------------- 问题定义模块 --------------------------# 目标函数max f(x) x * sin(10 * pi * x) 2defcalc_fitness(x):returnx*np.sin(10*np.pi*x)2# 解码函数二进制染色体 - 十进制实数x (x ∈ [-1, 2])defdecode(chromosome,a-1,b2,L12):# 将二进制字符串转换为十进制整数dec_valueint(chromosome,2)# 映射到[-1, 2]区间xa(b-a)*dec_value/(2**L-1)returnx# -------------------------- 遗传操作模块 --------------------------# 初始化种群生成N个长度为L的随机二进制字符串definit_population(N,L):population[]for_inrange(N):# 生成L位随机二进制字符串chromosome.join([str(random.randint(0,1))for_inrange(L)])population.append(chromosome)returnpopulation# 轮盘赌选择根据适应度选择父代defroulette_selection(population,fitness):# 计算总适应度total_fitnesssum(fitness)# 计算选择概率selection_probs[f/total_fitnessforfinfitness]# 轮盘赌选择selectedrandom.choices(population,weightsselection_probs,klen(population))returnselected# 单点交叉两个父代染色体产生两个子代defsingle_point_crossover(parent1,parent2,pc):ifrandom.random()pc:# 不交叉直接返回父代returnparent1,parent2# 随机选择交叉点1到L-1之间Llen(parent1)cross_pointrandom.randint(1,L-1)# 生成子代child1parent1[:cross_point]parent2[cross_point:]child2parent2[:cross_point]parent1[cross_point:]returnchild1,child2# 二进制变异随机翻转染色体的基因位defbinary_mutation(chromosome,pm):mutatedlist(chromosome)# 字符串转列表以便修改Llen(mutated)foriinrange(L):ifrandom.random()pm:# 翻转基因mutated[i]1ifmutated[i]0else0return.join(mutated)# -------------------------- 主程序模块 --------------------------defmain():# -------------------------- 参数设置 --------------------------a-1# 变量x的下限b2# 变量x的上限L12# 染色体长度二进制N100# 种群大小max_iter200# 最大迭代次数pc0.8# 交叉概率pm0.01# 变异概率elite_num2# 精英保留数量# 初始化种群populationinit_population(N,L)# 迭代优化foriterinrange(max_iter):# 1. 计算适应度fitness[calc_fitness(decode(chrom,a,b,L))forchrominpopulation]# 2. 精英保留选择适应度最高的elite_num个个体# 按适应度从大到小排序种群sorted_pop_fitsorted(zip(population,fitness),keylambdax:x[1],reverseTrue)elite[chromforchrom,fitinsorted_pop_fit[:elite_num]]# 精英个体# 3. 轮盘赌选择父代parentsroulette_selection(population,fitness)# 4. 交叉操作生成子代offspring[]foriinrange(0,N,2):ifi1N:parent1parents[i]parent2parents[i1]child1,child2single_point_crossover(parent1,parent2,pc)offspring.extend([child1,child2])else:# 若种群数量为奇数直接保留最后一个父代offspring.append(parents[i])# 5. 变异操作offspring[binary_mutation(child,pm)forchildinoffspring]# 6. 更新种群精英 子代中前N-elite_num个适应度最高的个体# 计算子代的适应度offspring_fitness[calc_fitness(decode(chrom,a,b,L))forchrominoffspring]# 按适应度从大到小排序子代sorted_offspringsorted(zip(offspring,offspring_fitness),keylambdax:x[1],reverseTrue)# 选择子代中前N-elite_num个selected_offspring[chromforchrom,fitinsorted_offspring[:N-elite_num]]# 合并精英和选择的子代组成新一代种群populationeliteselected_offspring# 迭代结束输出最优解final_fitness[calc_fitness(decode(chrom,a,b,L))forchrominpopulation]# 找到最优个体和对应的适应度best_idxnp.argmax(final_fitness)best_chrompopulation[best_idx]best_xdecode(best_chrom,a,b,L)best_fitfinal_fitness[best_idx]print(最优解)print(f染色体{best_chrom})print(fx值{best_x:.5f})print(f适应度值{best_fit:.5f})# 运行主程序if__name____main__:main()OK今天数学建模算法分享就到这里结束了若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持本文有若有不足之处希望各位帅哥美女们能给出宝贵的意见。谢谢大家初来乍到本期制作不易希望各位帅哥美女们能动动小手三连走一走如果大家觉得主播写的还不错的话可以关注一下每日都会有推文的期待一下明天的干货把嘿嘿~

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询