Hullaballoonatic
09/20/2018, 6:41 PMkarelpeeters
09/20/2018, 6:42 PMHullaballoonatic
09/20/2018, 6:43 PMHullaballoonatic
09/20/2018, 6:47 PMpackage agents
import agents.Settings.NUM_SELECTIONS
import java.util.Random
import java.util.concurrent.ThreadLocalRandom
class Population(private val maxSize: Int = 100) : ArrayList<Member>(maxSize) {
init {
repeat(maxSize) { this += Member() }
}
private
val randomMember
get() = this[rand.nextInt(size)]
val mostFit
get() = max()!!
fun selection(times: Int = NUM_SELECTIONS) =
repeat(times) {
randomMember.battle(randomMember).also { result ->
if (result.winnerLives) kill(result.loser) else kill(result.winner)
}
}
private
fun kill(member: Member) {
this -= member
}
private
fun Member.findMate() =
List(numCandidateMates) { randomMember }
.minBy { it.similarityTo(this) }!!
fun repopulate(type: MatingType = MatingType.Crossover, d: Double = 0.5) {
while (size < maxSize) {
val mother = randomMember
val father = mother.findMate()
this += Member { c ->
when (type) {
MatingType.Cloning -> mother[c]
MatingType.Crossover -> if (rand.nextBoolean()) mother[c] else father[c]
MatingType.Interpolation -> d * mother[c] + (1 - d) * father[c]
MatingType.Extrapolation -> d * mother[c] + (1 - d) * father[c]
}
}
}
}
fun mutation(catastrophic: Boolean = false) =
forEach {
if (catastrophic) it.mutate(300, 1.0) else it.mutate()
}
enum class MatingType {
Crossover, Cloning, Interpolation, Extrapolation;
}
companion object {
val rand: Random get() = ThreadLocalRandom.current()
}
}
karelpeeters
09/20/2018, 6:52 PMArrayList
for this, even delegating feels wrong.Hullaballoonatic
09/20/2018, 6:52 PMDominaezzz
09/20/2018, 6:53 PMHullaballoonatic
09/20/2018, 6:54 PMpopulation -= memberA
instead of population.members -= memberA
Hullaballoonatic
09/20/2018, 6:54 PMArrayList
?Dominaezzz
09/20/2018, 6:55 PMAbstractMutableList
.Dominaezzz
09/20/2018, 6:55 PMHullaballoonatic
09/20/2018, 6:55 PMkarelpeeters
09/20/2018, 6:56 PMHullaballoonatic
09/20/2018, 6:56 PMkarelpeeters
09/20/2018, 6:59 PMDominaezzz
09/20/2018, 6:59 PMArrayList<Member>
is quite specific.karelpeeters
09/20/2018, 7:04 PMMutableList<Member>
if possibleHullaballoonatic
09/20/2018, 7:05 PMkarelpeeters
09/20/2018, 7:05 PMMutableList
and List
compile to java.lang.List
.karelpeeters
09/20/2018, 7:06 PMmutableListOf()
in it's current implementation returns an ArrayList
though, but doesn't guarantee that.