in der Roademap weitergemacht

This commit is contained in:
Michael Stangl
2026-07-12 17:02:14 +02:00
parent dd84293c36
commit f880ae1c97
8 changed files with 752 additions and 74 deletions
+10
View File
@@ -30,6 +30,16 @@ class Person:
def __repr__(self):
return ' Person %s: "%s %s %s"' % ( self.Id, self._Titel,
self._Vorname, self._Name)
def __hash__(self):
# stabil ueber die (eindeutige, fortlaufende) Id hashen statt ueber
# die Objekt-Identitaet: sonst haengt die Iterations-/pop()-Reihenfolge
# der set() aus Person-Objekten (Gruppe._Personen) an der Speicher-
# adresse und variiert pro Prozesslauf - das machte selbst mit --seed
# den GA-Lauf nichtreproduzierbar. Integer-Ids sind zudem nicht von
# PYTHONHASHSEED betroffen, daher prozessstabil.
return hash( self.Id )
def __eq__(self, other):
return isinstance( other, Person ) and self.Id == other.Id
@total_ordering
class Gruppe:
+9
View File
@@ -659,6 +659,15 @@ class Farm:
print("+ speichern")
def Bester(self):
return max(self.Pool)
def TopN(self, N):
"""die N besten Loesungen, absteigend nach Wertigkeit sortiert.
Erweiterung von Bester() (das nur die einzelne beste liefert): gibt
eine Liste der bis zu N besten Loesungen zurueck, damit sich mehrere
gute Alternativen betrachten lassen. N wird auf [0, len(Pool)]
begrenzt; bei N >= Poolgroesse ist es der ganze Pool (sortiert)."""
N = max( 0, min( N, len(self.Pool) ) )
return sorted( self.Pool, reverse=True )[:N]
if __name__ == '__main__':
+15
View File
@@ -12,6 +12,7 @@ __license__ = "Python"
from ga import *
from Strukturdaten import *
import optparse
import random
if __name__ == '__main__':
@@ -50,8 +51,22 @@ if __name__ == '__main__':
parser.add_option( "--zyklus-art", dest="zyklusart", default="Adaptiv",
help="Name des GA-Profils in zyklus.cfg (Vorgabe: Adaptiv). "
"Weitere mitgelieferte Profile: Easy, Simple" )
parser.add_option( "--seed", dest="seed", type="int", default=None,
help="Zufalls-Startwert (int) fuer random.seed(), macht den Lauf "
"reproduzierbar. Ohne Angabe laeuft der GA nichtdeterministisch. "
"Fuer Support-Rueckfragen ('warum sitzt Tante Erna dort?') mit "
"demselben --seed exakt denselben Sitzplan erneut erzeugen" )
(options, args) = parser.parse_args()
# Determinismus auf Wunsch: den globalen Zufallsgenerator seeden, bevor
# irgendeine GA-Aktion laeuft. Der gesamte Algorithmus (ga.py und
# Strukturdaten.py nutzen 'from random import *') zieht aus demselben
# Modul-RNG, daher genuegt ein einziges random.seed() hier.
if options.seed is not None:
random.seed( options.seed )
print( "Determinismus: random.seed(%d) - Lauf ist reproduzierbar"
% options.seed )
if options.indir is None:
parser.error( "--indir ist erforderlich" )
InDir = os.path.expandvars( os.path.expanduser( options.indir ) )