public static IChromosome inheritChromosome(Random rand, IChromosome parent1, IChromosome parent2) { IAllele choice1; if (rand.nextBoolean()) { choice1 = parent1.getPrimaryAllele(); } else { choice1 = parent1.getSecondaryAllele(); } IAllele choice2; if (rand.nextBoolean()) { choice2 = parent2.getPrimaryAllele(); } else { choice2 = parent2.getSecondaryAllele(); } if (rand.nextBoolean()) { return new Chromosome(choice1, choice2); } else { return new Chromosome(choice2, choice1); } }
@Override public IAlleleFlowerSpecies getSecondary() { return (IAlleleFlowerSpecies) getChromosomes()[EnumFlowerChromosome.SPECIES.ordinal()].getSecondaryAllele(); }
@Override public boolean isGeneticEqual(IGenome other) { IChromosome[] genetics = other.getChromosomes(); if (chromosomes.length != genetics.length) { return false; } for (int i = 0; i < chromosomes.length; i++) { IChromosome chromosome = chromosomes[i]; IChromosome otherChromosome = genetics[i]; if (chromosome == null && otherChromosome == null) { continue; } if (chromosome == null || otherChromosome == null) { return false; } if (!chromosome.getPrimaryAllele().getUID().equals(otherChromosome.getPrimaryAllele().getUID())) { return false; } if (!chromosome.getSecondaryAllele().getUID().equals(otherChromosome.getSecondaryAllele().getUID())) { return false; } } return true; }
@Nullable private static IChromosome[] mutateSpecies(World world, IButterflyNursery nursery, IGenome genomeOne, IGenome genomeTwo) { IChromosome[] parent1 = genomeOne.getChromosomes(); IChromosome[] parent2 = genomeTwo.getChromosomes(); IGenome genome0; IGenome genome1; IAllele allele0; IAllele allele1; if (rand.nextBoolean()) { allele0 = parent1[EnumButterflyChromosome.SPECIES.ordinal()].getPrimaryAllele(); allele1 = parent2[EnumButterflyChromosome.SPECIES.ordinal()].getSecondaryAllele(); genome0 = genomeOne; genome1 = genomeTwo; } else { allele0 = parent2[EnumButterflyChromosome.SPECIES.ordinal()].getPrimaryAllele(); allele1 = parent1[EnumButterflyChromosome.SPECIES.ordinal()].getSecondaryAllele(); genome0 = genomeTwo; genome1 = genomeOne; } for (IButterflyMutation mutation : ButterflyManager.butterflyRoot.getMutations(true)) { float chance = mutation.getChance(world, nursery, allele0, allele1, genome0, genome1); if (chance > rand.nextFloat() * 100) { return ButterflyManager.butterflyRoot.templateAsChromosomes(mutation.getTemplate()); } } return null; }
private boolean calculateMatchesTemplateGenome() { IAlleleTreeSpecies primary = getPrimary(); IAllele[] template = getSpeciesRoot().getTemplate(primary); IChromosome[] chromosomes = getChromosomes(); for (int i = 0; i < chromosomes.length; i++) { IChromosome chromosome = chromosomes[i]; String templateUid = template[i].getUID(); IAllele primaryAllele = chromosome.getPrimaryAllele(); if (!primaryAllele.getUID().equals(templateUid)) { return false; } IAllele secondaryAllele = chromosome.getSecondaryAllele(); if (!secondaryAllele.getUID().equals(templateUid)) { return false; } } return true; } }
allele1 = (IAlleleTreeSpecies) parent2[EnumTreeChromosome.SPECIES.ordinal()].getSecondaryAllele(); } else { allele0 = (IAlleleTreeSpecies) parent2[EnumTreeChromosome.SPECIES.ordinal()].getPrimaryAllele(); allele1 = (IAlleleTreeSpecies) parent1[EnumTreeChromosome.SPECIES.ordinal()].getSecondaryAllele();
IAllele secondary = chromosome.getSecondaryAllele(); if (secondary == null) { String message = String.format("Tried to create a genome for '%s' from an invalid chromosome template. " +
allele1 = (IAlleleBeeSpecies) parent2[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele(); } else { allele0 = (IAlleleBeeSpecies) parent2[EnumBeeChromosome.SPECIES.ordinal()].getPrimaryAllele(); allele1 = (IAlleleBeeSpecies) parent1[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele();
secondaryAlleles[i] = gene.getAllele(); } else { secondaryAlleles[i] = chromosome.getSecondaryAllele();
if (world.rand.nextBoolean()) { alleleFirst = (IAlleleFlowerSpecies) parentFirst[EnumTreeChromosome.SPECIES.ordinal()].getPrimaryAllele(); alleleSecond = (IAlleleFlowerSpecies) parentSecond[EnumTreeChromosome.SPECIES.ordinal()].getSecondaryAllele(); genome0 = genomeFirst; genome2 = genomeSecond; } else { alleleFirst = (IAlleleFlowerSpecies) parentSecond[EnumTreeChromosome.SPECIES.ordinal()].getPrimaryAllele(); alleleSecond = (IAlleleFlowerSpecies) parentFirst[EnumTreeChromosome.SPECIES.ordinal()].getSecondaryAllele(); genome0 = genomeSecond; genome2 = genomeFirst;