有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

遗传算法中二维数组对象的java保存

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

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

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

我尝试过很多我能想到的不同的事情,从中我能记得两件事: (i) 将2d数组类型从int更改为Object,但这会导致错误,因为创建团队的2d数组使用另一个int数组来定位列表中的人员id索引位置; (ii)使用静态类字段变量,该变量将在运行初始人口生成类后每次递增

我已经研究了几个月了,尝试了我能想到的一切。如果有人能指导我,甚至给我一个提示,告诉我如何保存一个2d数组,以便我可以在GA的后期阶段使用它,那将是非常有帮助的

谢谢

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


共 (1) 个答案

  1. # 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终止时保存或输出

    希望这有帮助,祝你好运