[jgap-users] RE: select()
Brought to you by:
klausikm
From: Kam, M. C <mic...@lm...> - 2003-06-19 16:31:17
|
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 > > > > > > > > |