Bad idea. Technically, runComplete() is called right after evaluation in
SimpleEvaluator -- so it might work for you right now -- but it's a
predicate that isn't suppose to mutate state, and so it could in principle
be called by anyone at any time.
Siggy
On Tue, Jul 29, 2014 at 4:09 PM, Márcio Basgalupp <[log in to unmask]>
wrote:
> Thank you guys.
>
> What about the method runComplete?
>
> public boolean runComplete(final EvolutionState state)
> {
> for(int x = 0;x<state.population.subpops.length;x++)
> for(int
> y=0;y<state.population.subpops[x].individuals.length;y++)
> if (state.population.subpops[x].
> individuals[y].fitness.isIdealFitness())
> return true;
> // MY LOGIC HERE
> return false;
> }
> }
>
> Is this place another option? I didn't get very well the solution by
> inheriting from SimpleEvaluator. Could you please give more details?
> An example.
>
> Thank you,
> Marcio
> --------
> Prof. Dr. Márcio Porto Basgalupp
> Instituto de Ciência e Tecnologia (ICT)
> Universidade Federal de São Paulo (UNIFESP)
> Tel: +55 12 3309-9582
>
>
> On Tue, Jul 29, 2014 at 4:15 PM, Xiaomeng Ye <[log in to unmask]> wrote:
> > Adding on Eric. Part of the reasons, that this is done in a method
> > evaluatePopulation in some Evaluator class, is that it allows for better
> > customization, separation from the ECJ core, and like Eric said, you can
> use
> > multiple threads to run the evaluation.
> >
> > So instead of rewriting the whole Evolve class, you just need to
> customize a
> > Evaluator. You can multithread Evaluators easily. You can switch between
> > different Evaluators to evolve something (using different fitness
> function)
> > without changing anything else. Honestly a much better solution than the
> > "easy" way.
> >
> >
> > On Tue, Jul 29, 2014 at 2:56 PM, Eric 'Siggy' Scott <[log in to unmask]>
> wrote:
> >>
> >> You can find that behavior in SimpleEvaluator.evaluatePopulation(),
> which
> >> evaluates the population in parallel via a number of
> SimpleEvaluatorThreads
> >> that call SimpleEvaluator.evalPopChunk(). The actual "for loop" you are
> >> looking for is in evalPopChunk(), but it only runs on the portion of the
> >> population that belongs to its thread.
> >>
> >> It really is simpler to use inheritance and add on your functionality
> >> after all that logic gets executed.
> >>
> >> Siggy
> >>
> >>
> >> On Tue, Jul 29, 2014 at 2:29 PM, Márcio Basgalupp <[log in to unmask]>
> >> wrote:
> >>>
> >>> Thanks. But it's not clear for me. It should have an easier way, a
> >>> place (a loop already done) where I can just set the new fitness for
> >>> each individual. A loop where ECJ calls evaluate() method for each
> >>> individual, something like children[i].evaluate().
> >>> --------
> >>> Prof. Dr. Márcio Porto Basgalupp
> >>> Instituto de Ciência e Tecnologia (ICT)
> >>> Universidade Federal de São Paulo (UNIFESP)
> >>> Tel: +55 12 3309-9582
> >>>
> >>>
> >>> On Tue, Jul 29, 2014 at 2:48 PM, Eric 'Siggy' Scott <[log in to unmask]>
> >>> wrote:
> >>> > The loop proper is in EvolutionState.run().
> >>> >
> >>> > SimpleEvolutionState.evolve() contains the logic for a single
> iteration
> >>> > of
> >>> > the loop. In particular, it calls evaluator.evalutePopulation() once
> >>> > each
> >>> > generation. So you want to inherit from SimpleEvaluator and override
> >>> > evaluatePopulation(), adding your logic after the call to
> >>> > super.evaluatePopulation().
> >>> >
> >>> > Siggy
> >>> >
> >>> >
> >>> >
> >>> >
> >>> > On Tue, Jul 29, 2014 at 1:29 PM, Márcio Basgalupp <
> [log in to unmask]>
> >>> > wrote:
> >>> >>
> >>> >> Thanks, but there is no loop in the method evolve() of my
> >>> >> EvolutionState.java.
> >>> >>
> >>> >> public int evolve()
> >>> >>
> >>> >> throws InternalError, FileNotFoundException, IOException,
> >>> >> Exception { return R_NOTDONE; }
> >>> >>
> >>> >>
> >>> >> The same for SimpleEvolutionState.java
> >>> >>
> >>> >>
> >>> >> This loop (varying the children/individuals) is exactly what I'm
> >>> >> looking
> >>> >> for.
> >>> >>
> >>> >> Best,
> >>> >> Márcio
> >>> >>
> >>> >>
> >>> >>
> >>> >> --------
> >>> >> Prof. Dr. Márcio Porto Basgalupp
> >>> >> Instituto de Ciência e Tecnologia (ICT)
> >>> >> Universidade Federal de São Paulo (UNIFESP)
> >>> >> Tel: +55 12 3309-9582
> >>> >>
> >>> >>
> >>> >> On Tue, Jul 29, 2014 at 12:23 PM, Eric 'Siggy' Scott <
> [log in to unmask]>
> >>> >> wrote:
> >>> >> > The post-evaluation stage is only for running statistics.
> >>> >> >
> >>> >> > Look in the evolve() method of your EvolutionState -- that has the
> >>> >> > high-level loop. You'll probably want to customize your Evaluator
> >>> >> > to
> >>> >> > add a
> >>> >> > post-processing step, leaving the EvolutionState as is.
> >>> >> >
> >>> >> > Siggy
> >>> >> >
> >>> >> >
> >>> >> > On Tue, Jul 29, 2014 at 11:02 AM, Márcio Basgalupp
> >>> >> > <[log in to unmask]>
> >>> >> > wrote:
> >>> >> >>
> >>> >> >> Thank you Ye.
> >>> >> >>
> >>> >> >> That's true.
> >>> >> >>
> >>> >> >> But my question is: where (in the code) is this post-evaluation
> >>> >> >> stage?
> >>> >> >>
> >>> >> >> Best,
> >>> >> >> Márcio
> >>> >> >> --------
> >>> >> >> Prof. Dr. Márcio Porto Basgalupp
> >>> >> >> Instituto de Ciência e Tecnologia (ICT)
> >>> >> >> Universidade Federal de São Paulo (UNIFESP)
> >>> >> >> Tel: +55 12 3309-9582
> >>> >> >>
> >>> >> >>
> >>> >> >> On Tue, Jul 29, 2014 at 11:40 AM, Xiaomeng Ye
> >>> >> >> <[log in to unmask]>
> >>> >> >> wrote:
> >>> >> >> > It has been a while since I last used ECJ. I could be totally
> >>> >> >> > wrong.
> >>> >> >> >
> >>> >> >> > I remember there is a post-evaluation stage for each generation
> >>> >> >> > in
> >>> >> >> > the
> >>> >> >> > evolution. If I am going to divide all fitness values by the
> >>> >> >> > biggest
> >>> >> >> > one. I
> >>> >> >> > will do it in this post-evaluation stage.
> >>> >> >> >
> >>> >> >> > This post-evaluation stage is probably between the evaluation
> >>> >> >> > stage
> >>> >> >> > (where
> >>> >> >> > the fitness are calculated) and the breeding stage (where
> >>> >> >> > crossover/mutation
> >>> >> >> > happens).
> >>> >> >> >
> >>> >> >> >
> >>> >> >> > On Tue, Jul 29, 2014 at 10:18 AM, Márcio Basgalupp
> >>> >> >> > <[log in to unmask]>
> >>> >> >> > wrote:
> >>> >> >> >>
> >>> >> >> >> Dear all,
> >>> >> >> >>
> >>> >> >> >> I'm using ECJ for implementing a GP based-program. After
> >>> >> >> >> evaluating
> >>> >> >> >> (compute fitness) all individuals, I would like to "update"
> >>> >> >> >> these
> >>> >> >> >> fitness values (for example, divide all fitness values by the
> >>> >> >> >> biggest
> >>> >> >> >> one). However, I couldn't find where (which class) I have to
> do
> >>> >> >> >> that.
> >>> >> >> >> It should be where ECJ calls the method evaluate() for each
> >>> >> >> >> individual, then I could update before proceeding to the next
> >>> >> >> >> steps
> >>> >> >> >> (select, genetic operators, ...).
> >>> >> >> >>
> >>> >> >> >> I would appreciate if someone help me.
> >>> >> >> >>
> >>> >> >> >> Best,
> >>> >> >> >> Márcio
> >>> >> >> >>
> >>> >> >> >> --------
> >>> >> >> >> Prof. Dr. Márcio Porto Basgalupp
> >>> >> >> >> Instituto de Ciência e Tecnologia (ICT)
> >>> >> >> >> Universidade Federal de São Paulo (UNIFESP)
> >>> >> >> >> Tel: +55 12 3309-9582
> >>> >> >> >
> >>> >> >> >
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> >
> >>> >> > --
> >>> >> >
> >>> >> > Ph.D student in Computer Science
> >>> >> > George Mason University
> >>> >> > http://mason.gmu.edu/~escott8/
> >>> >
> >>> >
> >>> >
> >>> >
> >>> > --
> >>> >
> >>> > Ph.D student in Computer Science
> >>> > George Mason University
> >>> > http://mason.gmu.edu/~escott8/
> >>
> >>
> >>
> >>
> >> --
> >>
> >> Ph.D student in Computer Science
> >> George Mason University
> >> http://mason.gmu.edu/~escott8/
> >
> >
>
--
Ph.D student in Computer Science
George Mason University
http://mason.gmu.edu/~escott8/
|