Python Genetic Algorithm

Max thelanguageofcities at gmail.com
Sun Jan 27 19:19:13 EST 2008


On Jan 27, 6:35 pm, Wildemar Wildenburger
<lasses_w... at klapptsowieso.net> wrote:
> Max wrote:
> > In GAs, you operate on a Population of solutions. Each Individual from
> > the Population is a potential solution to the problem you're
> > optimizing, and Individuals have what's called a chromosome - a
> > specification of what it contains. For example, common chromosomes are
> > bit strings, lists of ints/floats, permutations...etc. I'm stuck on
> > how to implement the different chromosomes. I have a Population class,
> > which is going to contain a list of Individuals. Each individual will
> > be of a certain chromosome. I envision the chromosomes as subclasses
> > of an abstract Individual class, perhaps all in the same module. I'm
> > just having trouble envisioning how this would be coded at the
> > population level. Presumably, when a population is created, a
> > parameter to its __init__ would be the chromosome type, but I don't
> > know how to take that in Python and use it to specify a certain class.
>
> I'm not sure I'm following you here. So a "chromosome" is bit of
> functionality, right? So basically it is a function. So my advice would
> be to write these functions and store it to the "indivuals"-list like so:
>
> class Population(object):
>      def __init__(self, *individuals):
>          self.individuals = list(individuals)
>
> Then you can say:
> p = Population(indiv1, indiv2, indiv3)
> for individual in p.individual:
>      individual(whatever_your_problem)
>
> (Don't know if this is the way GA's are supposed to work)
>
> You can also create callable classes (that is, classes that implement
> the __call__ method), and use instances of these as the individuals. For
> example you can create a Permutation class that returns a permutation
> (defined in it's __init__()) when it's __call__ method is called. (Am I
> making sense?)
>
> This is just generic advice, maybe this helps and maybe it doesn't at
> all. :)
>
> > I'm doing something similar with my crossover methods, by specifying
> > them as functions in a module called Crossover, importing that, and
> > defining
>
> > crossover_function = getattr(Crossover, "%s_crossover" % xover)
>
> > Where xover is a parameter defining the type of crossover to be used.
> > I'm hoping there's some similar trick to accomplish what I want to do
> > with chromosomes - or maybe I'm going about this completely the wrong
> > way, trying to get Python to do something it's not made for. Any help/
> > feedback would be wonderful.
>
> This isn't too bad, but for such things dictionaries are your Go-To
> datatype. Just have a dictionary of xover-functions handy and call the
> thusly:
>
> crossover_function = Crossover.function[xover]
>
> > Thanks,
> > Max Martin
>
> If that helps :)
>
> regards
> /W

This is definitely useful information, but I don't think I explained
chromosomes very well.

A chromosome is a choice of representation. So let's say your problem
is diagnosis, so a representation of a solution will be a list of
diagnoses (e.g. Disease1 = yes, Disease2 = no, Disease3 = yes, etc.).
Your chromosome choice could be a bitstring, in which the previous
solution would = 101, or it could be a list of floats to represent the
probability that you have Disease x, etc. So a chromosome is like a
choice of representation. In the case of humans, the chromosome is,
well, chromosomes.



More information about the Python-list mailing list