问题
I'm currently learning how to use genetic algorithms. However, I'm having difficulty with my method compareTo(). This method should compare the fitness values between two individuals. I've been trying to invoke my getFitness() method for it to be used in the compareTo() method, but I keep getting this error
Cannot invoke getFitness() on the array type int[]
I'm not sure where this error is coming from. Attached will be the mentioned methods and constructors, I will outline where this error occurs. Thank you.
public class Individual implements Comparable<Individual> {
Random rand=new Random(); //Initialize random object
private int size; //Represents N queens
private int[] individual; //Represents the array of possible solutions
public Individual(int[] permutation) {
individual=permutation;
size=individual.length;
}
public Individual(int size) {
this.size=size;
individual=Util.getPermutation(size); //Constructs an individual object that is an array of ints
}
public int getFitness() {
//How many queens are attacking each other on the diagonal
// 0 Represents the best fitness, this is the solution
//Number of possible differences in permutation is found through factorial addition
int newSize=0;
for (int i=0; i<=size; i++){
newSize+=i;
}
int fitness=0;
int [] xDifference=new int[newSize]; //Array that stores distance between Columns
int [] yDifference=new int[newSize]; //Array that stores distance between rows
//Calculates the distance between columns and stores them
for (int i=0; i<size; i++){
for (int j=i+1; j<size; j++)
xDifference[i]=j-i;
}
//Calculates distance between rows and stores them
for (int i=0;i<size;i++){
for (int j=i+1; j<size; j++)
yDifference[i]=Math.abs(individual[j]-individual[i]);
}
//Compares xDifference and yDifference elements, if they are equal that means Queens are attacking
for (int i=0; i<size; i++){
if (xDifference[i]==yDifference[i]){
fitness++;
}
}
return fitness;
}
public int compareTo(Individual other) {
int compare;
if (individual.getFitness()<other.getFitness()){ //ERROR OCCURS HERE
compare=-1;
}else if (individual.getFitness()>other.getFitness()){// ERROR HERE
compare=1;
}else {
compare=0;
}
return compare;
}
}
回答1:
The problem is that you are calling individual.getFitness(). individual is indeed an int[], not an Individual object. Instead, you'll want to use
if (this.getFitness()<other.getFitness()){
compare=-1;
}
You could also leave out this., but I personally find that it makes code easier to read.
回答2:
In your compareTo method you are accessing the field individual which is an array, not an Individual.
来源:https://stackoverflow.com/questions/28398843/cannot-invoke-my-method-on-the-array-type-int