Here is my parameter file:
parent.0 = ../moosuite/moosuite.params
eval.problem = ec.app.BusStopRelocationProblem.BusStopRelocationProblem
generations = 10000
quit-on-run-complete = true
pop.subpop.0.size = 50
pop.subpop.0.species = ec.vector.GeneVectorSpecies
pop.subpop.0.species.ind = ec.vector.GeneVectorIndividual
pop.subpop.0.species.gene = ec.app.BusStopRelocationProblem.BusProblemLine
pop.subpop.0.species.fitness.num-objectives = 2
pop.subpop.0.species.fitness.maximize = false
pop.subpop.0.species.genome-size = 7800
pop.subpop.0.species.crossover-type = one
pop.subpop.0.species.mutation-type = reset
pop.subpop.0.species.mutation-prob = 0.01
pop.subpop.0.species.pipe = ec.vector.breed.VectorMutationPipeline
pop.subpop.0.species.pipe.likelihood = 1.0
pop.subpop.0.species.pipe.source.0 = ec.vector.breed.VectorCrossoverPipeline
pop.subpop.0.species.pipe.source.0.likelihood = 0.75
pop.subpop.0.species.pipe.source.0.source.0 = ec.select.TournamentSelection
pop.subpop.0.species.pipe.source.0.source.1 = same
select.tournament.size = 2
seed.0 = time
Logging step by step state.population it seems to be null. However, this is
the code of my reset method (inside my BusProblemLine class with extends
from Gene):
setK(), getK() and addStop() are functions from the class and I believe is
nos important in the NPE.
public void reset(EvolutionState state, int thread) {
final GeneVectorSpecies species = (GeneVectorSpecies)
state.population.subpops[0].species;
DTMatrix[][] matrix = species.getMatrix();
Map<Integer, DTCoordinates> coordinates = species.getCoordinates();
Map<Integer, Integer> lines = species.getCorrelation();
for (Entry<Integer, Integer> entry : lines.entrySet()) {
int line = entry.getKey();
int posicion = entry.getValue();
this.line = line;
this.k = Parameters.getParameterInt("MaxQuantity");
Iterator<Integer> order = species.getorder().get(line).iterator();
while(order.hasNext()){
int aux = order.next();
if(matrix[posicion][aux] != null){
BusStop bps;
int down = 0;
int on = 0;
if (matrix[posicion][aux].getdown() > 0)
down = mt.nextInt(matrix[posicion][aux].getdown());
if (matrix[posicion][aux].geton() > 0)
on = mt.nextInt(matrix[posicion][aux].geton());
if(getK() >= (on - down)){
bps = new
BusStop(on,down,aux,coordinates.get(aux).getLatitud(),coordinates.get(aux).getLogitud(),0);
} else {
bps = new BusStop(getK() +
down,down,aux,coordinates.get(aux).getLatitud(),coordinates.get(aux).getLogitud(),0);
}
setK(getK() + bps.getdown());
setK(getK() - bps.geton());
addStop(bps);
}
}
}
}
Thanks a lot for your support.
2016-12-30 12:44 GMT-03:00 Eric 'Siggy' Scott <[log in to unmask]>:
> Hmm. That is odd, because, from what I can see, ECJ only calls the
> Gene.reset() method *via* the VectorSpecies class—so state.population.
> subpops[0].species should not be null at the time your method is called.
>
> If you share your parameter file and the code for your reset() method I
> can see if any obvious issue jumps out to me as the cause for the NPE.
>
> On Thu, Dec 29, 2016 at 4:08 PM, Enzo Fabbiani <[log in to unmask]>
> wrote:
>
>> Eric,
>>
>> I was able to get access to problem information by adding those sentence
>> in my code in the reset function (not setup), but I'm getting null pointer
>> exception when trying to retrieve the Species object.
>>
>> 2016-12-28 21:54 GMT-03:00 Eric 'Siggy' Scott <[log in to unmask]>:
>>
>>> Enzo,
>>>
>>> Were you able to solve your problem? Or could you still use assistance?
>>>
>>> The usual way to access information in another class when initializing
>>> an object in ECJ is to use the global EvolutionState object to walk through
>>> the program's state and find what you want.
>>>
>>> So, in the 'setup()' method of your BusProblemLine class, you would
>>> retrieve the Species object with something like this:
>>>
>>> final GeneVectorSpecies species = (GeneVectorSpecies)
>>> state.population.subpops[0].species;
>>>
>>>
>>> On Mon, Dec 19, 2016 at 9:11 AM, Enzo Fabbiani <[log in to unmask]>
>>> wrote:
>>>
>>>> Hi there, I'm facing some trouble when trying to initialize population.
>>>>
>>>> My custom class BusProblemLine (which extends from Gene) implements
>>>> reset function.
>>>>
>>>> In order to do that, some problem information is needed. This info is
>>>> read from files and loaded into atributes in the setup function in
>>>> GeneVectorSpecies and can be accessed from evaluate function in my problem
>>>> class.
>>>>
>>>> How can I access to this information in BusProblemLine to initialize
>>>> the population (as well as mutate and crossover).
>>>>
>>>> I've tried to read data in the reset function but it explodes for out
>>>> of memory. What is more, it gets initializing more times than the
>>>> population size, is this ok?
>>>>
>>>> Regards,
>>>> Enzo
>>>>
>>>
>>>
>>>
>>> --
>>>
>>> Ph.D student in Computer Science, George Mason University
>>> CFO and Web Director, Journal of Mason Graduate Research
>>> http://mason.gmu.edu/~escott8/
>>>
>>
>>
>
>
> --
>
> Ph.D student in Computer Science, George Mason University
> CFO and Web Director, Journal of Mason Graduate Research
> http://mason.gmu.edu/~escott8/
>
|