【问题标题】:java saving 2d array as an object in genetic algorithmjava在遗传算法中将二维数组保存为对象
【发布时间】:2012-08-19 04:38:24
【问题描述】:

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

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

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

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

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

谢谢

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

【问题讨论】:

  • 您说您不能将生成的解决方案暂时存储在内存中……我的第一个问题是,“这个数据集有多大?”其次,您能否为我们提供一些专门用于这部分的代码?第三,从intObject 不是一个好主意,如果你能看到使用包装类的优势,你至少要升级到Integer
  • 您能否提供有关您的实施的详细信息?关于您的“二维”阵列的信息怎么样?它有多大?为什么不能保存解决方案?你尝试了什么?
  • 我已编辑帖子以添加团队创建二维数组的示例代码。我最初想重复组创建 120 次,因为要在 120 个个体上应用选择、交叉和变异,所以实际上二维数组是创建 120 个不同的团队分配并将这 120 个团队分配保存在临时内存中
  • @Makoto:我也尝试过 Integer to Object 但这也没有用
  • 这是唯一的位置noTeams 填充了一个整数值吗?如果是这样,您的数组将无法工作的原因是因为您在第一维中没有分配空间。

标签: java genetic-algorithm multidimensional-array


【解决方案1】:

您的问题是架构之一。您正在一个单独的班级中创建您的人口,而无需将其发送到任何地方。您想将初始化包装在另一个类中。当我写一个新的 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 终止时保存或输出。

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

【讨论】:

  • 我认为这就是我之前所缺少的。我将尝试按照您的建议运行这些课程,并让您知道它是如何工作的(我大约 99% 确信这会解决我的问题)。非常感谢
  • 如果这不能解决您的问题,请随时发布更多信息。如果是,请不要忘记接受答案。
猜你喜欢
  • 2020-11-21
  • 2020-04-24
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多