2016-03-06 56 views
1

我正在開發線性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){ 
     } 
    } 
} 
} 

我的問題是,即使我明確實施了比較方法;編譯器仍然不高興,並說'必須聲明摘要或執行等等等等等等''

任何幫助?

+1

「Blah blah blah」在這裏沒有幫助。指定完整的錯誤語句。 – Mangesh

回答

2

您需要使您的Comparable通用接口能夠將染色體類型參數傳遞到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) { 

和將不需要鑄造。

作爲一個方面的建議,你不想擴展線程(特別是當我沒有看到你實現public void run()方法),因爲這將不必要地限制你的代碼。最好實現Runnable,並在需要時將其傳遞給Thread對象。

+0

如何將此類傳遞給Thread對象? – Olivier10178

+1

@ Olivier10178:你不能將一個類傳遞給線程。而是你將一個*對象*傳遞給一個線程。至於如何使用它們 - 當然要去源代碼[Thread tutorial](https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html)。它會告訴你一切。 –

+0

感謝氣墊船充滿了鰻魚。 – Olivier10178