【问题标题】:Genetic algorithm - shift planning遗传算法 - 班次计划
【发布时间】:2015-08-08 19:51:25
【问题描述】:

我有一些基本的遗传算法知识,我编写了一个简单的应用程序来查找 X 最大化某个函数的值,但我现在正在努力解决的问题是染色体、个体、种群等应该如何看起来更复杂轮班计划等问题。假设我们有一些员工,一些班次,我们想将他们分配给彼此。遗传算法的关键部分如何使其适用于此类数据?

【问题讨论】:

    标签: artificial-intelligence genetic-algorithm


    【解决方案1】:

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

    假设

    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 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,你如何在计算上做到这一点,我会让你思考。

    我也有一些关于如何将mutation应用于模型的想法,但我也会让你思考一下(此外,这只是一个让你入门的示例模型)。

    关于适应度函数的思考

    假设您有一个称为员工满意度的成本适应度函数,它是个人内所有员工的幸福度(例如-10到10之间的整数)的总和人口。

    现在,假设一个员工 (e_1) 如果给定一个班次 (s_1),他的幸福感是 -4,但如果给另一个班次 (s_4),他的幸福感是 10。

    那么,总体中个体的适应度(员工满意度)可以简单地是(可以有更复杂的数学函数)所有n的幸福之和em> 员工。理想的最佳健身方案是所有员工有 10 个幸福和员工满意度与最差的健身(最少员工满意度)为n x -10。

    【讨论】:

    • 谢谢!只是想知道——如果我有不同员工要求的轮班——例如,一个轮班需要一名员工,而另一班需要两名员工?那么我的染色体应该由 3D 元组而不是 2D 组成,如果只分配了一名员工,则包含 null 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2011-01-11
    • 2011-04-16
    • 1970-01-01
    • 2012-07-07
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多