Print

Print


Thank you very much, Siggy. You were very clear in your explanation, and it
will work for sure if i move to setup(). I indeed iniialized in the
constructor, that’s the reason.

Best,
Marcio

On Mon, Jan 29, 2018 at 17:49 Eric 'Siggy' Scott <[log in to unmask]> wrote:

> Hi Márcio,
>
> Try moving the your assignment of the 'performances' variable inside your
> MyIndividual.setup() method.
>
> It's hard to know without seeing your code, but I suspect that every
> individual in your population is actually storing a reference to the *same
> instance* of 'Measures'.  This line is only called when the MyIndividual
> *constructor* is called:
>
> private Measures performances = new Measures();
>
>
> But when ECJ creates the initial population, it only uses the default
> constructor of your Individual *once, *to initialize a "prototype"
> instance of the Individual.  The population itself is created by *cloning* this
> prototype individual and then calling setup() on the clones.
>
> So, to initialize a new Measures object for each clone, you either need to
> do it in the setup() method, or override MyIndividual.clone() to perform a
> deep copy.  Using setup() is cleaner, though, since it follows ECJ's
> convention, and you don't actually care about copying the data.
>
> Thanks,
> Siggy
>
> On Mon, Jan 29, 2018 at 9:11 AM, Márcio Basgalupp <[log in to unmask]>
> wrote:
>
>> Hi all.
>>
>> When running NSGA-II, I'm having a problem when extending the
>> Individual class. I create a new class called Measures, when I have
>> some attributes of performance such as accuracy, fmeasure, etc. My
>> Individual class (called myIndividual.java) has an object fro this
>> Measures class (the attribute calls performances). It is a private
>> attribute, and to get this I need to use individual.getPerformances().
>>
>> public myIndividual () {
>>
>> private Measures performances = new Measures();
>>
>> ...
>>
>> }
>>
>>
>> At the end of the evolution, I get the paretoFront and it is very
>> weird because if I get, for example,
>> individual.getPerformance.getAccuracy(), the value is completely
>> wrong. Just to make sure, I added an attribute called accuracy
>> directly in myIndividual class, as below.
>>
>> public myIndividual () {
>>
>> private double accuracy;
>> private Measures performances = new Measures();
>> ...
>>    void testMethod() {
>>       accuracy = 0.8;
>>       performance.setAccuracy(0.8);
>>    }
>> ...
>> }
>>
>> I assign the same value to both (as in testMethod()), but when I print
>> it in my Main class (when I have the paretoFront), these values are
>> different. The value accuracy attribute is correct, but the one in
>> performances.getAccuracy() is completely wrong.
>>
>> Should I make some additional thing to fix it? I tried to make
>> Measures implements Serializable and Clonable, but it didn't work. It
>> is possible to add into myIndividual.java all attributes on
>> Measures.java, but I would not like to do it because it must have a
>> way to fix it correctly.
>>
>> Best,
>> Márcio
>>
>>
>> --------
>> Prof. Márcio Porto Basgalupp
>> Instituto de Ciência e Tecnologia (ICT)
>> Universidade Federal de São Paulo (UNIFESP)
>>
>
>
>
> --
>
> Ph.D student in Computer Science, George Mason University
> Web Director, Journal of Mason Graduate Research
> http://mason.gmu.edu/~escott8/
>
-- 
--------
Prof. Márcio Porto Basgalupp
Instituto de Ciência e Tecnologia (ICT)
Universidade Federal de São Paulo (UNIFESP)