Optimization 遗传算法如何解决工人问题的任务分配

Optimization 遗传算法如何解决工人问题的任务分配,optimization,genetic-algorithm,Optimization,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

我试图理解遗传算法是如何用来解决分配给工人的任务问题的,正如一篇名为《使用遗传算法解决分配给工人的任务》的论文所描述的那样

作为一个例子,我有下表,它表示工人以及他们执行任务所需的时间

## 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个关键阶段组成:初始种群、适应度函数、选择、交叉交配和变异

据我所知,该表代表了由染色体代表的个体的初始群体。染色体内部含有基因


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

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

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

对于突变,您还可以一次随机选择一个解决方案,并改变它们的一个特征


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

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

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

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

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

请参阅,以获取您可以查看的简单实现

变异不常发生,因为它可能具有相当大的破坏性,通常将概率设置为1/问题大小。从上面的置换GA代码使用一个简单的适应度

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

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

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不会总是给你最佳的解决方案,但它通常会给你很好的解决方案谢谢你的回复。最后一个问题,我如何表示染色体,以便识别我所指的任务,分配给它的工人,并显示工人执行任务需要多长时间?我相信这是我需要的信息,以便计算适合度,应用交叉和变异,如果我错了就纠正我
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