0

一年多来,我一直在研究一个多目标优化问题,该问题使用遗传算法来显示最佳解决方案。

问题涉及根据许多标准将人员分配到不同的团队。我已经完成了初始化阶段,适应度函数编码也完成了。但是,我无法将生成的(二维数组)解决方案保存为对象并将它们暂时保存在内存中,以便它们可以在 GA 的后期阶段使用:选择、交叉和变异。

我正在使用轮盘赌选择和略有不同的交叉和变异算法。我对这些没有问题。只是我无法找到一种方法将一个生成的解决方案(在这种情况下是完整的团队分配)暂时保存在内存中,然后生成另一个解决方案并将其保存在内存中,然后再保存一个,依此类推。

我已经尝试了很多我能想到的不同的事情,其中​​两个我记得是:(i)将二维数组类型从 int 更改为 Object 但这会产生错误,因为创建团队的二维数组使用另一个用于定位列表中人员 ID 索引位置的 int 数组;(ii) 使用静态类字段变量,在初始种群生成类运行后每次递增。

我已经研究了几个月,并尝试了我能想到的一切。如果有人可以指导我,甚至给我一个关于如何保存二维数组以便我可以将其用于 GA 后期阶段的提示,那将是非常有帮助的。

谢谢

编辑:这是具有创建团队的 2d 数组位的初始人口类:每一行代表团队编号,列是成员 ID(我已经排除了一些引用其他类的代码,而是将其放在文字中):

4

1 回答 1

0

您的问题是架构之一。您正在一个单独的班级中创建您的人口,而无需将其发送到任何地方。您想将初始化包装在另一个类中。当我写一个新的 GA 时,我通常会做这样的事情。

class GeneticAlgorithm {

  public static int[][] population;
  public static double mutationRate;
  public static double crossoverRate;

  public int[][] initializePopulation //this is where your createTeams method would go
  public int[][] mutation 
  public int[][] crossover

  public void runGA

}

这是我的 GA 的基本结构。在您的 runGA 方法中,您可以循环任意多代,无论是基于退出标准还是静态数字。每一代你只需将你当前的种群传递给你的变异和交叉函数,它就会返回结果种群。当您执行所有这些操作时,您的人口被安全地存储在一个变量中,该变量可以在您的 GA 终止时保存或输出。

希望对您有所帮助,并祝您好运。

于 2012-07-25T01:04:13.410 回答