As described in the Manual, I set up a shell script to vary some of my
problem's parameters (elitism, tournament size, standard dev of Gaussian
noise, min and max gene), to see which parameter set would produce the best
evolution. Very cool!
Since I'll be running several hundred "trials", I set breedthreads and
evalthreads to try to optimize my run times. Unfortunately I'm seeing different
evolution behavior with multiple threads than with a single thread. I have five
subpopulations, all defined identically. When I run single-threaded, subpop 0
always* gets a better fit, sooner, than do the other subpops. Subpops 1-4
struggle to reach the fitness of subpop 0, but rarely reach it. They often (but
not always) show a declining fitness, i.e. 1 is better than 2 is better than 3,
but sometimes that curve evens out over time. If I run the same trials and
change the threading, no changes to the subpopulations whatsoever, all five
evolve evenly. Unless I'm misunderstanding something, this would seem to be
a bug... has anyone reported such behavior? Or is there some valid reason
why subpop 0 should get more "attention" or evolve (faster, better) in a
multithread run?
(*I say always because that's what I'm observing visually. I have not checked
EVERY output file, but I don't see any exceptions.)
On a related note, is the number of the subpopulation to which an individual
belongs, or the thread the evaluation is running in, available as a property or
variable visible to the fitness evaluation method? Is there any relationship
(affinity) between threads and subpops? I had set up some static variables in
my fitness method to help with reporting and overall monitoring of progress,
and when I run multithreaded these are getting corrupted and confused. What
does a "static" variable mean in a multithreaded run? If I can detect the
thread number (more likely) or subpop number (less likely), maybe I can
make my monitoring variables thread-safe. (I'm new to Java, so maybe there
is some flavor of static declaration I should be using to make them safe.)
|