Correct. runComplete is meant to indicate whether an evaluator believes it's time to quit because it discovered the ideal solution. It's not the right way to do this.
Sean
On Jul 29, 2014, at 10:15 PM, Eric Scott <[log in to unmask]> wrote:
> 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/
|