Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- protected void doOnePtCrossover(Chromosome Chrom1, Chromosome Chrom2)
- {
- String sNewChrom1, sNewChrom2;
- int iCrossoverPoint;
- String sChrom1, sChrom2;
- iCrossoverPoint = getRandom(chromosomeDim - 2);
- sChrom1 = Chrom1.getGenesAsStr();
- sChrom2 = Chrom2.getGenesAsStr();
- // CREATE OFFSPRING ONE
- sNewChrom1 =
- sChrom1.substring(0, iCrossoverPoint)
- + sChrom2.substring(iCrossoverPoint, chromosomeDim);
- // CREATE OFFSPRING TWO
- sNewChrom2 =
- sChrom2.substring(0, iCrossoverPoint)
- + sChrom1.substring(iCrossoverPoint, chromosomeDim);
- ((ChromChars) Chrom1).setGenesFromStr(sNewChrom1);
- ((ChromChars) Chrom2).setGenesFromStr(sNewChrom2);
- }
- protected void doOnePtCrossover(Chromosome Chrom1, Chromosome Chrom2)
- {
- super.doOnePtCrossover(Chrom1, Chrom2); //do normal crossover
- // Now eliminate any duplicated genes by replacing duplicates with genes which
- //were left out of the chromosome.
- // For example if gene space = 'ABCDEFGH' and sChrom1 = 'ABCDDEFG', then the
- //gene 'D' is duplicated and 'H' has been left out. Swap the 2nd 'D' with 'H' and
- //the problem is fixed.
- String sChrom1 = getChromWithoutDuplicates(Chrom1.getGenesAsStr());
- String sChrom2 = getChromWithoutDuplicates(Chrom2.getGenesAsStr());
- ((ChromChars)Chrom1).setGenesFromStr(sChrom1);
- ((ChromChars)Chrom2).setGenesFromStr(sChrom2);
- }
- protected String getChromWithoutDuplicates(String sChromosome)
- {
- int iPos;
- int iRandomGeneLeftOut;
- String sGene, sGenesLeftOut, sRestOfChrom;
- //first get a string (which acts as a list) of all genes left OUT of this chrom
- sGenesLeftOut = "";
- for (int i = 0; i < this.possGeneValues.length(); i++)
- {
- sGene = "" + this.possGeneValues.charAt(i);
- iPos = sChromosome.indexOf(sGene);
- if (iPos < 0) //this gene not found in chromosome
- sGenesLeftOut += sGene;
- }
- if (sGenesLeftOut.length() == 0) //no duplicate genes, so exit
- return (sChromosome);
- StringBuffer sbChromosome = new StringBuffer(sChromosome);
- StringBuffer sbGenesLeftOut = new StringBuffer(sGenesLeftOut);
- for (int i = 0; i < chromosomeDim; i++)
- {
- sGene = "" + sbChromosome.charAt(i);
- sRestOfChrom = sbChromosome.substring(i + 1, chromosomeDim);
- iPos = sRestOfChrom.indexOf(sGene);
- if (iPos > -1) //gene also found in a later part of the chromosome, it is duplicated!
- {
- //assign this duplicate gene a random value from the list of genes left out
- iRandomGeneLeftOut = getRandom(sbGenesLeftOut.length());
- sbChromosome.setCharAt(iPos + i + 1, sbGenesLeftOut.charAt(iRandomGeneLeftOut));
- //now take this "gene left out" out of the list (string) of available genes
- sbGenesLeftOut.deleteCharAt(iRandomGeneLeftOut);
- }
- }
- return (sbChromosome.toString());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement