数学建模【遗传算法】

一、遗传算法简介

从做菜说起,小魏是一名大厨,想要创造一道美味的菜肴。首先随机生成多个原始配方,每种配方所用的原料(鸭脖、鸡肉、大肠等)与手法(煎炒焖炸卤炖)组合不同,现实中考虑调料用量、烹饪时间等等变量,会有无穷多种解,传统算法难以求解。

请评委对几种配方做出的菜打分,分数高的配方进行配方交叉,保留一部分评分高的配方要素、舍弃评分低的配方。例如配方A和配方C的分数都高,A是卤鸭脖,C是炖大肠,配方交叉尝试新一组方案:“炖鸭脖”和“卤大肠”。

有时会在配方交叉之后,再变更食材或烹饪方式。就像是在配方中随机使用了一些与原配方无关的调料或者做法(鸭脖改成鼠头),变异可能带来惊喜(评分高),也可能有惊无喜(试试就逝世),所以只小概率进行。

再对新配方的菜评分,继续交叉、小概率变异.....不断循环直至无改进空间为止。

将其类比于生物学和遗传算法

烹饪配方生物学遗传算法
多种配方群体可行解集合
单个配方个体可行解
配方内容(原料、方式等)基因可行解的分量
评分适应度适应度函数值
配方交叉交叉交叉操作
随机新操作变异变异操作
做出美味佳肴物种进化最优解(近似)

二、适用赛题

函数优化、组合优化问题

  • 对于一些非线性、多模型、多目标的函数优化问题
  • 不依赖于问题的背景领域,使用方便,连续1离散、单峰1多峰等等各种形式均可

NP-Hard问题

  • 模拟退火算法中讲过的TSP问题、背包问题、图形划分问题等
  • 在NP-Hard问题方面普遍来说各类启发式算法均可

优缺点

  • 相比模拟退火,相比良好的全局搜索能力,不易陷入局部最优
  • 相比粒子群算法,常规的遗传算法可直接求解离散问题
  • 缺点:由于变异是随机的,局部搜索能力差;相对其他算法更耗时、思路复杂抽象
  • 可多种算法结合改进,例如遗传算法优化神经网络等混合算法(新手慎用)

三、模型流程

四、流程分析

还是以一个例题贯穿流程分析

例题:现有12份快递需要配送,背包容量350,每份快递的体积不同、收益不同,应该将哪些物品放进背包,使得所总体积不超过背包容量且总收益最大?

这是一个很典型的0-1背包问题,如果学过动态规划的同学,这个题目是非常简单的,不过这里我们用遗传算法求解之。

  • 用“0”和“1”表示物品的装包状态
  • 一个物品装包状态为0代表没有被装进包中,1代表被装进包中
  • 例如“100111001001”代表第1,4,5,6,9,12个物品被装进背包
  • 每一个物品的装包状态(0或1)作为一个基因
  • 问题的一个解:一组12个数构成的数组为一个个体(染色体)
1.种群初始化
  • 有N个物品,则随机生成N个数(0或1)构成一个数组,作为一个个体,及可能的解
  • 重复上一步,生成多个个体,构成种群(解集)
  • 群体规模太小容易陷入局部最优,太大又会使计算复杂度高费时间,一般设置20到200
2.选择运算
  • 求每个个体的适应度:把解x带入目标函数求函数值f(x)
  • 目的是从第t代群体P(t)中挑选出优良个体,把基因遗传到下一代群体P(t+1)

选择操作的准则

  • 适应度越高的个体被选中的概率越大
  • 适应度较低的个体仍有被选中的可能

为什么不直接从大到小排序,直接选适应度最高的几个个体进行后续操作?

  • 适应度最高的几个个体,也意味着适应度高度相似
  • 往往其基因(解分量)也很相似
  • 如果每次都只选适应度最高的个体,意味着每轮迭代所选的个体相似度很高
  • 那么后代的相似度也会很高,进化陷入停滞,意味着陷入局部最优解

至于选择操作怎么进行,看个人,只要符合上面的准则即可。下面提供一种方法

轮盘赌法

  • 1.计算每个个体被选中概率P(xi),概率值与其适应度值成正比

  • 2.计算每个个体对应的累积概率qi,为从第1个个体到当前个体的选中概率之和

  • 3.随机生成一个数组bet,其中的元素取值在0到1之间,并将元素从小到大排序
  • 4.若第i个个体的累积概率qi大于bet(i), 则第i个个体被选中,并更新bet(i)为bet(i+1),否则选择第(i+1)个个体与bet(i)比较,直至选出一个个体为止
  • 5.重复步骤4,直至选出与种群数量相等的个体数(其中有的个体被多次选中)

轮盘赌法分析

  • 第i个个体适应度值越大→被选中概率P(xi)数值越大
  • P(xi)越大→P(xi) = (qi) - (qi-1)越大, 即第i个个体对累积概率带来的“增大幅度”也越大
  • 增大幅度(qi - qi-1)越大→新个体满足qi > bet的概率也越大(回忆下bet是怎么变化的)
  • 个体满足qi > bet(i)即意味着被选中
  • 结论:个体适应度值越大,被选中的概率越大
  • 基因好、适应度大使得其对累积概率带来的“增幅”更大
  • 类似在轮盘上该个体所占的面积越大,被选中的概率也越大
  • 被选择的个体中会有重复
  • 因为适应度高的个体被选中概率大而可能被选中多次
  • 对应于生物界中基因优良生存能力强的个体可能具有多次交配权
3.交叉
  • 在被选择的所有个体中,两个个体之间进行交叉操作
  • 先根据交叉概率判断是否执行交叉操作,一般设置为80%到95%(即较大概率)
  • 随机选择进行交叉的位置,如何选择看个人,满足随机即可
4.变异
  • 变异操作是为了利用“不确定性”来赌一把,或许更好,或许更差
  • 先判断每个个体的每个基因是否进行变异运算,一般变异概率设为0.5%到5%即可
  • 变异运算就是对变异的基因取反,0变1,1变0
5.输出最优解

当循环完成后,统计种群中所有的适应度,取最优解输出,到底是最大还是最小是最优解根据具体题目

6.补充

进行运算的时候,不要忘记题目本身的一些约束。比如这个背包问题,如果体积超过背包容量上限,即使其适应度可能很高但是这种情况也不能要,所以要进行一些操作避免,比如设置惩罚系数或者直接赋0等,看个人选择。具体题目具体分析。

7.总结
背包问题生物学遗传算法
多种背包方案群体可行解集合
单个方案个体可行解
每个物体是否被选中基因可行解的分量
包内总价值适应度适应度函数值
两方案中的物品交换交叉交叉操作
随机改变物品的选择变异变异操作
包内总价值最大物种进化最优解(近似)

  • 46
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数学建模是将实际问题抽象化为数学模型,并利用数学方法解决问题的过程。而遗传算法是一种模拟自然生物进化过程的优化算法。在Python中,可以利用遗传算法来进行数学建模。 首先,我们需要定义数学建模问题的目标函数。例如,如果我们要优化一个函数的取值,可以将该函数作为目标函数。然后,我们需要定义问题的约束条件,例如变量的取值范围、条件限制等。 接下来,我们可以使用遗传算法进行优化。首先,我们需要初始化一组个体,每个个体代表了问题的一种解决方案。然后,通过交叉、变异等操作对个体进行演化,产生新的一代个体。根据目标函数的取值,我们可以选择适应度函数来评估每个个体的适应程度。适应度越高的个体,被选中的概率就越大。 通过多代的进化,遗传算法可以找到近似最优解。在Python中,可以使用遗传算法的库,如deap来实现算法的具体细节。使用deap库,可以方便地定义目标函数、约束条件和适应度函数,并进行演化过程。同时,deap还提供了丰富的遗传算法操作,如交叉、变异等。 综上所述,数学建模遗传算法Python可以通过定义目标函数、约束条件和适应度函数,使用遗传算法库如deap来实现优化过程。这种方法可以帮助解决各种实际问题,如优化参数、组合最优等。在实际应用中,我们可以根据具体问题的需求进行调整和优化,以获得更好的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还有糕手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值