Thread Variation/Kombination aufteilen und verteilt kalkulieren
(15 answers)
Opened by styx-cc at 2018-07-18 02:03
Ich versuche es etwas anders mit einem Beispiel:
Nehmen wir die Reihe: a2 b3 c4 d3 oder 2 * 3 * 4 * 3 oder 1*2^1 * 1*3^1 * 1*4^1 * 1*3^1 An pos. a gibt es 2 Möglichkeiten, an pos. b 3 Möglichkeiten, usw. daraus ergeben sich insgesamt 72 Möglichkeiten. Wenn ich das korrekt verstanden habe sind das alle Variation mit Wiederholung in lexikographischer Ordnung (klein nach groß, wohlsortiert?), sicher bin ich nicht. Code: (dl
)
1 #!/usr/bin/perl -w styx@desktop:~$ perl permute_test.pl
1 1 1 1 1 1 1 2 1 1 1 3 1 1 2 1 1 1 2 2 1 1 2 3 1 1 3 1 1 1 3 2 1 1 3 3 1 1 4 1 1 1 4 2 1 1 4 3 1 2 1 1 1 2 1 2 1 2 1 3 1 2 2 1 1 2 2 2 1 2 2 3 1 2 3 1 1 2 3 2 1 2 3 3 1 2 4 1 1 2 4 2 1 2 4 3 1 3 1 1 1 3 1 2 1 3 1 3 1 3 2 1 1 3 2 2 1 3 2 3 1 3 3 1 1 3 3 2 1 3 3 3 1 3 4 1 1 3 4 2 1 3 4 3 2 1 1 1 2 1 1 2 2 1 1 3 2 1 2 1 2 1 2 2 2 1 2 3 2 1 3 1 2 1 3 2 2 1 3 3 2 1 4 1 2 1 4 2 2 1 4 3 2 2 1 1 2 2 1 2 2 2 1 3 2 2 2 1 2 2 2 2 2 2 2 3 2 2 3 1 2 2 3 2 2 2 3 3 2 2 4 1 2 2 4 2 2 2 4 3 2 3 1 1 2 3 1 2 2 3 1 3 2 3 2 1 2 3 2 2 2 3 2 3 2 3 3 1 2 3 3 2 2 3 3 3 2 3 4 1 2 3 4 2 2 3 4 3 72 Wie kann ich diese Aufgabe auf Beispielsweise 3 CPUs, ungeachtet der Reihenfolge, gleichmäßig verteilen? Mein Ansatz, ich teile die Anzahl der Kombinationen durch die Anzahl der CPUs, 72/3 = 24, jede CPU muss also 24 Kombinationen berechnen die folgende Tabelle teilt die Arbeit auf: Code: (dl
)
1 n=3 a2 b3 c4 d3 = 72 (72/n = anzahl pro n (24)) Daraus folgt, n1 oder CPU1 rechnet die Kombinationen von 1 1 1 1 bis 1 2 4 3: Code: (dl
)
1 #!/usr/bin/perl -w 1 1 1 1
1 1 1 2 1 1 1 3 1 1 2 1 1 1 2 2 1 1 2 3 1 1 3 1 1 1 3 2 1 1 3 3 1 1 4 1 1 1 4 2 1 1 4 3 1 2 1 1 1 2 1 2 1 2 1 3 1 2 2 1 1 2 2 2 1 2 2 3 1 2 3 1 1 2 3 2 1 2 3 3 1 2 4 1 1 2 4 2 1 2 4 3 24 n2 oder CPU2 von 1 3 1 1 bis 2 1 4 3: Code: (dl
)
1 #!/usr/bin/perl -w 1 3 1 1
1 3 1 2 1 3 1 3 1 3 2 1 1 3 2 2 1 3 2 3 1 3 3 1 1 3 3 2 1 3 3 3 1 3 4 1 1 3 4 2 1 3 4 3 2 1 1 1 2 1 1 2 2 1 1 3 2 1 2 1 2 1 2 2 2 1 2 3 2 1 3 1 2 1 3 2 2 1 3 3 2 1 4 1 2 1 4 2 2 1 4 3 24 Und n3 oder CPU3 von 2 2 1 1 bis 2 3 4 3: Code: (dl
)
1 for my $w (2..2) { 2 2 1 1
2 2 1 2 2 2 1 3 2 2 2 1 2 2 2 2 2 2 2 3 2 2 3 1 2 2 3 2 2 2 3 3 2 2 4 1 2 2 4 2 2 2 4 3 2 3 1 1 2 3 1 2 2 3 1 3 2 3 2 1 2 3 2 2 2 3 2 3 2 3 3 1 2 3 3 2 2 3 3 3 2 3 4 1 2 3 4 2 2 3 4 3 24 Im Prinzip brauche ich etwas wie: my @start_end_points = split_variations([2, 3, 4, 3], 3); # kombination, anzahl cpus Und split Variations gibt sowas wie [ [1111,1243], [1311, 2143], [2211, 2343] ] zurück. Nach meiner Methode oben müsst ich dafür durch alle Kombinationen durchgehen, um zu ermitteln wer welchen Teil abzuarbeiten hat. Das ist bei sehr großen Variation ungünstig, zumal jede CPU seinen Teil anschließend noch mal durchgeht und nach verschiedenen Bedingungen eine Kombination zulässt oder verwirft. Eine Idee die ich gerade habe ist, man könnte nur den Anteil der ersten CPU errechnen und weiß ja dann, da alle CPUs gleich viel zu tun haben sollen, in welchem Abstand die Kombination zu verteilen sind: n1 oder CPU1 von 1 1 1 1 bis 1 2 4 3 n2 oder CPU2 von 1 3 1 1 bis 2 1 4 3 n3 oder CPU3 von 2 2 1 1 bis 2 3 4 3 Da ist ja ein Muster zu erkennen, was sich seit n1 wiederholt, weil der Abstand gleich bleibt. Ich kann das nur weder in Perl noch in Mathe ausdrücken. Ich vermute es geht in die Richtung mod n und/ooder Faktorzerlegung. Vielen Dank fürs lesen. Edit: Last edited: 2018-07-18 21:16:28 +0200 (CEST) Pörl.
|