A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 9 Ω


PHP Programme Sigmawelt

Biomathematik

Grundidee


Das vorliegende Programm simuliert gegeneinander konkurrierende Populationen von Zahlen. Untersucht wird, unter welchen Bedingungen „Fremdenhass“ einen evolutionären Vorteil bieten kann.

Das Programm als Quellcode in PHP



####################################################
### sigmawelt.php ##################################
####################################################

# Das Programm Sigmawelt simuliert eine Populuation von Individuen aus Zahlen.
# Begonnen am 26. März 2024
# Stand 1. April 2024
# Version 02
# Gunter Heim

# Das Programm ist in der Sprache PHP geschrieben.
# Es soll dabei in einer PHP-Shell laufen,
# einer ClI (Command-Line Interface),
# oder einem CGI (Commong gateway interface).
# Es werden keine Webseiten erzeugt.

####################################################
### Änderungen gegenüber der vorherigen Version ####
####################################################

# Gegenüber der Version 01 bietet die Version 02 die Möglichkeit, dass der angestrebte Zielwert der Standardabweichung nicht konstant die Zahl 4 ist, sondern selbst von einer zur nächsten Generation driften kann. Damit wird die evoluierende Population ständig dazu gezwungen, sich einem wechselnden Optimum anpassen zu müssen. Das wird über eine hier so genannte Optimumswanderung rechnerisch abgebildet.

####################################################
### Zweck des Programms ############################
####################################################

# Es gibt eine Population aus reellen Zahlen.
# Jede Zahl dieser Population ist ein Individuum.
# Die Individuen werden Gruppen zugewiesen.
# Die Gruppen konkurrieren gegeneinander.
# Die Standardabweichung einer Gruppe soll möglichst nah an die Zahl 4 kommen.
# Je näher die Standardabweichung an der 4 ist, desto erfolgreicher ist die Gruppe.
# Dabei wird die Gegenzahl der Standardabweichung als Maß der Fitness verwendet.
# Diese Zahl wird hier Fitness genannt. Sie ist hier immer negativ.
# Damit gilt auch mathematisch: die größere Zahl steht für die größere Fitness.
# Als Generation wird eine neue Bewertungsrunde bezeichnet.
# In jeder Generation können die einzelnen Zahlen mehr oder minder stark mutieren.
# In jeder Generation können die einzelnen Zahlen neu auf Gruppen verteilt werden.
# Es gibt zwei extreme Pole:
# a) der völkische Weg: die Individuen bleiben immer fest einer Gruppe zugeordnet.
# b) der kosmpolitische Weg: die Individuen werden in jeder Generation völlig zufällig auf die Gruppen verteilt.
# Es interessiert wo zwischen den zwei extremen Polen das Optimum für die Gesamtpopulation liegt.
# Das Optimum der Gesamtpopulation ist die durchschnittliche Fitness aller Gruppen.

####################################################
### Parameter zur Steuerung der Evolution ##########
####################################################

$anzahlgruppen=5;
$gruppengroesse=2;
$mutationsrate=1.0; # von 0 bis 1: wie groß die Wahrscheinlichkeit für eine Mutation ist
$mutationsweite=0.05; # von 0 bis 1: wie stark ein Indiviuum mutiert (wenn es mutiert)
$generationen=100; # die Anzahl der Generationen, die durchlaufen werden
$shufflerate=0.0; # von 0 bis 1, pro Individuum und pro Generationswechsel
$verdraengungsfaktor=1.0; # wie stark die besten die schlechtesten verdrängen
$startoptimum=4.0; # die Standardabweichung 4 ist das Default-Optimung
$optimumswanderung=0.0; # Bis zu welchem Betrag sich der Zielwert (das Optimum) pro Generation verändert

####################################################
### Initialisierung von Variablen ##################
####################################################

$populationsgroesse=$anzahlgruppen*$gruppengroesse;
$gesamtpopulation=array(); # alle Indiuviduen
$standardabweichungen=array(); # für jede einzelne Gruppe
$top=0; # Rang der besten Gruppe innerhalb aller Gruppen
$flop=0; # Rang der schlechtesten Gruppe innerhalb aller Gruppen
$topposition=0; # Position eines Individuums in der Top-Gruppe innerhalb der Gesamtpopulation
$flopposition=0; # Position eines Individuums in der Flop-Gruppe innerhalb der Gesamtpopulation
$generation=0; # die Nummer der aktuellen Generation
$optimum=$startoptimum;
$durchschnittlicher_zielabstand_pro_generation=0; # für Auswertungen
$durchschnittlicher_zielabstand_gesamtevolution=0; # für Auswertungen
$summe_zielabstaende_gesamtevolution=0; # nur für Rechenzwecke

####################################################
### Hauptprogramm ##################################
####################################################

# Genesis:
# Es wird eine Population aus zufälligen Zahlen gebildet.
# Diese Population wird in einer Feldvariablen gespeichert:
$gesamtpopulation=(initialisiereGesamtpopulation($populationsgroesse));

# Es beginnt die Evolution.
while ($generation <= $generationen) {

# Gruppenerfolg:
# Die Standardabweichung jeder Gruppe wird berechnet.
# Die Population ist in Gruppen aufgeteilt.
# Wie viele Gruppe es sind steht in: $anzahlgruppen
# Für jede Gruppe wird die Standardabweichung einzeln berechnet.
# Die Gruppen werden aus der Feldvariablen für die Gesamtpopulation herausgeschnitten.
$i=1;
while ($i <= $anzahlgruppen) {
$gruppenanfang=($i-1)*$gruppengroesse; # Pointer innerhalb des arrays
$wegmich=(array_slice($gesamtpopulation,$gruppenanfang,$gruppengroesse));
$standardabweichungen[$i-1]=berechneStandardabweichung($wegmich);
# Debug-Tipp: print_r($wegmich); # würde die Elemente jeder Gruppe anzeigen (Debug-Tipp)
$i=$i+1;
}
# Debug-Tipps: print_r($standardabweichungen);

# Statistik
$durchschnittlicher_zielabstand_aktuelle_generation=durchschnittlicher_zielabstand_aktuelle_generation($anzahlgruppen,$standardabweichungen,$optimum);
$summe_zielabstaende_gesamtevolution=$summe_zielabstaende_gesamtevolution+$durchschnittlicher_zielabstand_aktuelle_generation;
$durchschnittlicher_zielabstand_gesamtevolution=durchschnittlicher_zielabstand_gesamtevolution($generation,$durchschnittlicher_zielabstand_aktuelle_generation,$durchschnittlicher_zielabstand_gesamtevolution,$summe_zielabstaende_gesamtevolution);

# Bericht:
# Die Population und die Standardabweichungen aller Gruppen werden angezeigt.
generationBericht($durchschnittlicher_zielabstand_aktuelle_generation,$durchschnittlicher_zielabstand_gesamtevolution,$verdraengungsfaktor,$shufflerate,$mutationsrate,$mutationsweite,$optimumswanderung,$generationen,$generation,$anzahlgruppen,$gruppengroesse,$gesamtpopulation,$standardabweichungen,$optimum);


# Wer ist top, wer flop?
$top=(findeTop($standardabweichungen,$anzahlgruppen,$optimum));
$flop=(findeFlop($standardabweichungen,$anzahlgruppen,$optimum));

# Top killt Flop:
# Die Individuen der fittesten Gruppe ersetzen Individuen der schlechtesten Gruppe.
# In der Gesamtpopulation reichern sich Individuen aus der fittesten Gruppe an.
# Die Variable $verdraengungsfaktor gibt die Wahrscheinlichkeit dafür an.
$gesamtpopulation=topStattFlop($top,$flop,$gruppengroesse,$gesamtpopulation,$verdraengungsfaktor);
echo "\n";

# Alles mutiert:
# Jedes Individuum der Gesamtpopulation kann bei einem Generationswechsel mutieren.
# $mutationsrate gibt die Wahrscheinlichkeit dafür an.
#
$gesamtpopulation=(mutiereGesamtpopulation($gesamtpopulation,$mutationsrate,$mutationsweite,$populationsgroesse));

# Shuffeln
# Jetzt werden alle Individuen innerhalb der Gesamtpopulation zufällig gemischt.
# Damit fügen sich die Individuen auch zu neuen Gruppen zusammen.
# Damit ist der Übergang von einer zur nächsten Generation abgeschlossen.
$gesamtpopulation=shufflePopulation($gesamtpopulation,$populationsgroesse,$shufflerate);

# Wanderndes Optimum
$optimum=wandernOptimum($optimum,$optimumswanderung);

# Ende neuer Generation
$generation=$generation+1;
} # Ende der Evolution nach der letzten Generation

####################################################
### Funktionen #####################################
####################################################

### Generationsbericht #############################
function generationBericht($durchschnittlicher_zielabstand_aktuelle_generation,$durchschnittlicher_zielabstand_gesamtevolution,$verdraengungsfaktor,$shufflerate,$mutationsrate,$mutationsweite,$optimumswanderung,$generationen,$generation,$anzahlgruppen,$gruppengroesse,$gesamtpopulation,$standardabweichungen,$optimum) {
#
if ($generation==0) {
# Header für den Bericht, mit Werten, die über alle Generationen konstant bleiben.
echo "######################################\n";
echo "\n";
echo "SIGMAWELT","\n\n";
echo "Gruppengröße: ",$gruppengroesse,"\n";
echo "Anzahl Gruppen: ",$anzahlgruppen,"\n";
echo "Anzahl Generationen: ",$generationen,"\n";
echo "Mutationsrate: ",$mutationsrate*100," %\n";
echo "Mutationsweite: ",$mutationsweite,"\n";
echo "Shufflerate: ",$shufflerate*100," %\n";
echo "Verdrängungsfaktor: ",$verdraengungsfaktor*100," %\n";
echo "Optimumswanderung: ",$optimumswanderung,"\n";
echo "\n";
echo "######################################\n";
echo "\n";
} # Ende Header
#
$population_anzeigen="ja";
$standardabweichungen_anzeigen="ja"; # für jede einzelne Gruppe
$standardabweichung_anzeigen="ja"; # Durchschnitt aller Gruppen
$optimum_anzeigen="ja";
$durchschnittlicher_zielabstand_aktuelle_generation_anzeigen="ja"; # Abstand zum $optimum
$durchschnittlicher_zielabstand_gesamtevolution_anzeigen="ja"; # Abstand zum $optimum
#
echo "\n";
echo "Generation ",$generation,"\n";
#
if ($population_anzeigen=="ja") {
echo "Gesamtpopulation: ";
$counter=1;
foreach ($gesamtpopulation as $individuum) {
echo $individuum," ";
# Zwischen zwei Gruppen innerhalb der Population wird ein Leerzeichen eingefügt:
if (($counter/$gruppengroesse)==(floor($counter/$gruppengroesse))) {
echo " ";
} # ende if
$counter=$counter+1;
} # ende foreach
echo "\n";
} # ende if
#
if ($standardabweichungen_anzeigen=="ja") {
echo "Standardabweichungen: ";
foreach ($standardabweichungen as $standardabweichung) {
echo $standardabweichung," ";
} # ende foreach
echo "\n";
} # ende if
#
if ($standardabweichung_anzeigen=="ja") {
# Die durchschnittliche Standardabweichung aller Gruppen
$zwischensumme=0;
foreach ($standardabweichungen as $einzelabweichung) {
$zwischensumme=$zwischensumme+$einzelabweichung;
} # ende foreach
$standardabweichung=$zwischensumme/$anzahlgruppen;
echo "Durchschnittliche Standardabweichung: ",$standardabweichung,"\n";
} # ende if
#
if ($optimum_anzeigen=="ja") {
echo "Aktuelles Optimum: ",$optimum,"\n";
} # ende if
#
if ($durchschnittlicher_zielabstand_aktuelle_generation_anzeigen=="ja") {
echo "Zielabstand aktueller Generation: ",$durchschnittlicher_zielabstand_aktuelle_generation,"\n";
} # ende if

if ($durchschnittlicher_zielabstand_gesamtevolution_anzeigen=="ja") {
echo "Zielabstand über alle Generationen: ",$durchschnittlicher_zielabstand_gesamtevolution,"\n";
} # ende if

#
} # ende function

function durchschnittlicher_zielabstand_aktuelle_generation($anzahlgruppen,$standardabweichungen,$optimum) {
$zwischensumme=0;
foreach ($standardabweichungen as $einzelabweichung) {
$zwischensumme=$zwischensumme+$einzelabweichung;
} # ende foreach
$standardabweichung=$zwischensumme/$anzahlgruppen;
$durchschnittlicher_zielabstand_aktuelle_generation=abs($standardabweichung-$optimum);
return $durchschnittlicher_zielabstand_aktuelle_generation;
}

function durchschnittlicher_zielabstand_gesamtevolution($generation,$durchschnittlicher_zielabstand_aktuelle_generation,$durchschnittlicher_zielabstand_gesamtevolution,$summe_zielabstaende_gesamtevolution) {
# Es wird der durschnittliche Abstand der Standardabweichungen zum Optimum berechnet.
# Dieser Wert steht dafür, wie nah am Optimum sich die Gesamtpopulation über ihre gesamte Evolution hinweg gemittelt aufhählt.
if ($generation > 0) {
$durchschnittlicher_zielabstand_gesamtevolution=$summe_zielabstaende_gesamtevolution/($generation+1);
}
return $durchschnittlicher_zielabstand_gesamtevolution;
}

### Funktion Optimumswanderung #####################

function wandernOptimum ($optimum,$optimumswanderung) {
# Die übergebene Optimumswanderung darf maximal drei Nachkommastellen haben.
# Das bestehende Optimum wird um einen Betrag zwischen 0 und $optimumswanderung größer oder kleiner als in der vorherigen Generation.
# Wo genau der Betrag der Veränderung dann liegt, wird über einen Zufallsgenerator bestimmt.
$veraenderungsbetrag=random_int(-1*$optimumswanderung*1000,$optimumswanderung*1000)/1000;
$optimum=$optimum+$veraenderungsbetrag;
return $optimum;
}

### Funktion Shuffeln ##############################
function shufflePopulation($gesamtpopulation,$populationsgroesse,$shufflerate) {
# Jedes Individuum der Gesamtpopulation wird mit einem zufällig ausgewählten anderen Individuum oder sich selbst ausgetauscht.
# Die $shufflerate ist die Wahrscheinlichkeit dafür, dass ein Individiuum innerhalb einer Generation seinen Platz tauscht.
# $shufflerate=0 heißt völlig identitäre Gruppen, es gibt keinen Austausch von Individuen zwischen Gruppen.
# $shufflerate=1 heißt völlig kosmopolitische Gruppen. Die Gruppen setzen sich mit jeder Generation immer wieder völlig neu zusammen.

$i=0;
while ($i < $populationsgroesse) {
if (random_int(0,1000) < $shufflerate*1000) {
# Betrachtet wird ein Individuum der Herkunftsposition $i in der $gesamtpopulation.
# Es wird - je nach Shufflerate - mit einem Individuum auf $zielposition in der $gesamtpopulation ausgetauscht.
$zielposition=random_int(0,$populationsgroesse-1);
$wegmich=$gesamtpopulation[$zielposition];
$gesamtpopulation[$zielposition]=$gesamtpopulation[$i];
$gesamtpopulation[$i]=$wegmich;
} # ende if
$i=$i+1;
} # ende while
return $gesamtpopulation;
} # ende function

### Funktion Mutation ##############################
function mutiereGesamtpopulation($gesamtpopulation,$mutationsrate,$mutationsweite,$populationsgroesse) {
$i=0;
# Wenn die Mutationsweite zum Beispiel 0.5 (also ½) ist, dann kann kann eine Zahl um maximal 0,5 verringert oder um maximal 0,5 erhöht werden.
while ($i < $populationsgroesse) {
$mutation=(random_int(-1*$mutationsweite*1000000,$mutationsweite*1000000))/1000000;
$gesamtpopulation[$i]=$gesamtpopulation[$i]+$mutation;
$i=$i+1;
} # Ende Schleife
return $gesamtpopulation;
} # Ende Funktion

### Funktion Verdrängung ############################
function topStattFlop ($top,$flop,$gruppengroesse,$gesamtpopulation,$verdraengungsfaktor) {
# Individuen der besten Gruppe verdrängen Individuen der schlechtesten Gruppe.
# Ein Verdrängungsfaktor gibt an, wie stark der Effekt ist.
# Bei einen Faktor von 0 gibt es gar keine Verdrängung.
# Bei einem Faktor von 1 ersetzt jedes Individuum der besten Gruppe genau ein Individuum der schlechtesten Gruppe.
# Je größer der Mutationsfaktor, desto wahrscheinlicher ist eine konkrete Ersetzung.
# Es werden alle Individuen der besten Gruppe der Reihe nach betrachtet.
# Ja nach Verdrängungsfaktor ersetzen sie dann ein entsprechnendes Individuum der schlechtesten Gruppe.
#
$i=0; # Pointer
while ($i < $gruppengroesse) {
$topposition=$top*$gruppengroesse+$i;
$flopposition=$flop*$gruppengroesse+$i;
# Nun verdrängt ein Top-Individuum ein Flop-Individuum:
# Die Wahrscheinlichkeit dafür steht in der Variablen $verdraengungsfaktor.
# Der $verdraengungsfaktor ist eine Zahl zwischen 0 und 1.
# Liegt eine immer wieder neu erzeugte Zufallszahl $zufall unter $verdraengungsfaktor, erfolgt die Verdrängung. Ansonsten nicht.
$zufall=random_int(0,1000)/1000;
if ($zufall < $verdraengungsfaktor) {
# Debug-Tipp: echo $topposition," ",$flopposition,"\n";
# Wie hängt die Fitness eines Individuums mit der Fitness der Gruppe zusammen?
$gesamtpopulation[$flopposition]=$gesamtpopulation[$topposition];
} # Ende if
$i=$i+1;
} # Ende Schleife
return $gesamtpopulation;
} # Ende Funktion

### Funktion fitteste Gruppe finden #################
function findeTop($standardabweichungen,$anzahlgruppen,$optimum) {
# Die Standardabweichungen aller Gruppen liegen in der Feldvariablen $standardabweichungen.
# Gesucht ist die Position innerhalb dieser Feldvariablen mit der besten Gruppe (top).
$positiontop=0;
$positionflop=0;
$i=1; # Pointer
while ($i < $anzahlgruppen) {
# Top-Position finden:
if (-1*abs($standardabweichungen[$i]-$optimum) > -1*abs($standardabweichungen[$positiontop]-$optimum)) {
$positiontop=$i;
} # Ende von if
$i=$i+1;
} # Ende von while
return $positiontop;
} # Ende der Funktion

### Funktion schlechteste Gruppe finden ###########
function findeFlop($standardabweichungen,$anzahlgruppen,$optimum) {
# Die Standardabweichungen aller Gruppen liegen in der Feldvariablen $standardabweichungen.
# Gesucht ist die Position innerhalb dieser Feldvariablen mit der schlechtesen Gruppe (flop).
$positionflop=0;
$i=1; # Pointer
while ($i < $anzahlgruppen) {
# Flop-Position finden:
if (-1*abs($standardabweichungen[$i]-$optimum) < -1*abs($standardabweichungen[$positionflop]-$optimum)) {
$positionflop=$i;
} # Ende von if
$i=$i+1;
} # Ende von while
return $positionflop;
} # Ende der Funktion

### Funktion Startpopulation ##################
function initialisiereGesamtpopulation($populationsgroesse) {
$ergebnis=array();
$i=1;
while ( $i <= $populationsgroesse) {
$ergebnis[$i-1]=random_int(1,$populationsgroesse);
$i=$i+1;
}
return $ergebnis;
}

### Funktion Standardabweichung ################
function berechneStandardabweichung($zahlenliste) {
# Die Feldvariable $zahlenliste muss übergeben worden sein.
# Zuerst wird die Summe aller Werte in der Feldvariablen gebildet:
$summe=0;
foreach ($zahlenliste as $zahl) {
$summe=$summe+$zahl;
}
reset($zahlenliste);
# Nun wird der Durschnitt der Zahlen berechnet.
# Zuerst wird die Anzahl der Zahlen in der Feldvariablen bestimmt.
# count zählt die Elemente in einer Feldvariablen.
$anzahl=count($zahlenliste);
# Der Durchschnitt ist die Summe geteilt durch die Anzahl:
$durchschnitt=$summe/$anzahl;
# Nun wird die Standardabweichung berechnet.
# Zuerst berechnet man von der Zahlenliste das arithmetisches Mittel ↗
# Arithmetisches Mittel x-Strich meint dasselbe wie Durchschnitt ↗
# Für die Datenliste oben wäre das die 7.
# Dann von jeder Zahl (oft xi) den Abstand zum Mittelwert berechnen
# Das wären im Beispiel: 3 | 0 | 3
# Dann von allen Abständen das Quadrat bilden
# Das wären im Beispiel: 9 | 0 | 9
# Die Summe der Quadrate durch die Anzahl n der Werte teilen
# Das gäbe im Beispiel die Zahl 6.
# Dieses Zwischenergebnis nennt man auch Varianz ↗
# Daraus die Wurzel ziehen, gäbe etwa 2,45
# Das ist die Standardabweichung Sigma oder klein s.
$quadratsumme=0;
foreach ($zahlenliste as $zahl) {
$differenz=$zahl-$durchschnitt;
$differenzquadrat=$differenz*$differenz;
$quadratsumme=$quadratsumme+$differenzquadrat;
$varianz=$quadratsumme/$anzahl;
$standardabweichung=sqrt($varianz);
}
return $standardabweichung;
}

####################################################
### Beispiele für Sigmawelten ######################
####################################################

# Arges aus dem Bauwesen: Einzelunternehmen sind die Individuen, die Arbeitsgemeinschaften die Gruppen.
# Unternehmen: Einzelmenschen sind die Individuen, die Unternehmen die Gruppen.
# Organismen: Gene sind die Individuen, die Organismen die Gruppen
# Sportmannschaften: Einzspieler sind die Individuen, die Mannschaften die Gruppen.
# Projektteams: Einzelmenschen sind die Individuen, die Projektteams die Gruppen.
# Softwarekomponenten: die Komponenten sind die Individuen, ihre Gruppierung, etwa in Unternehmen oder größeren Softwarepaketen (z. B. Gnome in Linux) die Gruppen.
# Meme in Städten, Firmen, Ländern etc.
# Llamas mit Testdatensätzen oder Lernalgorithmen als Individuen

####################################################
### Quaestiones ####################################
####################################################

# Wie hängt die Fitness eines Individuums mit der Fitness der Gruppe zusammen?
# Welchen Einfluss auf den Evolutionserfolg hat es, ob die Mutationsweite absolut oder relativ zur Größe eines Individuums definiert ist?
# Zwei identische Individuum können je nach Zugehörigkeit zu verschiedenen Gruppen eine ganz unterschiedliche Bewertung bekommen. Das ähnelt unter anderem unterschiedlichen Gehältern für die selbe Tätigkeit. Welchen Einfluss hat das auf die Evolution der Populationsfitness. Wie könnte man den Effekt nennen? Schiefe Bewertung?
# Welchen Einfluss auf die Entwicklung der Populationsfitness hat es, ob die Individuen der erfolgreichsen Gruppe nur die Individuen der schlechtesten Gruppe verdrängen oder auch Individuen mittelguter Gruppen?
# Hängt die Stärke des Sigma-Effektes vom Grad der Arbeitsteilung innerhalb der Gruppen ab? Ein Erfolgsmaß ohne Arbeitsteilung wäre zum Beispiel der Durchschnitt aller Zahlen einer Gruppe. Gäbe es dort einen Sigma-Effekt?
# Welchen Einfluss hat die überproportionale Wichtung von Ausreißern (outliers) in der rechnerischen Definition der Standabweichung?
# Welchen Einfluss hat die Mutationsweite auf die Geschwindigkeit, wie schnell die Fitness der Gesamtpopulation wächst?
# Welchen Einfluss hat die Mutationsrate auf die Geschwindigkeit, wie schnell die Fitness der Gesamtpopulation wächst?
# Welchen Einfluss hat die Mutationsweite darauf wie nah nach dem Erreichen des Optimums die gesamte Population am Optimum ist?
# Welchen Einfluss hat die Mutationsrate darauf wie nah nach dem Erreichen des Optimums die gesamte Population am Optimum ist?
# Wie wirkt sich ein wanderndes, das heißt sich veränderndes Optimum auf die langfristig beste Strategie aus? Es ist zu vermuten, dass ein schnell wanderndes Optimum kosmopolitische Strategien bevorzugt.
# Kosmopolitismus bringt Variation innerhalb von Gruppen. Kann diese erhöhte Variation ohne Einbußen an genetischem Erfolg langfristig durch eine erhöhte Mutationsrate oder Mutationsweite ersetzt werden? Oder, wenn das nicht geht, ist der Grund dafür darin zu suchen, dass bei der kosmopolitischen Strategie die Gesamtpopulation Information über an sich geeignete Individuen enthält?

####################################################
### Ende des Programms #############################
####################################################

?>