<?php
class Population extends iPopulation
{
function __construct($size = 20, $length, $type, $cmp_function = null)
{
$this->size = $size;
$this->length = $length;
$this->type = $type;
$this->cmp_function = $cmp_function;
}
public function makePopulation()
{
$length = $this->length;
$type = $this->type;
for($i = 0; $i < $this->size; $i++)
{
$this->add(new Genome([ 'length' => $length, 'type' => $type ]));
$this->members[$i]->initialize();
}
$this->calcTotal();
}
public function add($genome)
{
$this->members[] = $genome;
}
public function sort()
{
usort($this->members, $this->cmp_function);
}
public function delete($index, $flag = true)
{
unset($this->members[$index]);
if( $flag )
array_values($this->members);
}
public function reset()
{
$this->totalFitness = 0;
}
public function calcTotal()
{
$sum = 0;
for($i = 0; $i < $this->size; $i++)
$sum += $this->members[$i]->fitness;
$this->totalFitness = floatval($sum);
}
public function totalFitness()
{
return $this->totalFitness;
}
public function best($num = 1)
{
$this->sort();
return array_slice($this->members, 0, $num);
}
public function worst($num = 0)
{
$this->sort();
return array_slice($this->members, $size - $num, $size);
}
public function clear()
{
$this->reset();
for($i = 0; $i < $this->size; $i++)
$this->delete($i);
$this->members = [];
}
}
|