私は遺伝的アルゴリズムライブラリを設計しており、現在Genome
クラスを構築しています。このクラスには、ゲノムの作成、突然変異、交差、および評価のためのいくつかのメソッドが含まれており、このライブラリの中心となります。この抽象クラスには、 と の 2 つのサブクラスがStaticGenome
ありVariableGenome
ます。これらのクラスは、固定長または可変長のゲノムに追加機能を提供します。
最終的に、任意の 2 つのゲノムの交差は、ゲノム タイプとは無関係である必要があります。そうは言っても、このメソッドは 2 つのゲノムを取り込み、2つの親ゲノムの特別な組み合わせであるsinglePointCrossover(Genome parent2)
新しいオブジェクトを返します。Genome
ただし、Genome
抽象クラスであるため、新しいGenome
オブジェクトを子孫としてインスタンス化することはできません。
スーパークラスから、サブクラスと同じ型の新しいオブジェクトを返すにはどうすればよいですか?
どんな援助でも大歓迎です。
Genome
クラス:
public abstract class Genome <ElementType> {
private String name;
private List<AbstractGenomeElement<ElementType> > elements;
// Mutation Methods //////////////////////////////////////////////
public AbstractGenomeElement<ElementType> mutateElement(AbstractGenomeElement<Integer> element) {
return this.mutateElementAtIndex(this.getElements().indexOf(element));
}
public AbstractGenomeElement<ElementType> mutateElementAtIndex(int i) {
return this.getElement(i).mutate();
}
// Crossover Methods //////////////////////////////////////////////
public Genome<ElementType> singlePointCrossover(Genome<ElementType> genome2){
return multiPointCrossover(genome2, 1);
}
public Genome<ElementType> twoPointCrossover(Genome<ElementType> genome2){
return multiPointCrossover(genome2, 2);
}
public Genome<ElementType> multiPointCrossover(Genome<ElementType> genome2, int crosses){
List<AbstractGenomeElement<ElementType>> newElements= new ArrayList<AbstractGenomeElement<ElementType>>();
Integer nums[] = new Integer[length-1];
for (int i = 0; i < length-1; i++) { nums[i] = i+1; }
List<Integer> shuffled = Arrays.asList(nums);
Collections.shuffle(shuffled);
shuffled = shuffled.subList(0, crosses);
boolean selectFromParentA = true;
for(int i = 0; i < length; i++){
if(shuffled.contains((Integer)i)){
selectFromParentA = !selectFromParentA;
}
if(selectFromParentA) newElements.add(this.getElement(i));
else newElements.add(genome2.getElement(i));
}
// Code fails at this point. "Can not instantiate the type Genome"
return new Genome<ElementType>(name, newElements);
}
}
2 つのサブクラス:
public class StaticGenome<ElementType> extends Genome<ElementType> {
}
public class VariableGenome<ElementType> extends Genome<ElementType> {
}
そして、私がテストに使用している主な方法:
public static void main(String [] args){
Genome<IntegerElement> genomeA = new StaticGenome<IntegerElement>("Genome A", 50);
Genome<IntegerElement> genomeB = new StaticGenome<IntegerElement>("Genome B", 50);
Genome<IntegerElement> offspring = genomeB.uniformCrossover(genomeA.elementCrossover(genomeA.multiPointCrossover(genomeB, 3)));
offspring.setName("Offspring");
System.out.println(offspring);
}