[英]Can't get Comparable Interface Working
我正在开发线性Evol.Algrm。 我正在为我的基因组实现“可比”,以简化评估。 这是课程:
public class Chromosome extends Thread implements Comparable
{
private String[] chromosome;
private double fitness;
private Random chromoGen;
public Chromosome(double[] candidate)
{
super();
//encode candidate PER parameter; using Matrix as storage
chromosome = encode(candidate);
}
//De-fault
public Chromosome()
{
super();
}
public int compareTo(Chromosome c)
{
return (fitness - c.fitness);
}
/**
* Fitness stored in chromosome!
*/
public void setFitness()
{
fitness = FF.fitness(this);
}
public double getFitness()
{
return fitness;
}
/**
* ENCODERS/DECODERS
*/
public String[] encode(double[] solution)
{
//subtract 2^n from solution until you reach 2^-n
/**
* THE PRECISION IS [2^10 <-> 2^-8]!!!
*/
double parameter = 0.00;
String row = "";
String[] encoded = new String[6];
for (int j = 0; (j < 6); j++){
parameter = solution[j];
for (int i = 10; (i < (-8)); i--){
if ((parameter - Math.pow(2, i)) >= 0){
parameter = parameter - Math.pow(2, i);
row += "1";
}
else{
row += "0";
}
}
encoded[j] = row;
//refresh
row = "";
}
return encoded;
}
public String encode(double sol)
{
//subtract 2^n from solution until you reach 2^-n
/**
* THE PRECISION IS [2^10 <-> 2^-8]!!!
*/
String row = "";
for (int i = 10; (i < (-8)); i--){
if ((sol - Math.pow(2, i)) >= 0){
sol = sol - Math.pow(2, i);
row += "1";
}
else{
row += "0";
}
}
return row;
}
public double decoded(int number)
{
//returns UN-ENCODED solution
double decoded = 0.00;
String parameter = "";
parameter = chromosome[number];
for (int i = 10; (i < (-8)); i--){
if (parameter.substring(i, (i+1)).equals("1")){
decoded += Math.pow(2, i);
}
}
return decoded;
}
/**
* GETTERS
* ---------------\/--REDUNDANT!!
*/
public double getParameter(int parameter)
{
//decoded solution
return decoded(parameter);
}
/**
* Used in E-algrm.
*/
public String getRow(int row)
{
//encoded solution
return chromosome[row];
}
/**
* SETTERS
*/
public void setRow(String encoded, int row)
{
chromosome[row] = encoded;
}
public void setRow(double decoded, int row)
{
chromosome[row] = encode(decoded);
}
/**
* MUTATIONS IFF (mutate?)
*/
public void mutate(double mutationRate)
{
//range of: 0-17
int ran = 0;
char[] temp;
for (int m = 0; (m < 6); m++){
temp = String.toCharArray(chromosome[m]);
ran = chromoGen.nextDouble();
if (ran <= mutationRate){
}
}
}
}
我的问题是,即使我清楚地实现了比较方法; 编译器仍然不满意,并说“必须声明抽象或实现等等等等……”
有什么帮助吗?
您需要使Comparable为通用接口,以便能够将Chromosome类型参数传递到compareTo中。 这应该implement Comparable<Chromosome>
。 否则compareTo方法必须为Object类型。
因此,如果这是您的班级签名:
public class Foo implements Comparable {
然后compareTo方法签名必须是:
public int compareTo(Object o) {
而且您必须在方法内部进行一些转换。 另一方面,如果您的班级签名是
public class Foo implements Comparable<Foo> {
然后compareTo方法签名必须是:
public int compareTo(Foo o) {
并且不需要铸造。
作为附带建议,您不想扩展Thread(尤其是在我看不到您实现public void run()
方法的情况下),因为这将不必要地限制您的代码。 更好地实现Runnable,并在需要时将其传递给Thread对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.