Seite 1 von 1

viele verschachtelte for-schleifen

Verfasst: Sonntag 27. Mai 2007, 16:21
von jo_hb
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]

Verfasst: Sonntag 27. Mai 2007, 16:28
von schlangenbeschwörer
Hi,
vlt. hift dir das hier?

Verfasst: Sonntag 27. Mai 2007, 17:06
von 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.

Verfasst: Sonntag 27. Mai 2007, 17:19
von jo_hb
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