Print

Print


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/