我想知道我是否能得到一些关于提高一个实现遗传算法的程序的整体效率的建议。是的,这是一个作业问题,但我已经完成了我自己的作业,我只是在寻找一种方法让它执行更好的问题描述。
我的程序目前读取由成分类型h或p (例如: hphpphhphpphphhpphph)组成的给定链,对于每一个H和P,它生成一个随机移动(上、下、左、右),并将移动添加到包含在“染色体”对象中的arrayList中。在一开始,这个程序正在为10,000条染色体产生19次移动。
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学生),而我最初对我的问题所在的猜测有点不正确。从分析人员告诉我的情况来看,最大的热点是:
public int compareTo(Chromosome other) {
if(this.fitness >= other.fitness)
return 1;
if(this.fitness ==other.fitness )
return 0;
else
return -1;
}
发布于 2011-01-13 00:39:19
与其重复排序填充,不如使用一个保持其内容已排序的集合。(例如TreeSet)
发布于 2011-01-13 00:00:25
我相信我受到最大打击的地方是计算每个染色体的适应度。
如果您不确定,那么我想您还没有在程序上运行分析器。
如果您想要提高性能,首先要做的是分析。
发布于 2011-01-13 00:03:52
如果你的健康指数在几代人之间是一致的(即不依赖于人口中的其他成员),那么我希望你至少将它存储在染色体对象中,所以你只计算了人口中的每一个成员一次。在这样的情况下,您将只计算新生成/组装的染色体上的每一次迭代的适应度。如果没有更多关于健身的信息,如果计算的话,很难在这方面提供任何优化。
https://stackoverflow.com/questions/4675401
复制相似问题