Dev - C++ - methods get and set

 
Vista:
sin imagen de perfil

methods get and set

Publicado por psosmol (1 intervención) el 04/04/2019 19:25:11
Hola, tengo cuatro ficheros: AllOnesGA.cpp, GeneticAlgorithm.h, Population.h, Individual.h
Y no se por qué individual.getFitness() da -1y no 2que es el último valor que se le asigna con el método setFitness()

Gracias


En main...AllOnesGA.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
int main()
{
        GeneticAlgorithm ga(100);
	Population population = ga.initPopulation(50);
	ga.evalPopulation(population);
	ga.isTerminationConditionMet(population);
	...
 
 
Edit & Run
 
 
 GeneticAlgorithm.h
 
 
void evalPopulation(Population population)
	{
		double populationFitness = 0;
		for (Individual individual : population.getIndividual())
		{
		   individual.setFitness(2);
		}
	}
	bool isTerminationConditionMet(Population population)
	{
		for(Individual individual :population.getIndividual())
		{
cout<<individual.getFitness()<<endl; //this gives -1 and not 2
	        }
        }
 
 
 
and in Individual.h
 
 
class Individual{
public:
	Individual(vector<int> chromosome2)
	:chromosome(chromosome2),chromosomeLength(chromosome2.size())
	{}
	Individual(int chromosomeLength)
	:chromosomeLength(chromosomeLength)
	{
		for(int gene=0;gene<chromosomeLength;gene++)
		{
			chromosome.push_back(gene);
		}
	}
 
	int getChromosomeLength()
	{
		return chromosomeLength;
	}
	vector<int> getChromosome()
	{
		return chromosome;
	}
 
	int getGene(int offset)
	{
		return chromosome[offset];
	}
	void setFitness(double fitness)
	{
		this->fitness=fitness;
	}
	double getFitness()
	{
		return fitness;
	}
private:
	vector<int> chromosome;
	double fitness=-1.0;
	int chromosomeLength;
 
 
Population.h es:
 
	   ...
	vector <Individual> getIndividual()
	{
		return this->population;
	}
   ...
private:
	vector <Individual> population;


Pero no confundir population de AllOnesGA.cpp y el vector population de Population.h
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 560
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

methods get and set

Publicado por Rodrigo (134 intervenciones) el 05/04/2019 12:43:57
Tengo la impresion que cada vez que invocas getIndividual(), estas devolviendo una copia del vector y sus datos, por lo que la primera vez cuando modificas a 1 individuo, modificas una copia, no el dato al interior del vector, y cuando lo quieres imprimir, imprimes una copia nueva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 560
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

methods get and set

Publicado por Rodrigo (134 intervenciones) el 05/04/2019 13:02:11
2 cambios:

Retorna una referencia al vector

1
vector <Individual> getIndividual() {

se convierte en

1
vector <Individual>& getIndividual() {

y luego al iterar

1
for (Individual individual : population.getIndividual())
se converte en:

1
for (Individual& individual : population.getIndividual())

si tu intencion es modificar los datos. Si solo quieres mostrar lo que ya esta, el & no es necesario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Alfil
Val: 1.867
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

methods get and set

Publicado por Alfil (476 intervenciones) el 05/04/2019 12:54:53
En una clase las variables solo se pueden inicializar en el constructor de la clase, en la línea 74:

1
double fitness =- 1.0; // Error 

1
double fitness; // Correcto

y añade la inicialización de fitness al constructor

1
: fitness (-1.0)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 560
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

methods get and set

Publicado por Rodrigo (134 intervenciones) el 05/04/2019 12:59:08
La inicializacion de campos existe en C++11.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

methods get and set

Publicado por Tom (54 intervenciones) el 05/04/2019 14:43:29
Pon más trazas, o haz un debug. Puede que estés usando evalPopulation() desde más sitios.
Además, pásale a setFitness() un double, no un int, por si acaso.
Habría que ver qué haces en ga.initPopulation().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar