[jgap-users] RE: evolve()
Brought to you by:
klausikm
From: Kam, M. C <mic...@lm...> - 2003-06-25 20:25:40
|
Hi Neil, I actually changed it so that it does show 16 chromosomes with each generation by passing in 16 as an argument to my implementation of select(). This fixed the problem of how it only showed 2 previously. However, the genes within each chromsome are not changing after each generation. So with each iteration of evolve(), I'm seeing the exact same chromosomes. I was wondering if you could take a look at my JgapAPI.java specifically at my implementation of select(): public Chromosome[] select(Configuration a_activeConfiguration, int a_howManyToSelect) { System.out.println("select() in JgapAPI is called"); Chromosome[] cPersist = new Chromosome[a_howManyToSelect]; for (int i = 0; i < a_howManyToSelect; i++) { cPersist[i] = (Chromosome) currentGen.get(i); } return cPersist; And in setChoices(): public void setChoices(int[] theChoices) { for (int i = 0; i <theChoices.length; i++) { currentPop.m_chromosomes[i] = currentPop.m_chromosomes[theChoices[i]]; } //choices = theChoices; } I'm essentially overwriting the m_chromosomes array that was setup when I instantiated a DefaultConfiguration() so that m_chromosomes is now set to the chromosomes the user choses. Then evovlve() is called. Do you know what could be causing these chromosomes to NOT be changing? Thanks, Michelle Michelle Kam (408) 742-2881 Lockheed Martin Space Systems Co. SSM/ATC/MSIS B/153 O/L922 1111 Lockheed Martin Way, Sunnyvale, CA 94089 -----Original Message----- From: Neil Rotstan [mailto:ne...@bl...] Sent: Wednesday, June 25, 2003 10:07 AM To: Kam, Michelle C Cc: Michelle Kam; jga...@li... Subject: RE: evolve() Hi Michelle, Here's what Genotype.evolve() does (remember that one call to evolve() evolves the entire population, and not just a single Chromosome): 1. It iterates through each of the configured genetic operators and lets each operator work upon the Chromosome population. The resulting Chromosomes of each operation end up in the working pool (the original population is generally not directly modified). 2. Each of the chromosomes in the working pool (which, again, are the results of the genetic operators) are added to the natural selector. 3. The natural selector is asked to select a number of Chromosomes equal to the original population size (the working pool will usually have a lot more Chromosomes in it than the population size). Those selected chromosomes become the new population generation. 4. Those chromosomes in the working pool that were not selected to become the next generation population are cleaned up. 5. Finally, the working pool itself is emptied and the natural selector is emptied in preparation for the next evolution. The current population can always be retrieved through a call to the Genotype.getChromosomes() method. Neil On Tue, 24 Jun 2003, Kam, Michelle C wrote: > Hi Neil, > > For the evolve() function in Genotype.java, how does it know how many > different chromosomes to produce? I have my population size set for 16 (set > in the config) to represent 16 different cells in a spreadsheet. I also know > that the user will always pick 2 chromosomes (cells) to live to the next > generation. When I evolve() on 2 selected chromosomses, I expect to always > get 16 new different chromosomes in sucessive generations. However, after > one evolve() call, I am only getting 2 new chromosomes. Shouldn't it > continue outputting 16 chromosomes? Which data structure can I access to > tell me what the 16 NEW CHROMOSOMSES are after a call to evolve()? > > It looks like m_chromosomes and the active pool in Genotype.java are cleared > in the last part of evolve() so that could not be the data structure holding > all my cells for the new generation. I also printed out m_chromosomes after > my call to evolve() but that only yielded 2 chromosomse too. > > What holds all the chromosomes in the new generation AFTER they have > recently been evolved()? > > Thanks! > Michelle > > Michelle Kam (408) 742-2881 > Lockheed Martin Space Systems Co. SSM/ATC/MSIS > B/153 O/L922 > 1111 Lockheed Martin Way, Sunnyvale, CA 94089 > > > > > -----Original Message----- > From: Neil Rotstan [mailto:ne...@bl...] > Sent: Thursday, June 19, 2003 1:00 PM > To: Kam, Michelle C > Cc: Michelle Kam; jga...@li... > Subject: RE: select() > > > Hi Michelle, > > JGAP comes with a natural selection implementation that should work for > most cases. Are you sure you need to create your own? The natural selector > is one of the more challenging things to customize. > > Neil > > > On Thu, 19 Jun 2003, Kam, Michelle C wrote: > > > Hello, > > > > I implemented the FitnessFunction abstract class and the NaturalSelection > > interface both in JgapAPI.java. I have questions about the 3 methods in > > NaturalSelection.java: add(), select(), and emtpy(). Tracing through the > > code, it looks like add() will put a_chromosomeToAdd into the Pool and > > empty() just removes all chromosomes so that the Pool is empty. I > > implemented add() to call releaseChromosome() but I don't know why > > releaseChromosome() clears all the genes within that chromosome. Is that > so > > this same chromosome will not get reused again? So this "Pool" instance > only > > saves chromosome instances so that we don't have to construct new ones? > > > > If empty() is called after each evolution cycle as the comments state, > then > > the tossed out chromosomes will not persist to the next generation. ie. > Why > > do we add() chroms to this pool if they are just going to be deleted after > 1 > > evolution? > > > > > > Also, below is my select() method from JgapAPI.java that just works with > > arrays of Chromosomes instead of with the configuration object. Therefore > it > > looks like the Pool won't get updated. Will this cause a problem for later > > evolutions not having the correct chromosomes stored in m_chromosomes? > > > > public Chromosome[] select(Configuration a_activeConfiguration, > > int a_howManyToSelect) { > > int length = getLength(choices); > > > > Chromosome[] chromosomesPersist = new Chromosome[length]; > > for (int i = 0; i < length, i++) { > > chromosomesPersist[i] = > > currentPop.m_chromosomes[choices[i]]; > > } > > return chromosomesPersist; > > } > > > > Thank you, > > Michelle > > > > Michelle Kam (408) 742-2881 > > Lockheed Martin Space Systems Co. SSM/ATC/MSIS > > B/153 O/L922 > > 1111 Lockheed Martin Way, Sunnyvale, CA 94089 > > > > > > > > > > -----Original Message----- > > From: Neil Rotstan [mailto:ne...@bl...] > > Sent: Wednesday, June 18, 2003 1:22 PM > > To: Michelle Kam > > Cc: jga...@li...; jga...@li...; > > mic...@lm... > > Subject: Re: fitness function > > > > > > Hi Michelle, > > > > I haven't had a chance to go over your code, so I won't try to address all > > your questions here. But if all you want is a system that takes the cells > > selected by a user and then presents exactly those selected cells in the > > next phase, you don't need a genetic algorithm. The purpose of the genetic > > algorithm is to simulate the process of natural selection based on > > measured fitness of potential problem solutions. If you don't need/want a > > fitness value, then the genetic algorithm probably isn't for you. > > > > Let me give a couple of quick examples of how you could apply fitness > > values to your situation. One way would be to have users rate each cell on > > > a scale of 1-10 and then use the rating as the fitness value. Another way > > would be to tally up the total number of times a user selects cells and > > use the tallies as fitness values. Or use a tally across multiple users. > > > > Alternatively, if the cells combine to form some kind of composite view or > > > solution, then one could take the approach of using genes to represent the > > > individual cells and chromosomes to represent collections of cells, in > > which case fitness values would be assigned to collections of cells rather > > > than individual cells. > > > > But in all of these cases, there is a fitness value. The power of the > > genetic algorithm is that it does most of the work of finding a good > > solution for you with just the fitness values, but it does need those > > fitness values to work at all! > > > > I hope that will help provide some guidance on whether genetic algorithms > > will be useful to you and, if so, some ways that you could evaluate the > > fitness of your cells. > > > > Neil > > > > > > On Tue, 17 Jun 2003, Michelle Kam wrote: > > > > > Hi Neil, > > > > > > I'm using the genetic algorithms package with spreadsheet cells as > > mentioned > > > in the previous email. Attached is my class called JgapAPI.java. This > > program > > > is run by giving the cell numbers that will be selected to move on to > the > > next > > > generation. I had a few questions about implementation: > > > > > > 1. The for loop in main() is specifying which cells progress to the next > > > > generation. Should this be in my JgapAPI class or does it belong as the > > > fitness function? I also noticed that select() in NaturalSelector.java > > > essentially does the same thing which is selecting the cells that will > > > continue to the next generation. Would it be wrong if I put the > following > > for > > > loop in select() and then used the default fitness function? > > > for (int i = 0; i < length; i++) { > > > bestReps[i] = argv[i]; > > > } > > > > > > 2. Would it be possible to not implement the FitnessFunction class? It > > seems > > > like evaluate() in FitnessFunction.java needs to be implemented, but > > assuming > > > I use NaturalSelector and pre-specify what will be selected, can I get > by > > > without implementing evaluate()? > > > > > > 3. The genes in my Chromosome are of type IntegerGene. The main method > in > > > JgapAPI.java needs to take in a Chromosome as an argument but that means > I > > > > > have to create an instance of Chromosome before even entering the Jgap > > > package. Is this even possible or is there another way to do this? > > > > > > Thank you for your help, > > > Michelle Kam > > > > > > -----Original Message----- > > > From: Neil Rotstan [ne...@bl...] > > > Sent: Tuesday, June 17, 2003 5:32 PM > > > To: Kam, Michelle C > > > Cc: 'jga...@li...'; > > > 'jga...@li...' > > > Subject: Re: jgap fitness function > > > > > > > > > Hi Michelle, > > > > > > The fitness function is where you want to rate the desirability of the > > various > > > solutions, whether this desirability is computed via some algorithm or > > > determined through user input of some kind. The fitness value that is > > returned > > > should reflect the desirability of the solution. > > > > > > One key point about the genetic algorithm is that solutions are chosen > > > statistically based on their fitness values. This means that there's a > > chance > > > that even the best solution won't be chosen for the next generation and > > that > > > even the worst solution might be chosen (however slim the odds might > be). > > JGAP > > > does all of this work for you--you simply need to return fitness values > > from > > > your fitness function that indicate the desirability of particular > > solutions. > > > > > > At present, there is no special identifier or way to attach additional > > > meta-data to Chromosomes. Some work has been done on adding this, but > I'm > > not > > > sure of the present state of that work. > > > > > > I hope that helps! > > > > > > Neil > > > > > > > > > On Tue, 17 Jun 2003, Kam, Michelle C wrote: > > > > > > > Hello, > > > > > > > > I'm using the jgap package in a scenario in which a user is given a > set > > of > > > > spreadsheet cells with different visualizations of data and the user > > > selects > > > > which data representations from a set of 16 that he/she likes best. > > Those > > > > selected cells will live to the next generation when it evolves. > > > > > > > > Currently, I'm pre-specifying the cell # chosen for the next > generation > > at > > > > the command prompt as a simple case. For example, cell # 2 and 5. I > > would > > > > like to create a "for" loop that iterates through my set of > chromosomes > > > > (where each chromosome is set up as an array of IntegerGenes) and > checks > > > to > > > > see if the chromosome # is 2 or 5 and if it is, that chrom will be > added > > > to > > > > a "bestSoFar" array. I think this for loop should be in the fitness > > > function > > > > so that it can be called from evolve() but getFitnessValue returns an > > int. > > > > I'm not sure if the set up of an array holding the chrom's that will > > > > progress to the next generation belongs in getFitnessValue(). Is there > a > > > > more appropriate place where this "for" loop should be? The bestSoFar > > > array > > > > will be in a separate class I created so that the chromosomes in this > > > array > > > > will be used in the next generation. > > > > > > > > Also, is there a way to specify which chromosome it is within its > > > generation > > > > such as a chromosome ID #? I'm not sure if a field like this exists > > > already. > > > > > > > > Thank you! > > > > Michelle Kam > > > > > > > > Michelle Kam (408) 742-2881 > > > > Lockheed Martin Space Systems Co. SSM/ATC/MSIS > > > > B/153 O/L922 > > > > 1111 Lockheed Martin Way, Sunnyvale, CA 94089 > > > > > > > > > > > > > > > > > > > > > > > > > > > |