viele verschachtelte for-schleifen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Hallo,
ich habe mal wieder eine Frage: Und zwar habe ich eine Klasse mit etlichen integer-werten, und ich möchte nun alle kombinationen dieser werte in bestimmten grenzen durchtesten, etwa so wie hier:

Code: Alles auswählen

test = []
for a_min in range(1,10):
    for a_max in range(1,25):
        for b_min in range(1,7):
            for b_max in range(1,20):
                for c_min in range(3,9):
                    for c_max in range(5,25):
                        for i in klasse.x.keys():
                            if klasse.a[i] > a_min and klasse.a[i] < a_max and \
                               klasse.b[i] > b_min and klasse.b[i] < b_max and \
                               klasse.c[i] > c_min and klasse.c[i] < c_min:
                                if klasse.d[i] == 1:
                                    z = z + 1
                        test.append(z)
Das dauert natürlich _super_lange, vor allem weil es in meinem Programm nicht um drei Variablen a, b und c (mit schleifen jeweils für min und max) geht, sondern um 9. Deshalb die Frage: Kann man sowas irgendwie beschleunigen, also eine grosse Menge von Kombinationen zu untersuchen?

[/code]
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi,
vlt. hift dir das hier?
BlackJack

Das dauert lange weil Du verdammt viele Kombinationen durchtestest. Alleine im Beispiel sind's 1723680. Das sind mehr als es sein müssten weil Du die Max-Werte nicht von den Min-Werten abhängig machst. Wenn `a_min` zum Beispiel 5 ist, dann macht es absolut keinen Sinn `a_max` auf 1 zu setzen. Damit ist an der Stelle schon eine Bedingung geschaffen die nicht erfüllt werden kann, es werden aber trotzdem Unmengen an Kombinationen mit diesen Belegungen von `a_min` und `a_max` getestet .

Die Bedingungen lassen sich etwas kompakter aufschreiben:

Code: Alles auswählen

# statt
if x > x_min and x < x_max: pass
# ->
if x_min < x < x_max: pass
Und zumindest in diesem Beispielquelltext würde ich das ``klasse.d == 1`` als erste Teilbedingung in das darübergelegene ``if`` verschieben. Das ist ein einfacher Test, der eventuell die ganzen Bereichsüberprüfungen überflüssig macht.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Ah, stimmt, das ist schon ne gute idee, die if-abfrage aufzuteilen und sich dann vielleicht einen ganzen bereich zu sparen... in meinem Programm ist es natürlich so dass 'max' 'min' nicht unterschreiten kann, das war jetzt nur ein kleiner fehler hier im Beispiel...

Danke schonmal! :)
Jo
Antworten