Zufällige Auswahl mit Vorbehalt / Kriterien

598
Andrew Cooke

Ich habe ein 6 x 6 Gitter. Ich habe 36 Proben, die in drei gleiche Gruppen (A, B und C) aufgeteilt sind.

Ich möchte eine Formel, um die Samples in diesem Raster zufällig anzuordnen. Jede Zeile und jede Spalte muss jedoch zwei von jeder Gruppe enthalten. Dies manuell ein- oder zweimal durchzuführen ist einfach, aber es gibt eine riesige Anzahl von Kombinationen.

Ich bin offen in Bezug auf die Auswahl von Software, solange es auf Freeware oder Microsoft Office basiert.

Vielen Dank!

2
Willkommen bei SuperUser! Interessante Frage. Um zu klären, spielt es eine Rolle, ob sich die Mitglieder einer bestimmten Gruppe immer an derselben Stelle im Raster befinden? Ist dies eine akzeptable Lösung, wenn die erste Reihe immer "AABBCC" ist, auch wenn alle zwölf "A" -Proben durch diese ersten beiden Stellen getauscht werden können? hBy2Py vor 8 Jahren 0
Brian leider nicht. Stellen Sie sich vor, jede Gitterkoordinate wird als "Schlitz" betrachtet, und es gibt zwölf Schlitze für jede Abtastung und zwei von jeder Abtastung in jeder Zeile und Spalte. Es ist die Position dieser Slots, die ich willkürlich festlegen möchte (innerhalb meiner Einschränkung von 2 in jeder Zeile und Spalte). Stellen Sie sich das wie ein 6 x 6-Sudoku vor. Es gibt Millionen von Kombinationen, die funktionieren. Ich möchte im Wesentlichen eine Methode, die Zufallsprinzip verwendet, um eine dieser Millionen Kombinationen zu erstellen. Ein Gedanke war, ein Raster manuell zu erstellen, das funktioniert. Dann vertauschen Sie zufällig die Position ganzer Spalten, dann machen Sie dasselbe mit Zeilen - was würde funktionieren? Andrew Cooke vor 8 Jahren 0
, hatte Angst, dass Sie danach waren. Der zufällige Austausch könnte funktionieren - ich weiß nicht genug über Algorithmen und die Berechnungen dieser Art von Dingen, um zu wissen, ob dadurch Zugriff auf den gesamten Raum möglicher Konfigurationen geboten wird. Wenn Sie eine solche umfassende Leistung nicht sicherstellen müssen, funktioniert sie möglicherweise gut genug. Sie müssten es wahrscheinlich in VBA programmieren, da das Schreiben von Arbeitsblattformeln zur Behandlung von Zeilen- / Spalten-Swaps schwierig sein würde. Ich werde es aber kauen. hBy2Py vor 8 Jahren 0

2 Antworten auf die Frage

1
hBy2Py

Ich habe ein Werkzeug zusammengestellt, um zufällige Zeilen- / Spalten-Permutationen mit ein paar Formeln und etwas VBA zu erstellen. Das Blattlayout sieht folgendermaßen aus:

Excel-Ausschnitt

Das Referenzraster ist ein triviales Beispiel für eine gültige Matrix, wie in der vorläufigen Antwort von Garys Student (möglicherweise seit dem gestrichen). Die Zeilen- und Spaltenpermutationen enthalten alle möglichen eindeutigen Kombinationen von Permutationen für das 6x6-Gitter. (Dies kann leicht modifiziert werden, falls gewünscht, um nicht eindeutige Permutationen zu enthalten.) Die Werte in E12:E26und L12:L26werden zufällig entweder auf Null oder Eins gesetzt, um die Grundlage dafür zu schaffen, ob eine bestimmte Permutation durchgeführt werden soll oder nicht. Spalten Dund Kkonvertieren Sie diese einfach in boolesche Werte, um die Handhabung innerhalb der VBA zu vereinfachen (siehe unten). Das permutierte Gitter wird von der benutzerdefinierten Funktion generiert doSwap, die als Matrixformel eingegeben wird. Durch Drücken F9von wird die Neuberechnung des Blatts ausgelöstRAND Funktionen zum erneuten Generieren ihrer Zufallswerte, wodurch die Reihe der durchzuführenden Permutationen geändert wird.

Der VBA-Code, der dieses Verhalten ermöglicht, lautet:

Function doSwap(srcRg As Range, rowSwaps As Range, colSwaps As Range) As Variant Dim workVt As Variant Dim iter As Long  workVt = srcRg.Value  ' Do row swaps For iter = 1 To rowSwaps.Rows.Count With rowSwaps If .Cells(iter, 3).Value Then workVt = swapRow(workVt, .Cells(iter, 1), .Cells(iter, 2)) End If End With Next iter  ' Do col swaps For iter = 1 To colSwaps.Rows.Count With colSwaps If .Cells(iter, 3).Value Then workVt = swapCol(workVt, .Cells(iter, 1), .Cells(iter, 2)) End If End With Next iter  ' Store and return doSwap = workVt  End Function  Function swapCol(ByVal inArr As Variant, idx1 As Long, idx2 As Long) As Variant Dim tempVal As Variant, workVt As Variant Dim iter As Long  ' Check if Range or Array input If IsObject(inArr) Then If TypeOf inArr Is Range Then workVt = inArr.Value Else swapCol = "ERROR" Exit Function End If Else workVt = inArr End If  ' Just crash if not correct size ' Do swap For iter = LBound(workVt, 1) To UBound(workVt, 1) tempVal = workVt(iter, idx1) workVt(iter, idx1) = workVt(iter, idx2) workVt(iter, idx2) = tempVal Next iter  ' Return swapCol = workVt  End Function  Function swapRow(ByVal inArr As Variant, idx1 As Long, idx2 As Long) As Variant Dim tempVal As Variant, workVt As Variant Dim iter As Long  ' Check if Range or Array input If IsObject(inArr) Then If TypeOf inArr Is Range Then workVt = inArr.Value Else swapRow = "ERROR" Exit Function End If Else workVt = inArr End If  ' Just crash if not correct size ' Do swap For iter = LBound(workVt, 2) To UBound(workVt, 2) tempVal = workVt(idx1, iter) workVt(idx1, iter) = workVt(idx2, iter) workVt(idx2, iter) = tempVal Next iter  ' Return swapRow = workVt  End Function 

Der obige Code ist nicht gut robust, dient jedoch dem vorliegenden Zweck. Erweiterung / Verallgemeinerung sollte bei Bedarf recht unkompliziert sein. Insbesondere sollte es jede Größe eines 2-D-Referenzgitters, auch eines, das nicht quadratisch ist, handhaben. Der Schlüssel ist, sicherzustellen, dass die Arrays der Permutationsanweisungen ordnungsgemäß eingerichtet sind.

BEARBEITEN: Nachdem Sie ein wenig damit gespielt haben, ist es klar, dass diese Lösung keinen Zugriff auf den gesamten Raum möglicher Permutationen bietet. Also habe ich es mit einem zufälligen " Bit-Shift " geändert, um die Typenbezeichnungen untereinander auszutauschen. Um die Sache zu vereinfachen, habe ich von ABCLabels zu 123Labels gewechselt, was die Implementierung durch eine einfache MODOperation und eine schnelle Überprüfung der Sanitätsprüfung in Form von Zeilen- und Spaltensummen ermöglicht:

Excel-Ausschnitt

Guter Job, Brian! Es scheint sehr gut zu funktionieren! Gary's Student vor 8 Jahren 0
Beeindruckend. Von meinem ersten Blick auf das sieht es absolut ideal aus. Ich werde jetzt eine Stadt nehmen, um mich eingehender damit zu beschäftigen. Ich kann mich nicht genug für die Mühe bedanken! Andrew Cooke vor 8 Jahren 0
Sicher! Freue mich zu helfen. Wenn es für Sie gut funktioniert, ist der einzige Dank eine akzeptierte Antwort. :-) hBy2Py vor 8 Jahren 0
0
Gary's Student

Es gibt einen sehr einfachen Weg, dies zu erreichen. Weisen Sie jedem der drei Typen zuerst einen Slot zu:

enter image description here

Nehmen Sie dann die erste Probe, zum Beispiel SAMPLE_A_1, und platzieren Sie sie zufällig in einem der A-Slots. Verarbeiten Sie dann die verbleibenden 35 Proben weiter.


Wenn dieser Ansatz akzeptabel ist, poste ich ein kurzes Programm zum Füllen der Matrix. Wenn der Ansatz nicht akzeptabel ist, werde ich diesen Beitrag löschen.

Hallo - Entschuldigung, meine ursprüngliche Frage enthielt einige Unklarheiten. Alle Samples von A sind identisch mit denen von B und C. Das Problem liegt also an den "Slots" (wie Sie sie verwendet haben). Die Bildung der "Schlitze" muss zufällig sein, jedoch innerhalb der Einschränkung (2 von jeder Probe in jeder Reihe und Spalte). Eine Möglichkeit, die ich mir angesehen habe und die ich gerne um Feedback bitten wollte: Ich habe ein Raster erstellt, wie Sie es oben gezeigt haben. Diese Spalten und dann Zeilen habe ich dann zufällig angeordnet. Ich bin mir einfach nicht sicher, ob das zufällig ist oder würde diese Methode nicht jede Möglichkeit zulassen. Danke, dass Sie sich bei mir melden! Andrew Cooke vor 8 Jahren 0
@AndrewCooke .... Vielleicht können wir mit einer bekannten Vorlage beginnen und die Karten "mischen" ....... wenn wir von meiner Vorlage aus beginnen und einfach die Spalten ** A ** und ** B ** austauschen, wir am ende mit einer gültigen vorlage ..... tatsächlich können wir ALLE zwei zufällig ausgewählten spalten austauschen und haben eine gültige vorlage ............ das gleiche gilt für zeilen ... das kann sein eine Möglichkeit sein, Fälle zu generieren. Gary's Student vor 8 Jahren 0