【问题标题】:How can Genetic Algorithms solve task-allocation to worker problems遗传算法如何解决任务分配给工人的问题
【发布时间】:2020-04-22 23:44:26
【问题描述】:

我正在尝试了解如何使用遗传算法来解决分配给工人的任务问题,正如一篇名为 Solving Task Allocation to the Worker Using Genetic Algorithm 的论文中所述。

例如,我有下表代表工人以及他们执行任务所需的时间。

## Task number going left to right
## Worker number going down

# | 1 | 2 | 3 | 4 | 5 |
1 | 2 | 5 | 7 | 1 | 6 |
2 | 5 | 4 | 9 | 2 | 4 |
3 | 4 | 3 | 2 | 1 | 6 |
4 | 7 | 1 | 8 | 9 | 2 |
5 | 3 | 2 | 6 | 1 | 8 |

问题涉及为每个任务选择执行任务最快的工人。我读过遗传算法由 5 个关键阶段组成:初始种群、适应度函数、选择、交叉(交配)和变异。

我了解该表格代表了由染色体代表的个体的初始种群。染色体内部含有基因。

我不明白的是其他阶段以及这将如何解决问题。我上面提到的其他阶段(适应度函数、选择、交叉(交配)和突变)与解决这个问题有什么关系?

【问题讨论】:

    标签: optimization genetic-algorithm


    【解决方案1】:

    适应度函数是解决方案质量的度量。您可以使用它来区分解决方案,例如,在最大化问题中,适应度为 10 的解决方案优于适应度为 5 的解决方案

    一旦您知道每个解决方案的适用性,您就可以选择更好的解决方案并避免更差的解决方案。有许多类型的选择方法,例如锦标赛选择,它选择随机选择的最佳解决方案

    交叉用于从选定的解决方案创建新的后代解决方案。这背后的想法是将好的基因结合在更好的解决方案中,以创造更好的解决方案

    变异只是在解决方案中产生一点随机性。当解决方案过于相似并因此陷入所谓的局部最优时,这可能特别有用。

    请参阅https://github.com/mayoayodele/Permutation-GA 了解您可以查看的简单实现

    突变不经常进行,因为它可能具有很大的破坏性,通常将概率设置为 1/problem_size。从上面使用简单适应度的置换 GA 代码

    for (int i = 0; i < Solution.size(); i++) {
                fitness += (i * Solution.get(i));
    
            }
    

    由以下父母产生后代,如下所示,

    Parent1 [3, 0, 7, 1, 8, 9, 4, 5, 6, 2]
    Fitness 219
    Parent2 [2, 7, 0, 4, 5, 6, 8, 9, 1, 3]
    Fitness 215
    offspring [3, 0, 7, 1, 8, 9, 4, 5, 2, 6]
    Fitness 223
    

    在上面的例子中,后代比父母都好,但情况并非总是如此,例如

    Parent1 [9, 3, 1, 2, 8, 4, 7, 0, 5, 6]
    Fitness 199
    Parent2 [0, 4, 8, 3, 6, 1, 2, 7, 9, 5]
    Fitness 236
    offspring [9, 3, 1, 2, 8, 0, 4, 6, 7, 5]
    Fitness 210
    

    突变见下例

    offspring [3, 5, 2, 1, 9, 8, 0, 4, 7, 6]
    Fitness 226
    offspring after mutation [3, 5, 2, 1, 9, 0, 4, 7, 8, 6]
    Fitness 239
    

    在上面的例子中,变异提高了适应度,但在下面的例子中没有

    offspring [6, 8, 3, 0, 4, 1, 7, 5, 2, 9]
    209
    offspring after mutation [6, 8, 3, 0, 4, 1, 7, 5, 9, 2]
    202
    

    【讨论】:

    • 您能否提供一个直观的示例,说明在第一代发生变异后,产生的后代如何根据其适应度来寻找替代的新解决方案?这是我难以理解的部分。
    • @Corbuk 我在上面给出的答案中添加了更多信息,希望对您有所帮助。最好的方法是尝试运行一些代码并打印出每一代发生的事情,看看它是如何工作的。 GA 并不总是为您提供最佳解决方案,但它通常会为您提供良好的解决方案
    • 感谢您的回复。最后一个问题,我将如何表示染色体,以便我可以识别我所指的任务,分配给它的工人并显示工人执行任务需要多长时间? (我相信这是我计算适应度、应用交叉和变异所需的信息,如果我错了,请纠正我)
    【解决方案2】:

    排队的随机工人向量是一种潜在的解决方案。 (初始化) 要查看他们如何执行任务,您可以使用目标函数(适应度函数是评估每个解决方案的方式)。基本上,您可以使用您提供的表格评估每个工人所需的时间。

    对于交叉,您采用 2 个(随机)解决方案并混合它们的特征。文献中有多种方法可以做到这一点。

    对于突变,您一次选择(也随机)1 个解决方案,然后更改其中一个特征。

    您评估新的解决方案,并为下一次迭代保留迄今为止找到的 N 个最佳解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2019-02-23
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多