Ich erstelle eine Funktion, um eine Liste von Baseballspielern durchzublättern, um jede mögliche Kombination von Aufstellungen zu erstellen.Ich denke, ich brauche Parallel.Für dieses Nest zu beschleunigen ... Aber wie?
Ich habe Listen von Spielern für jede Position. Ie, Pitcher, Catcher, 1st-Base usw. ...
Die Herausforderung besteht darin, dass es Milliarden von Kombinationen gibt, also ist es ein langsamer Prozess. Ich habe gelesen, dass ich System.Threading für parallele Schleifen verwende, aber ich habe keine Erfahrung damit, und die Beispiele, die ich finden kann, sehen viel einfacher aus (im Allgemeinen zeigen sie eine verschachtelte Schleife), und Ich habe Probleme zu verstehen, wie man es mit mehreren verschachtelten Schleifen anwendet.
An der innersten geschachtelten Schleife ist, wo ich zu sehen bin testen, ob die Aufstellung mit der Methode validateAndAddToTopLineups gültig ist, das die Aufstellung nimmt, um eine Liste der gültigen Aufstellungen durch Bezugnahme eingeschlossen, und 2 andere Parameter, die konstant Grenzen sind, dass werden verwendet, um zu bestimmen, ob die Aufstellungen gültig sind oder nicht.
Sollte ich diesen Prozess anders angehen, oder kann mir jemand helfen, dies zu übersetzen, um die Parallel.For-Methode zu verwenden?
Hier ist meine verschachtelte Schleife, unten:
for (int p = 0; p < _myPitchers.Count; p++) //For each pitcher
for (int c = 0; c < _myCatchers.Count; c++) //For each catcher
for (int b1 = 0; b1 < _myBase1.Count; b1++) //For each 1st base player
for (int b2 = 0; b2 < _myBase2.Count; b2++) //For each 2nd base player
for (int b3 = 0; b3 < _myBase3.Count; b3++) //For each 3rd base player
for (int ss = 0; ss < _myShortStops.Count; ss++) //For each shortstop
for (int oF = 0; oF < OutfielderCombos.Count; oF++) //For each outfielder lineup combination
{
Lineup testLineup = new Lineup(); //create new lineup
testLineup.Pitcher1 = _myPitchers[p]; //pitcher 1
//testLineup.Pitcher1 = _myPitchers[p2]; //pitcher 2
testLineup.Catcher = _myCatchers[c]; //catcher
testLineup.Base1 = _myBase1[b1]; //1st base
testLineup.Base2 = _myBase2[b2]; //2nd base
testLineup.Base3 = _myBase3[b3]; //3rd base
testLineup.Shortstop = _myShortStops[ss]; //short stop
testLineup.Outfield1 = OutfielderCombos[oF].Outfield1; //outfielder 1
testLineup.Outfield2 = OutfielderCombos[oF].Outfield2; //outfielder 2
testLineup.Outfield3 = OutfielderCombos[oF].Outfield3; //outfielder 3
//determine if lineup is valid, and if so add it to List<Lineup> _ValidLineups
validateAndAddToTopLineups(testLineup, ref _ValidLineups, ref SalaryCap, ref SameTeamLimit);
}
Sie haben RAM, um die Milliarden von Kombinationen zu speichern? Oder was macht 'validateAndAddToTopLineups' mit den Permutationen? Wenn Sie auf die Festplatte/Datenbank schreiben, ist das viel langsamer als Ihre Loops (es sei denn, ein winziger Bruchteil von Lineups ist tatsächlich gültig). –
Tust du das zufällig aus Fantasiegründen? –
Ihr maximaler Nutzen aus der Parallelität für eine CPU-gebundene Aufgabe wie Ihre Schleifen (abgesehen von dem, was 'validateAndAddToTopLineups' tut) ist an die Anzahl der CPU-Kerne gebunden, die Sie an das Problem werfen können. Sie könnten versuchen, Ihre äußere Schleife als Parallel.For zu schreiben und die inneren Schleifen als normale Schleifen zu verlassen. –