遗传算法 – 班次规划

我具备一些基本的遗传算法知识,并且已经编写了一个简单的应用程序来寻找某个函数的最大值X,但现在我遇到的问题是,对于像班次规划这样更复杂的问题,染色体、个体、种群等应该如何设计。假设我们有一些员工和一些班次,我们希望将它们相互分配。遗传算法的关键部分应该如何设计才能适用于这种数据?


回答:

让我做一些假设来展示如何为这个问题建立一个遗传算法模型的例子。

假设

  1. 假设有 n 个员工,标记为 e_1, e_2, …, e_n,以及 n 个班次,标记为 s_1, s_2, …, s_n
  2. 为了解释的简便,假设 n 是一个 偶数

个体的染色体

假设每个染色体由 n 个二维元组组成。每个元组是一对班次和员工(s_i, e_i)。因此,n 个元组就是将所有员工映射到班次的过程。这样,一个染色体看起来会像这样:

{ {s_x1, e_y1}, {s_x2, e_y2}, … {s_xn, e_yn} }

其中,xi, yi ∈ {1,2, ..,n} 对所有 i,
s_xi != s_xj 当 i != j,
e_yi != e_yj 当 i != j

种群

根据 n 的值,我们可以有一个由 D 个个体组成的种群,每个个体都具有上述染色体配置。你可以从随机化 D 个生物的染色体配置开始(尽管可能有更好的方法来做这件事)。

繁殖

对于一代 D 个个体,选择任意两个个体,比如 d_i 和 d_j,用于 交叉。让我们在下一代中获得两个子代,比如 c_i 和 c_j。假设 n 为 4 以便于解释,过程如下:

d_i = { {s_i1, e_i1}, {s_i2, e_i2}, s_i3, e_i3, {s_i4, e_i4} }
d_j = { {s_j1, e_j1}, {s_j2, e_j2}, s_j3, e_j3, {s_j4, e_j4} }

交叉后繁殖出,

c_i = { {s_i1, e_j3}, {s_i2, e_j2}, s_i3, e_j1, {s_i4, e_j4} }
c_j = { {s_j1, e_i3}, {s_j2, e_i2}, s_j3, e_i1, {s_j4, e_i4} }

如何在计算上处理更大的 n,我留给你思考。

我还有一些关于如何对模型应用 变异 的想法,但我也会让你自己思考(而且这只是一个帮助你开始的示例模型)。

关于适应度函数的思考

假设你有一个称为 员工满意度 的成本适应度函数,它是种群中一个个体内所有员工的 幸福度(假设是一个-10到10之间的整数)的总和。

现在,假设一个员工(e_1)如果被分配到某个班次(s_1),他的幸福度是-4,但如果被分配到另一个班次(s_4),他的幸福度是10。

那么,种群中一个个体的适应度(员工满意度)可以简单地是(当然可以有更复杂的数学函数)所有 n 个员工的幸福度之和。理想的最佳适应度情景是所有员工的幸福度都为10,员工满意度总和为 n x 10,而最差的适应度(最低的 员工满意度)是 n x -10

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注