遗传算法 - 轮班计划

时间:2015-08-08 19:51:25

标签: artificial-intelligence genetic-algorithm

我有一些基本的遗传算法知识,我编写了一个简单的应用程序,找到X最大化某些功能的价值,但我现在正在努力的是染色体,个体,人口等应该是怎样的对于一些更复杂的问题,如班次规划。我们假设我们有一些员工,一些轮班,我们希望将他们分配给彼此。遗传算法的关键部分如何使其适用于此类数据?

1 个答案:

答案 0 :(得分:0)

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

假设

  1. n 员工标记为e_1,e_2,...,e_n和n个名为s_1,s_2,...,s_n的班次
  2. 为简化说明,设n为偶数数字
  3. 个体的染色体

    让每个染色体由 n 2D元组组成。每个元组都是一对班次和一名员工(s_i,e_i)。因此, n 元组是所有员工对轮班的映射。因此染色体看起来像这样:

      

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

      其中,xi,yi c {1,2,..,n}表示所有i,
      s_xi!= s_xj for i!= j,
      e_yi!= e_yj for i!= j

    人口

    根据 n ,我们可以拥有一群 D 个体,每个人都具有上述染色体配置。您可以从一开始就随机化 D 生物的染色体配置开始(尽管有更好的方法可以做到这一点)。

    生殖

    鉴于一代 D ,个人选择任意两个人,比如d_i和d_j,选择交叉。让我们在下一代获得2个孩子,比如说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 进行计算,我会让你思考。

    我也有一些关于如何将变异应用于模型的想法,但我会让你想到这一点(此外这只是一个让你入门的示例模型)。 / p>

    关于健身功能的想法

    让我们考虑一下名为员工满意度的成本适应度函数,它是个人内所有员工的幸福(比如-10到10之间的整数)的总和人口。

    现在,说一名员工(e_1),如果给予某个班次(s_1),他的幸福感为-4,但如果给予另一班次(s_4),他的幸福感为10岁。

    然后,群体中个体的适应度(员工满意度)可以简单地(可能有更复杂的数学函数)所有 n的幸福总和员工。理想的最佳健身方案是,与最差的健身相比,所有员工都有10 幸福员工满意度总和 nx 10 (最少员工满意度 nx -10