首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java与提高遗传算法的效率

Java与提高遗传算法的效率
EN

Stack Overflow用户
提问于 2011-01-12 23:55:20
回答 5查看 825关注 0票数 4

我想知道我是否能得到一些关于提高一个实现遗传算法的程序的整体效率的建议。是的,这是一个作业问题,但我已经完成了我自己的作业,我只是在寻找一种方法让它执行更好的问题描述

我的程序目前读取由成分类型h或p (例如: hphpphhphpphphhpphph)组成的给定链,对于每一个H和P,它生成一个随机移动(上、下、左、右),并将移动添加到包含在“染色体”对象中的arrayList中。在一开始,这个程序正在为10,000条染色体产生19次移动。

代码语言:javascript
运行
复制
   SecureRandom sec = new SecureRandom();
    byte[] sbuf = sec.generateSeed(8);
    ByteBuffer bb = ByteBuffer.wrap(sbuf);
    Random numberGen = new Random(bb.getLong());
    int numberMoves = chromosoneData.length();
    moveList = new ArrayList(numberMoves);
    for (int a = 0; a < numberMoves; a++) {
        int randomMove = numberGen.nextInt(4);
        char typeChro = chromosoneData.charAt(a);
        if (randomMove == 0) {
            moveList.add(Move.Down);
        } else if (randomMove == 1) {
            moveList.add(Move.Up);
        } else if (randomMove == 2) {
            moveList.add(Move.Left);
        } else if (randomMove == 3) {
            moveList.add(Move.Right);
        }

    }

在此之后,从群体中选择染色体进行杂交。我的交叉函数从最适合的人群中随机选择了第一条染色体,另一条随机从前20%的人群中选出。选择的染色体然后被交叉,一个突变函数被称为。我相信我受到最大打击的地方是计算每条染色体的适合度。目前,我的适应度函数创建了一个作为网格的2d数组,从上面显示的函数生成的移动列表中按顺序排列移动,然后遍历数组进行适应度计算。(即,在位置2,1处的H是Cord 1,1,2,0或2,2也是H,如果找到H,则只会增加所发现的键数)

在计算完成后,从我的种群中删除最不适合的染色体,并添加新的染色体,然后对染色体阵列列表进行排序。冲洗并重复,直到找到目标溶液

如果你们想看更多我的代码来证明我在寻求帮助之前确实做了这些工作,请告诉我(不要发到太多,所以其他学生不能只是复制我的东西)。

正如评论中所建议的那样,我在我的应用程序上运行了分析器(以前从未使用过它,只有一年级的CS学生),而我最初对我的问题所在的猜测有点不正确。从分析人员告诉我的情况来看,最大的热点是:

  1. 当将新染色体与群体中的其他染色体进行比较时,以确定其位置。我这样做是通过实现可比的:
代码语言:javascript
运行
复制
    public int compareTo(Chromosome other) {
        if(this.fitness >= other.fitness)
                        return 1;
             if(this.fitness ==other.fitness )
                       return 0;
                else
                        return -1;
    }
  1. 所描述的另一个问题是在我的实际进化功能中,消耗了大约40%的CPU时间。以下所述方法的代码 double topPercentile = highestValue;topPercentile = topPercentile * .20;topPercentile = Math.ceil(topPercentile);randomOne =numberGen.nextInt ( int ) topPercentile;//下Bount,对于随机的两个,因此它来自最前面的20% int randomTwo = numberGen.nextInt(highestValue -(Int) topPercentile);randomTwo = randomTwo + 25;//System.out.println(“选择第一个:+ randomOne +”第二选择:“+numberGen.nextInt”;染色体=(染色体)();染色体secondChrom =(染色体) populationList.get(randomTwo);//System.out.println(“选择两个染色体杂交”);染色体resultantChromosome = firstChrom.crossOver(secondChrom);populationList.add(resultantChromosome);Collections.sort(populationList);populationList.remove(highestValue);染色体bestResult =(染色体) populationList.get(0);
  2. 另一个主要的性能命中是由post中的第一个代码示例执行的信息总体播种。
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-13 00:39:19

与其重复排序填充,不如使用一个保持其内容已排序的集合。(例如TreeSet)

票数 2
EN

Stack Overflow用户

发布于 2011-01-13 00:00:25

我相信我受到最大打击的地方是计算每个染色体的适应度。

如果您不确定,那么我想您还没有在程序上运行分析器。

如果您想要提高性能,首先要做的是分析。

票数 5
EN

Stack Overflow用户

发布于 2011-01-13 00:03:52

如果你的健康指数在几代人之间是一致的(即不依赖于人口中的其他成员),那么我希望你至少将它存储在染色体对象中,所以你只计算了人口中的每一个成员一次。在这样的情况下,您将只计算新生成/组装的染色体上的每一次迭代的适应度。如果没有更多关于健身的信息,如果计算的话,很难在这方面提供任何优化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4675401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档