Print

Print


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/