使用Python编程:求10-n间所有7的倍数的积

数维杯·赛事资讯·数模干货·辅助报名


1: 遗传算法理论的由来

3: 遗传算法具体步骤

3.1 初始化(编码)

4.2 创造染色体(编码)

4.3 个体、种群与进化

注:本文是根据参考文献几篇文章及个人理解整合而来

1:遗传算法理论的由来

我们先从查尔斯·达尔文的一句名言开始:

能够生存下来的往往不是最强大的物种,也不是最聪明的物种,而是最能适应环境的物种。

你也许在想:这句话和遗传算法有什么关系?其实遗传算法的整个概念就基于这句话。

让我们用一个基本例子来解释 :

我们先假设一个情景,现在你是一国之王,为了让你的国家免于灾祸,你实施了一套法案:

  • 你选出所有的好人,要求其通过生育来扩大国民数量。

  • 这个过程持续进行了几代。

  • 你将发现,你已经有了一整群的好人。

这个例子虽然不太可能,但是我用它是想帮助你理解概念。也就是说,我们改变了输入值(比如:人口),就可以获得更好的输出值(比如:更好的国家)。现在,我假定你已经对这个概念有了大致理解,认为遗传算法的含义应该和生物学有关系。那么我们就快速地看一些小概念,这样便可以将其联系起来理解。

首先我们回到前面讨论的那个例子,并总结一下我们做过的事情。

  1. 首先,我们设定好了国民的初始人群大小。

  2. 然后,我们定义了一个函数,用它来区分好人和坏人。

  3. 再次,我们选择出好人,并让他们繁殖自己的后代。

  4. 最后,这些后代们从原来的国民中替代了部分坏人,并不断重复这一过程。

遗传算法实际上就是这样工作的,也就是说,它基本上尽力地在某种程度上模拟进化的过程。

因此,为了形式化定义一个遗传算法,我们可以将它看作一个优化方法,它可以尝试找出某些输入,凭借这些输入我们便可以得到最佳的输出值或者是结果。遗传算法的工作方式也源自于生物学,具体流程见下图:


  1. 智能式搜索:依据适应度(目标函数)进行只能搜索

  2. 渐进式优化:利用复制、交换、突变等操作,使下一代结果优于上一代

  3. 全局最优解:采用交换和突变操作产生新个体,使得搜索得到的优化结果逼近全局最优解

  4. 黑箱式结构:根据问题的特性进行编码(输入)和确定适应度(输出),具有只考虑输入与输出关系的黑箱式就够,并不深究输入与输出关系的原因

  5. 通用性强:不要求明确的数学表达式,只需要一些简单的原则要求,可应用于解决离散问题、函数关系不明确的复杂问题

  6. 并行式运算:每次迭代计算都是对群体中所有个体同时进行运算,是并行式运算方式,搜索速度快

为了让讲解更为简便,我们先来理解一下著名的组合优化问题「背包问题」。

比如,你准备要去野游 1 个月,但是你只能背一个限重 30 公斤的背包。现在你有不同的必需物品,它们每一个都有自己的「生存点数」(具体在下表中已给出)。因此,你的目标是在有限的背包重量下,最大化你的「生存点数」。


3.1 初始化(编码)

这里我们用遗传算法来解决这个背包问题。第一步是定义我们的总体。总体中包含了个体,每个个体都有一套自己的染色体。

我们知道,染色体可表达为二进制数串,在这个问题中,1 代表接下来位置的基因存在,0 意味着丢失。(译者注:作者这里借用染色体、基因来解决前面的背包问题,所以特定位置上的基因代表了上方背包问题表格中的物品,比如第一个位置上是 Sleeping Bag,那么此时反映在染色体的『基因』位置就是该染色体的第一个『基因』。)


现在,我们将图中的 4 条染色体看作我们的总体初始值。

二进制编码由二进制符号0和1所组成的二值符号集。它有以下一些优点:1. 编码、解码操作简单易行 2. 交叉、变异等遗传操作便于实现 3. 合最小字符集编码原则 4. 利用模式定理对算法进行理论分析。

二进制编码的缺点是:对于一些连续函数的优化问题,由于其随机性使得其局部搜索能力较差,如对于一些高精度的问题,当解迫近于最优解后,由于其变异后表现型变化很大,不连续,所以会远离最优解,达不到稳定。

格雷码编码是其连续的两个整数所对应的编码之间只有一个码位是不同的,其余码位完全相同。

二进制码转为格雷码:异或运算:同则为0,异则为1。公式如下:


由格雷码转二进制的转换公式为:


优点:增强遗传算法的局部搜索能力,便于对连续函数进行局部空间搜索。使用非常广泛。

二进制编码虽然简单直观,但明显地。但是存在着连续函数离散化时的映射误差。个体长度较短时,可能达不到精度要求,而个体编码长度较长时,虽然能提高精度,但增加了解码的难度,使遗传算法的搜索空间急剧扩大。

所谓浮点法,是指个体的每个基因值用某一范围内的一个浮点数来表示。编码长度等于决策变量的个数。在浮点数编码方法中,必须保证基因值在给定的区间限制范围内,遗传算法中所使用的交叉、变异等遗传算子也必须保证其运算结果所产生的新个体的基因值也在这个区间限制范围内。

  1. 适用于在遗传算法中表示范围较大的数

  2. 适用于精度要求较高的遗传算法

  3. 便于较大空间的遗传搜索

  4. 改善了遗传算法的计算复杂性,提高了运算交率

  5. 便于遗传算法与经典优化方法的混合使用

  6. 便于设计针对问题的专门知识的知识型遗传算子

  7. 便于处理复杂的决策变量约束条件

符号编码法是指个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号集如{A,B,C…}。

  1. 符合有意义积术块编码原则

  2. 便于在遗传算法中利用所求解问题的专门知识

  3. 便于遗传算法与相关近似算法之间的混合使用。

接下来,让我们来计算一下前两条染色体的适应度分数。对于 A1 染色体 [100110] 而言,有:



对于这个问题,我们认为,当染色体包含更多生存分数时,也就意味着它的适应性更强。因此,由图可知,染色体 1 适应性强于染色体 2。

现在,我们可以开始从总体中选择适合的染色体,来让它们互相『交配』,产生自己的下一代了。这个是进行选择操作的大致想法,但是这样将会导致染色体在几代之后相互差异减小,失去了多样性。因此,我们一般会进行「轮盘赌选择法」(Roulette Wheel Selection method)。

想象有一个轮盘,现在我们将它分割成 m 个部分,这里的 m 代表我们总体中染色体的个数。每条染色体在轮盘上占有的区域面积将根据适应度分数成比例表达出来。


基于上图中的值,我们建立如下「轮盘」。


现在,这个轮盘开始旋转,我们将被图中固定的指针(fixed point)指到的那片区域选为第一个亲本。然后,对于第二个亲本,我们进行同样的操作。有时候我们也会在途中标注两个固定指针,如下图:


通过这种方法,我们可以在一轮中就获得两个亲本。我们将这种方法成为「随机普遍选择法」(Stochastic Universal Selection method)。

在上一个步骤中,我们已经选择出了可以产生后代的亲本染色体。那么用生物学的话说,所谓「交叉」,其实就是指的繁殖。现在我们来对染色体 1 和 4(在上一个步骤中选出来的)进行「交叉」,见下图:


这是交叉最基本的形式,我们称其为「单点交叉」。这里我们随机选择一个交叉点,然后,将交叉点前后的染色体部分进行染色体间的交叉对调,于是就产生了新的后代。

如果你设置两个交叉点,那么这种方法被成为「多点交叉」,见下图:


如果现在我们从生物学的角度来看这个问题,那么请问:由上述过程产生的后代是否有和其父母一样的性状呢?答案是否。在后代的生长过程中,它们体内的基因会发生一些变化,使得它们与父母不同。这个过程我们称为「变异」,它可以被定义为染色体上发生的随机变化,正是因为变异,种群中才会存在多样性。

下图为变异的一个简单示例:


变异完成之后,我们就得到了新为个体,进化也就完成了,整个过程如下图:


在进行完一轮「遗传变异」之后,我们用适应度函数对这些新的后代进行验证,如果函数判定它们适应度足够,那么就会用它们从总体中替代掉那些适应度不够的染色体。这里有个问题,我们最终应该以什么标准来判断后代达到了最佳适应度水平呢?

一般来说,有如下几个终止条件:1. 在进行 X 次迭代之后,总体没有什么太大改变。2. 我们事先为算法定义好了进化的次数。3. 当我们的适应度函数已经达到了预先定义的值。

这节将讲述如何利用遗传算法解决一个二元函数的最大值求解问题。



4.2 创造染色体(编码)

我们尝试为上文所述的函数f(x,y)的最大值所对应的 x 和 y 的值构造染色体。也就是说,要在一组二进制位中存储函数 f(x,y) 的定义域中的数值信息。

假如设定求解的精度为小数点后6位,可以将区间[-10,10]划分为

个子区间。若用一组二进制位形式的染色体来表示这个数值集合,

,需要25位二进制数来表示这些解。换句话说,一个解的编码就是一个25位的二进制串。

现在,我们已经创建了一种 25 位长度的二进制位类型的染色体,那么对于任意一个这样的染色体,我们如何将其复原为[-10, 10]这个区间中的数值呢?这个很简单,只需要使用下面的公式即可:


例如 00 00 0000 0 和 11 11 1 这两个二进制数,将其化为 10 进制数,代入上式,可得 -10.0 和 10.0。这意味着长度为 25 位的二进制数总是可以通过上式转化为[-10, 10]区间中的数。

4.3 个体、种群与进化

染色体表达了某种特征,这种特征的载体,可以称为“个体”。例如,我本人就是一个“个体”,我身上载有 23 对染色体,也许我的相貌、性别、性格等因素主要取决于它们。众多个体便构成“种群”。

对于所要解决的二元函数最大值求解问题,个体可采用上一节所构造的染色体表示,并且数量为2个,其含义可理解为函数f(x, y)定义域内的一个点的坐标。许多这样的个体便构成了一个种群,其含义为一个二维点集,包含于对角定点为(-10.0, -10.0)和(10.0, 10.0)的正方形区域。

也许有这样一个种群,它所包含的个体对应的函数值会比其他个体更接近于函数f(x, y)的理论最大值,但是它一开始的时候可能并不比其他个体优秀,它之所以优秀是因为它选择了不断的进化,每一次的进化都要尽量保留种群中的优秀个体,淘汰掉不理想的个体,并且在优秀个体之间进行染色体交叉,有些个体还可能出现变异。种群的每一次进化后,必定会产生一个最优秀的个体。种群所有世代中的那个最优个体也许就是函数f(x, y)的最大值对应的定义域中的点。如果种群不休止的进化,它总是能够找到最好的解。但是,由于我们的时间是有限的,有可能等不及种群的最优进化结果,通常是在得到了一个看上去还不错的解时,便终止了种群的进化。

那么,对于一个给定的种群,通常上述讲过的选择、交叉、变异来进行进化。

# 如果在选择之前保留当前最佳个体,最终能收敛到全局最优解。

一文读懂遗传算法工作原理(附Python实现)

2022第七届数维杯夏令营报名火热进行中,本届夏令营限报200人,专家授课,零基础教学,参培人员获奖率高达80%,点击下方图片了解详情!

温馨提示:小编每天都在为大家用心甄选优质数模内容,更多数模干货已分类收录于往期合集【国赛、美赛】【数维杯】【常用软件】【算法模型】【经验分享】等,同学们于公众号内自行搜索即可,更多数模相关服务请移步【数模乐园官方旗舰店】了解详情,笔芯~

进入数模乐园官方旗舰店

看似寻常最奇崛,成如容易却艰辛。

2016春C语言程序设计(张彦航)(哈尔滨工业大学) 中国大学MOOC答案100分完整版


打开手机微信,扫一扫下方二维码,关注微信公众号:萌面人资料铺

本公众号提供各种网课答案以及大学学习资料



1.可查看各种网课答案

点击【萌面人官网】,可查看知到智慧树,超星尔雅学习通,学堂在线等网课答案

点击【中国大学慕课答案】,可查看mooc慕课答案

2.可一键领取淘宝/天猫/京东/拼多多无门槛优惠券

如图所示,点击对应图标即可领取淘宝/天猫/京东/拼多多无门槛优惠券


萌面人APP: 可查看各种大学网课答案,可一键领取淘宝,天猫,京东,拼多多无门槛优惠券

2022 年 4 月 22 日,Apache DolphinScheduler 正式宣布 3.0.0 alpha 版本发布!此次版本升级迎来了自发版以来的最大变化,众多全新功能和特性为用户带来新的体验和价值。

3.0.0-alpha 的关键字,总结起来是 “更快、更现代化、更强、更易维护”。

  • 更快、更现代化:重构了 UI 界面,新 UI 不仅用户响应速度提高数十倍,开发者构建速度也提高数百倍,且页面布局、图标样式都更加现代化;
  • 更强:带来了许多振奋人心的新功能,如数据质量评估、自定义时区、支持 AWS,并新增多个任务插件和多个告警插件;
  • 更易维护:后端服务拆分更加符合容器化和微服务化的发展趋势,还能明确各个服务的职责,让维护更加简单。

1、全新 UI,前端代码更健壮,速度更快

3.0.0-alpha 最大的变化是引入了新的 UI,切换语言页面无需重新加载,并且新增了深色主题。新 UI 使用了 Vue3、TSX、Vite 相关技术栈。对比旧版 UI,新 UI 不仅更加现代化,操作也更加人性化,前端的鲁棒性也更强,使用户在编译时一旦发现代码中的问题,可以对接口参数进行校验,从而使前端代码更加健壮。

此外,新架构和新技术栈不仅能让用户在操作 Apache DolphinScheduler 时响应速度有数十倍的提升,同时开发者本地编译和启动 UI 的速度有了数百倍的提升,这将大大缩短开发者调试和打包代码所需的时间。

随着 Apache DolphinScheduler 用户群体越来越丰富,吸引了很多海外用户。但在海外业务场景下,用户在调研过程中发现有两个影响用户便捷体验 Apache DolphinScheduler 的点,一个是时区问题,另一个则是对海外云厂商,尤其是对 AWS 的支持不足。为此,我们决定对AWS 较为重要的组件进行支持,这也是此版本的最重大的变化之一。

  • 针对 Amazon EMR,我们创建了一个新的任务类型,并提供了其 Run Job Flow 的功能,允许用户向 Amazon EMR 提交多个 steps 作业,并指定使用的资源数量。详情可见:

后续我们将用户的实际需求支持更多 AWS 任务,敬请期待。

全新的 UI 是 3.0.0-alpha 前端的最大变化,而后端最大的变化就是对服务进行拆分。考虑到容器和微服务的概念越来越火热,Apache DolphinScheduler 开发者做出了重大决定:对后端服务进行拆分。按照职能,我们将服务拆分成了以下几部分:

  • bin: 快速启动脚本,主要是启动各个服务的脚本
  • tools: 工具相关脚本,主要包含数据库创建,更新脚本

所有的服务都可以通过执行下面的命令进行启动或者停止。

此版本中,用户期待已久的数据质量校验应用功能上线,解决了从源头同步的数据条数准确性,单表或多表周均、月均波动超过阈值告警等数据质量问题。Apache DolphinScheduler 此前版本解决了将任务以特定顺序和时间运行的问题,但数据运行完之后对数据的质量一直没有较为通用的衡量标准,用户需要付出额外的开发成本。

现在,3.0.0-alpha 已经实现了数据质量原生支持,支持在工作流运行前进行数据质量校验过程,通过在数据质量功能模块中,由用户自定义数据质量的校验规则,实现了任务运行过程中对数据质量的严格控制和运行结果的监控。

任务组主要用于控制任务实例并发并明确组内优先级。用户在新建任务定义时,可配置当前任务对应的任务组,并配置任务在任务组内运行的优先级。当任务配置了任务组后,任务的执行除了要满足上游任务全部成功外,还需要满足当前任务组正在运行的任务小于资源池的大小。当大于或者等于资源池大小时,任务会进入等待状态等待下一次检查。当任务组中多个任务同时进到待运行队列中时,会先运行优先级高的任务。

在 3.0.0-alpha 之前版本,Apache DolphinScheduler 默认的时间是 UTC+8 时区,但随着用户群体扩大,海外用户和在海外开展跨时区业务的用户在使用中经常被时区所困扰。3.0.0-alpha 支持时区切换后,时区问题迎刃而解,满足了海外用户和出海业务伙伴的需求。例如,如当企业业务涉及的时区包含东八区和西五区,如果想要使用同一个 DolphinScheduler 集群,可以分别创建多个用户,每个用户使用自己当地的时区,对应 DolphinScheduler 对象显示的时间均会切换为对应时区的当地时间,更加符合当地开发者的使用习惯。

使用 Apache DolphinScheduler 3.0.0-alpha 此前版本,用户如果想要操作任务,需要先找到对应的工作流,并在工作流中定位到任务的位置之后才能编辑。然而,当工作流数量变多或单个工作流有较多的任务时,找到对应任务的过程将会变得非常痛苦,这不符合 Apache DolphinScheduler 所追求的 easy to use 理念。所以,我们在 3.0.0-alpha 中增加了任务定义页面,让用户可以通过任务名称快速定位到任务,并对任务进行操作,轻松实现批量任务变更。

除了上述功能外,3.0.0-alpha 版本还进行了很多细节功能增强,如重构任务插件、数据源插件模块,让扩展更简单;恢复了对 Spark SQL 的支持;E2E 测试已经完美兼容新 UI 等。

[#7896] 修复项目授权时生成一个重复授权项目的问题
[#8183] 修复消息显示找不到数据源插件“Spark”的问题
[#8756] 解决使用依赖组件的进程无法在测试和生产环境之间迁移
[#8760] 解决了资源文件删除条件的问题
[#8791] 修复编辑复制节点的表单时影响原始节点数据的问题
[#9243] 解决了某些类型的警报无法显示项目名称的问题

随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。

社区汇总了以下适合新手的问题列表:

来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。

参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。

添加小助手微信时请说明想参与贡献。

来吧,开源社区非常期待您的参与。

我要回帖

更多关于 什么是编程 的文章

 

随机推荐