当前位置: 首页 > 科技观察

Python中从零开始的简单遗传算法_0

时间:2023-03-13 16:32:56 科技观察

遗传算法遗传算法是模拟自然选择过程的优化算法。他们没有使用“数学技巧”,而是复制了我们知道有效的逻辑。遗传算法中的自然选择这种自然选择过程基于适者生存:自然界中使最好的个体(动物、植物或其他)能够生存的过程。这些幸存者然后相互交配以产生新一代。大自然还以基因组突变的形式增加了一些随机性。新一代是好人和坏人的混合体,但在这里,好人会继续生存、交配,然后产生新一代。结果是代代相传的不断改进。员工规划的遗传算法员工规划是优化研究的主题,已被许多公司提出。一旦公司拥有众多员工,就很难找到既能满足业务需求又能满足某些限制条件的计划。在现有的其他解决方案中,遗传算法是解决该问题的优化方法。Python实现在本文中,我将更详细地介绍如何理解遗传算法的不同部分。下面的代码是遗传算法生产代码的简化版本。它针对更好地理解示例而不是速度和可重用性进行了优化。它包含应用于示例数据的每个列出的步骤。遗传算法的6个步骤代码演练遗传算法的步骤:如何为GA编码数据?如何评估GA解决方案?如何为GA编写交配(交叉)代码??如何为遗传算法定义迭代和停止?如果您想随身携带笔记本,可以在此处下载。第1步-如何为遗传算法编码数据?输入数据-两个计划在此代码中,我们将使用同一员工计划的两个不同形状。类型1规划-每个员工:>遗传算法的编码数据-类型1规划-每个员工。图片来自作者。第一个形状将是员工对员工的计划,详细视图。每周计划总数是一个包含每天列表的列表(在我们的例子中是5天)。每个每日清单都包含一个班次列表(在我们的例子中是员工的11个班次)。每个班次都是员工ID(从0到11,仅供参考)、开始时间(0到24小时)和班次持续时间(0到10小时)的列表。我们的员工需要这种类型的计划才能知道他们什么时候工作。类型2计划-每小时总数:>遗传算法的编码数据-类型2计划-每小时总数。图片来自作者。第二种计划类型是每小时雇用的员工总数。商店所有者将使用此计划来决定该计划是否符合商店的估计需求。第2步-如何评估GA解决方案?为了评估小时制人员配置计划,我们需要定义一个目标情况。定义这个目标不是优化的一部分:那将是另一个项目的问题。>定义遗传算法的评估-定义目标情况。图片来自作者。我们确实需要定义如何评估提议计划和目标计划之间的差异。这将按小时计划完成,将多余的员工总小时数添加到缺失的员工总小时数中。这将是我们需要最小化的成本函数。>定义遗传算法的评估-定义成本函数。图片来自作者。我们可以增加人员过多或人员不足的权重,但在这个例子中我让它们相等。第3步—如何为遗传算法编写交配(交叉)代码?遗传算法有两个关键步骤:交配(也称为交叉或重组)和变异。在交配过程中,就像在自然选择中一样,新一代是由亲本群体中个体的后代形成的。将此应用于我们的示例,考虑到将来我们将生成许多不太好的员工计划,并尝试将最好的计划组合在一起。所以我们需要定义一种方法来将两个人(员工计划)相互“混合”。在这个例子中,我决定按如下方式编码:从总体中选择一个随机妈妈从总体中选择一个随机父亲创建一个与父母大小相同的孩子,但随机填充0和1。孩子的位置是一,我们从父亲那里得到数据,孩子的位置是零,我们从他的母亲那里得到数据。我们为每个孩子重复(孩子数量等于人口)>为遗传算法定义交叉。图片来自作者。这是一种方法,还有许多其他方法是可行的。为了使遗传算法起作用,在组合代码中具有随机性很重要。当然,该组合必须适合您在步骤1中选择的数据结构。步骤4-如何为遗传算法编写突变代码?遗传算法的第二个重要步骤是变异。它包括向新一代添加完全随机的更改。这种随机变化允许将新值添加到不再存在的种群中。例如,考虑这样一种情况,算法经过多次迭代,由于选择和组合过程中的随机性,上午10点之前的所有开始时间都已取消选择。如果没有突变,算法将永远无法检索到该值,而稍后可能会出现更好的解决方案。随机插入(少量)新值有助于算法摆脱这种情况。>为遗传算法定义突变。图片来自作者。此处编码为用0到10之间的随机值替换轮班持续时间或轮班开始时间的添加。如果我们指定n_mutations值,则可以重复该操作。第5步-如何定义遗传算法的选择?选择过程非常简单:首先,选择所有可行的方案:剔除员工工作时间超过10小时的方案。>定义遗传算法的选择—可行性。图片来自作者。然后,将评估函数应用于每个人(即每个员工计划)并选择最佳人选。所选个体的数量在代码中保持可变。>定义遗传算法的选择—成本。图片来自作者。第6步-如何为遗传算法定义迭代和停止?这段代码的最后一部分是将前面所有的构建块添加到整体代码中进行迭代。>为遗传算法定义迭代。图片来自作者。优化参数调整为了使遗传算法完美运行,选择正确的参数很重要:generation_size、n_mutations和n_best在这里很重要。调整这三个将允许找到两者的最佳组合:收敛到一个解决方案(而不是随机转向没有改进)避免陷入局部最优如果调整后你的算法仍然卡住,另一个改进方向是调整交配和变异函数,看看会发生什么。(本文翻译自JoosKorstanje的文章《A Simple Genetic Algorithm from Scratch in Python》,参考:https://towardsdatascience.com/a-simple-genetic-algorithm-from-scratch-in-python-4e8c66ac3121)