JSL-Hilfe: So erstellen Sie alle Permutationen eines Vektors oder einer ListeIch versuche herauszufinden, wie ich JSL am besten schreiben kann, um alle Permutationen eines Vektors oder einer Liste aufzuzählen.
Ein Algorithmus, den ich gefunden habe und der vielversprechend aussieht, ist Heap-Algorithmus https://en.wikipedia.org/wiki/Heap%27s_algorithm , aber ich kann einfach nicht herausfinden, wie ich das codieren soll.Kann mir hier jemand weiterhelfen?
Mir ist klar, dass je größer ein Vektor oder eine Liste ist, desto größer wird die Ausgabe faktoriell (die Anzahl der Permutationen von k Elementen beträgt k!). ), daher bin ich auch an einer Möglichkeit interessiert, jedes Element in der Liste der Permutationen zu generieren, eine Operation für diese Permutation durchzuführen und sie dann zu verwerfen, wenn sie nicht mehr zum Generieren der nächsten Permutation(en) benötigt wird.
Betreff: JSL-Hilfe: So erstellen Sie alle Permutationen eines Vektors oder einer ListeHier ist eine Funktion, die ich basierend auf Craiges Skript erstellt habe.
</CODE></PRE><PRE><CODE class="">Names Default To Here( 1 );
Clear Log();
permutate = Function( {list},
per = New Namespace();
per:swap = Function( {targetList, firstPosition, secondPosition}, //returns a list with elements in firstPosition and secondPosition swapped
{temp},
temp = targetList[firstPosition];
targetList[firstPosition] = targetList[secondPosition];
targetList[secondPosition] = temp;
Return( targetList );
);
per:generate = Function( {k},
{i, temp},
If( k == 1,
Insert Into( per:result, Eval List( List( per:A ) ) ), //else
per:generate( k - 1 );
// Generate permutations for kth swapped with each k-1 initial
For( i = 0, i < k - 1, i += 1,
// Swap choice dependent on parity of k (even or odd)
If( Mod( k, 2 ) == 0,
per:A = per:swap( per:A, k, i + 1 ), //else
per:A = per:swap( per:A, 1, k )
);
per:generate( k - 1 );
);
)
);
per:result = {};
per:A = list;
per:generate( N Items( per:A ) );
result = per:result;
Delete Namespaces( per );
Return( result );
);
A = {"a", "b", "c", "d"};
permutate( A );
Betreff: JSL-Hilfe: So erstellen Sie alle Permutationen eines Vektors oder einer ListeVielen Dank für den Code, ihr beide, er war hilfreich.Rekursion bereitet mir immer Kopfschmerzen, und es sieht so aus, als ob JSL es nicht einfach erlaubt, eine Rekursion auf eine Weise durchzuführen, die es ermöglicht, die Ausgabe der Folge von Permutationen einer Liste oder Matrix zuzuordnen.
Nachdem ich die Generatorfunktionen verwendet hatte, wurde mir klar, dass das, was ich tun wollte, zu viel Rechenzeit in Anspruch nehmen würde.
Hier liegt das Problem: Es gibt ein Maß für die Wirksamkeit von Impfstoffen, die eine sogenannte Krankheit möglicherweise nicht verhindern, sondern deren Schwere verringern geminderte Fraktion (MF).Es wird beschrieben Hier .Es basiert auf der Wilcoxson-Rank-Sum-Teststatistik (W) für den Vergleich zweier Gruppen.Was ich also tun wollte, war, alle möglichen Werte von W (unter Verwendung aller möglichen Rangpermutationen) für zwei Gruppen mit gegebenen Stichprobengrößen aufzulisten und daraus dann alle möglichen Werte von MF zu erhalten.Was ich wirklich zeigen wollte, war, dass die Kriterien, die wir für MF zum Nachweis der Wirksamkeit verwenden, einem kritischen Wert für die Verteilung von W unter der Nullhypothese entsprechen, dass die Verteilung für beide Gruppen gleich ist.
Ich habe mein Problem gelöst, indem ich für jede Gruppe eine zugrunde liegende Verteilung annahm und eine Simulationsstudie durchführte, um eine Verteilung von MF unter diesen Annahmen zu erhalten.(Außerdem ist W für größere Stichprobengrößen asymptotisch normal unter H0: (kein Unterschied in den Grundgesamtheiten), sodass dies auch eine andere Möglichkeit ist, einen Teil des Problems zu lösen.)Mithilfe der Simulation konnte ich jedoch auch die Aussagekraft unter verschiedenen alternativen Hypothesen untersuchen, was meine Analyse vollständiger machte.
Betreff: JSL-Hilfe: So erstellen Sie alle Permutationen eines Vektors oder einer ListeZweite Hälfte Ihrer Frage: Wie geht das? nicht Die gesamte Liste speichern?
Tolle Frage; Ich glaube, die einzige Antwort, die JMP bietet, besteht darin, Ihren Code von dort aus aufzurufen, wo die Lösung von JIM einen print() ausführt oder meine Lösung einen write() ausführt. Wenn JMP einen Generator oder Co-Routinen anbietet @XanGregg , könnten Sie eine flexiblere Lösung haben, bei der Ihr Code den Generator nach der nächsten Sequenz ab dem Punkt (oder den Punkten) fragen könnte, an dem Sie eine benötigen. Wenn Sie dies benötigen, ist es möglicherweise die beste Wahl, sie vorab in einer Tabelle aufzulisten.
Können Sie weitere Details zum Projekt mitteilen? Die Zeit, die man braucht, um sich alle 14 anzusehen! oder 15! Permutationen sind wahrscheinlich prohibitiv. Wenn Sie erwarten, eine ausreichend gute Antwort zu finden, bevor Sie alle Permutationen betrachten, ist die Verwendung zufälliger Permutationen, möglicherweise mit einem Annealing-Algorithmus, möglicherweise die bessere Wahl.
Betreff: JSL-Hilfe: So erstellen Sie alle Permutationen eines Vektors oder einer Liste// Heap's algorithm from https://en.wikipedia.org/wiki/Heap%27s_algorithm
// note: the above uses 0-based arrays, JMP uses 1-based. The above also
// must be using call-by-reference and JMP uses call-by-value. below uses
// a global array A rather than trying to find a way to pass the array by
// reference. For similar reasons, swap(x,y) is expanded in-line.
generate = Function( {k},
{i, temp},
If( k == 1,
Write( "\!n", A );//
, //else
// Generate permutations with kth unaltered
// Initially k == length(A)
generate( k - 1 );
// Generate permutations for kth swapped with each k-1 initial
For( i = 0, i < k - 1, i += 1,
// Swap choice dependent on parity of k (even or odd)
If( Mod( k, 2 ) == 0,
temp = A[i + 1];
A[i + 1] = A[k];
A[k] = temp;
, //else
temp = A[1];
A[1] = A[k];
A[k] = temp;
);
generate( k - 1 );
);
)
);
A = [1 2];
generate( N Cols( A ) );
A = {"a", "b", "c"};
generate( N Items( A ) );
A = 1 :: 4;
generate( N Cols( A ) );
[1 2]
[2 1]
{"a", "b", "c"}
{"b", "a", "c"}
{"Taxi"}
{"a", "c", "b"}
{"b", "c", "a"}
{"c", "b", "a"}
[1 2 3 4]
[2 1 3 4]
[3 1 2 4]
[1 3 2 4]
[2 3 1 4]
[3 2 1 4]
[4 2 1 3]
[2 4 1 3]
[1 4 2 3]
[4 1 2 3]
[2 1 4 3]
[1 2 4 3]
[1 3 4 2]
[3 1 4 2]
[4 1 3 2]
[1 4 3 2]
[3 4 1 2]
[4 3 1 2]
[4 3 2 1]
[3 4 2 1]
[2 4 3 1]
[4 2 3 1]
[3 2 4 1]
[2 3 4 1]
Vielen Dank, dass Sie mich dazu gebracht haben, die Wikipedia-Version noch einmal zu lesen! Beim letzten Mal habe ich gerade eine andere Variante gefunden, die einfacher zu konvertieren war.
Betreff: JSL-Hilfe: So erstellen Sie alle Permutationen eines Vektors oder einer ListeIch habe die nicht rekursive Form des Codes in JMP konvertiert.Sehen Sie, ob das hilft
generate = Function( {n, A},
//c is an encoding of the stack state. c[k] encodes the for-loop counter for when generate(k+1, A) is called
c = {};
For( i = 1, i <= n, i++, c[i] = 1 );
Print( A );
//i acts similarly to the stack pointer
i = 1;
While( i <= n,
If( c[i] < i,
If( Mod( i, 2 ) == 0,
//swap(A[0], A[i])
temp = A[1];
A[1] = A[i];
A[i] = temp;
,
//swap(A[c[i]], A[i])
temp = A[c[i]];
a[c[i]] = a[i];
a[i] = temp;
);
Print( A );
//Swap has occurred ending the for-loop. Simulate the increment of the for-loop counter
c[i] = c[i] + 1;
//Simulate recursive call reaching the base case by bringing the pointer to the base case analog in the array
i = 1;
,
//else
//Calling generate(i+1, A) has ended as the for-loop terminated. Reset the state and simulate popping the stack by incrementing the pointer.
c[i] = 1;
i = i + 1;
)
);
);