Zjr*_*jr8 4 java performance genetic-algorithm
嘿伙计们,我想知道我是否可以就提高实施遗传算法的程序的整体效率提出一些建议.是的,这是一个分配问题,但我已经完成了我自己的任务,并且只是想找到一种方法来让它更好地执行 问题描述
我的程序目前读取由成分类型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);
}
}
Run Code Online (Sandbox Code Playgroud)
在此之后,选择从种群到交叉的染色体.我的交叉函数从最适合的20%的人群中随机选择第一条染色体,另一条从最高的20%之外随机选择.然后交叉选择的染色体并调用突变功能.我相信我受影响最大的领域是计算每个染色体的适应度.目前我的健身功能创建了一个二维数组作为网格,从上面显示的函数生成的移动列表中按顺序放置移动,然后循环遍历数组进行适应度计算.(IE发现,位置[2,1]的H是Cord [1,1] [3,1] [2,0]或[2,2]也是H,如果找到H,它只增加计数债券发现)
在计算完成后,从我的群体中移除最不适合的染色体并添加新的染色体,然后对染色体的阵列列表进行分类.冲洗并重复直至找到目标溶液
如果你们想看到更多我的代码来证明我在寻求帮助之前实际完成了工作,请告诉我(不要发帖到很多,所以其他学生不能只是复制意大利面我的东西)
正如评论中所建议的那样,我在我的应用程序上运行了探查器(以前从未使用它,只有第一年的CS学生),而我对我遇到问题的地方的初步猜测有点不正确.从分析器告诉我的是,大热点是:
1)将新染色体与人群中的其他染色体进行比较以确定其位置.我通过实现Comparable来做到这一点.
public int compareTo(Chromosome other) {
if(this.fitness >= other.fitness)
return 1;
if(this.fitness ==other.fitness )
return 0;
else
return -1;
}
Run Code Online (Sandbox Code Playgroud)
2)所描述的另一个问题是我的实际演化功能,占用了大约40%的CPU时间.以下所述方法的代码示例
double topPercentile = highestValue;
topPercentile = topPercentile * .20;
topPercentile = Math.ceil(topPercentile);
randomOne = numberGen.nextInt((int) topPercentile);
//Lower Bount for random two so it comes from outside of top 20%
int randomTwo = numberGen.nextInt(highestValue - (int) topPercentile);
randomTwo = randomTwo + 25;
//System.out.println("Selecting First: " + randomOne + " Selecting Second: " + randomTwo);
Chromosome firstChrom = (Chromosome) populationList.get(randomOne);
Chromosome secondChrom = (Chromosome) populationList.get(randomTwo);
//System.out.println("Selected 2 Chromosones Crossing Over");
Chromosome resultantChromosome = firstChrom.crossOver(secondChrom);
populationList.add(resultantChromosome);
Collections.sort(populationList);
populationList.remove(highestValue);
Chromosome bestResult = (Chromosome) populationList.get(0);
Run Code Online (Sandbox Code Playgroud)
3)另一个主要的性能指标是初始种群播种,由帖子中的第一个代码样本执行
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |