Ich habe den Code eben mal erweitert. Und zwar habe ich eine zufällige Ausgangsmatrix eingeführt, um auch anhand anderer Fälle zu testen:
PHP:
//statt $pl=..
$pl=array();
$mx = 11;
$my = 8;
$full = 20;
for ($x=0;$x<$mx;$x++) {
for ($y=0;$y<$my;$y++) {
$pl[$y][$x]=(rand(0,100)>$full)?1:0;
}
}
Dabei ist mir aufgefallen, dass die Zuordnung schlechter wird, je mehr freie Plätze es gibt. Das liegt offensichtlich daran, dass man mit den Plätzen in der Ausgangspopulation leben muss, da keine neuen hinzugefügt werden (im Code-Kommentar angesprochene Zuwanderung).
Problematisch ist sicherlich auch, dass bei der Ausgangspopulation in keiner Weise berücksichtigt wird, dass möglichst viele Plätze im genetischen Code auftauchen. Ist der Raum relativ leer, ist die Chance sehr groß, dass einige Plätze gar nicht erst berücksichtigt werden können. An diesen Punkten könnte man weiterarbeiten, um den Algorithmus zu verbessern.
Auch an der Bewertung könnte man noch verbessern, da dort nicht der ideale Wert einer Gruppe ermittelt wird, sondern die Distanz der Gruppe in der zufälligen Reihenfolge, wie sie im Gencode auftaucht berechnet wird.
Bei der Rekombination könnte man sich bemühen, dass man Pärchen nicht nur zufällig bildet, sondern auch Gruppen als mom und dad zusammenführt, die verhältnismäßig dicht beieinander sitzen.
Gruß hpvw
EDIT: Verdammt seit ihr schnell