私は遺伝的アルゴリズムを使って、特定のフィットネス機能に最適な値を見つけるためのこの単純なプロジェクトを進めています。シーケンスの一般的な操作
class Individual[T](val underlying: T, val fitnessFunc: T => Double) {
lazy val fitness: Double = fitnessFunc(underlying)
def update(x: T): Individual[T] = new Individual[T](x, fitnessFunc)
}
class Population[T](individuals: Seq[Individual[T]]) {
def best: Individual[T] = individuals.tail.foldLeft(individuals.head)((b, a) => if(b.fitness > a.fitness) b else a) // not sure if this is the best way btw
}
trait GeneticAlgorithm[T] {
def select(p: Population[T]): Individual[T]
def crossover(i1: Individual[T], i2: Individual[T]): (Individual[T], Individual[T])
def mutate(i: Individual[T]): Individual[T]
def evolve(p: Population[T]): Population[T] {
...
}
}
私は特定のタイプT
のために特別にGeneticAlgorithm
の実装を作成することができますこの方法:一言で言えば、それは次のようになります。私は現在、選択、交叉、突然変異の戦略のいくつかの実装を作成しています。
しかし、私はT
がシーケンスであるときに問題に遭遇しています。私は、例えば、ある変異戦略を持っているしたいこのタイプ、特定のチャンスとばかりにランダムシャッフルについて:
object Mutation {
def shuffleVector(p: Double): Individual[Vector[_]] => Individual[Vector[_] = (i: Individual[Vector[_]) => {
if (math.random < p) i.update(scala.util.Random.shuffle(i.underlying)) else i
}
}
別にそれは、任意の配列のベクターに特異的ではないという事実から、それがコンパイルちょうど良い。私が実在型を使用した理由は、Vectorがどんな型であるか気にしないということです。
しかし私はそれを使いたいときに問題にぶつかります。私はエラーを取得する
val ga = new GeneticAlgorithm[Vector[Int]] {
...
override def mutate(i: Individual[Vector[Int]]): Individual[Vector[Int]] = Mutation.shuffleVector(0.5)(i)
...
}
:Expression of type Individual[Vector[_]] doesn't conform to expected type Individual[Vector[Int]]
をたとえば、私はint型のベクトルを最適化したい場合。
これ以外にも解決できること以外に、これを解決する適切な方法は何ですか?私はそれが覆い隠しで何かをしなければならないと思うが、まだ確かではない。 ... Scalaの方法を学ぶ... ;-)すべての
はい、実際には最も明白な解決策です。ありがとう。 – avanwieringen