Ich habe grundsätzlich ein Raster, sagen wir 100 x 100, das mit den URLs einer Fotosammlung gefüllt ist. Einige davon sind Duplikate, da ich vielleicht nur 50 Fotos habe, aber ich möchte sie duplizieren, um sicherzustellen, dass das 100 x 100-Raster gefüllt ist. Ich fülle das Raster zufällig mit den URLs und zeige sie dann an, was gut ist. Das Problem, das ich habe, ist, dass manchmal Fotos mit der gleichen URL zufällig zufällig entweder auf der X-Achse oder Y-Achse oder manchmal beides zusammen angeordnet sind.
Wie kann ich sicherstellen, dass ich das Raster so ausfülle, dass diese Bilder mit der gleichen URL so weit wie möglich auseinander liegen, sodass zwei der gleichen Fotos nicht nebeneinander erscheinen.
Jede Hilfe geschätzt
Mike
Wenn du wirklich "so weit wie möglich" willst, dann (1) wette ich, dass du kein Glück hast und (2) wenn das möglich wäre, würde es wahrscheinlich nicht sehr zufällige Ergebnisse ergeben. Aber wenn alles, was Sie wollen, "etwas weit auseinander" ist, ist es nicht so schlimm. Hier sind ein paar Dinge, die Sie tun können.
(1) Klassifizieren Sie Gitterpositionen entsprechend der Parität ihrer x, y-Koordinaten: das heißt, ob sie ungerade oder gerade sind. Teilen Sie die Fotos in vier gleich große Stapel auf. Wählen Sie nun aus verschiedenen Chargen entsprechend der Parität der Koordinaten. Der folgende Code (der ein bisschen zu "clever" ist; tut mir leid) macht das, modulo Bugs und Tippfehler.
%Vor%Nachteile: macht nichts, um Kopien eines Fotos weiter als einen Schritt voneinander zu entfernen. Reduziert die Zufälligkeit etwas, da alle Kopien eines gegebenen Fotos in einer festen Teilmenge von Positionen liegen; in manchen Kontexten kann dies sichtbar sein und ziemlich albern aussehen.
Variationen: Wir decken im Grunde das Raster mit 2x2 Kacheln ab und beschränken die Anzahl der Fotos, die in den einzelnen Kacheln vorkommen dürfen. Sie könnten größere oder anders geformte Kacheln verwenden oder sie anders anordnen. Zum Beispiel, wenn Sie k = ((x&1)<<1) ^ (y&3)
sagen, erhalten Sie 2x2 Kacheln, die in einem irgendwie-sechseckigen Muster angeordnet sind, was tatsächlich wahrscheinlich besser ist als die obige Version.
(2) Überstreichen Sie die Positionen in Ihrem Raster (die Raster-Reihenfolge reicht, obwohl es bessere Alternativen gibt) und wählen Sie für jedes ein Foto aus, das (a) nicht zu nahe an der gesuchten Position ist at und (b) ist ansonsten zufällig. Der folgende Code (wiederum Modulo-Bugs und Tippfehler) macht so etwas, obwohl Sie ihn für große Grids effizienter machen möchten.
%Vor%Hinweise: Das ist viel teurer als Option 1. Die Plausibilitätsprüfung von x1, y1 ist hier natürlich überflüssig. So ist die Wahl des Radius. Die offensichtlichen effizienteren Versionen von diesen können jedoch zusammenbrechen, wenn Sie einige der Variationen übernehmen, die ich auflisten werde. Dieser Code, so wie er ist, wird nichts tun, um Fotos auseinander zu halten, wenn es weniger als 9 gibt. Die Wahl des Radius ist eigentlich völlig falsch, für die Grid-Traversal-Reihenfolge, die ich verwendet habe, weil es nie mehr als 2r gibt ^ 2 + 2r "ausgeschlossen" Positionen; Auch das kann sich ändern, wenn Sie das Raster in einer anderen Reihenfolge durchlaufen. Etc.
Variationen: Es gibt keinen wirklichen Grund, warum die Region, nach der Sie suchen, quadratisch sein sollte. Circular könnte zum Beispiel besser sein. Sie könnten mit etwas zusätzlicher Arbeit eine Region konstruieren, die immer genau so viele Punkte enthält wie Fotos (obwohl Sie dabei ein meist periodisches Muster von Fotos erhalten, also sollten Sie etwas weniger aggressiv sein ). Es könnte besser sein, die Rastereinträge an einer anderen Position zu bearbeiten - z. B. von der Mitte aus zu spiralförmig zu verlaufen.
(3) Option 2 oben hält Fotos innerhalb eines bestimmten Bereichs (etwa so groß wie es möglich ist, wie viele verschiedene Fotos Sie haben) einzigartig, aber es ist nicht wichtig, Kopien weiter davon entfernt zu halten. Sie können stattdessen entscheiden, wie schlecht es ist, zwei identische Fotos in einer bestimmten Entfernung zu haben, und dann Fotos auswählen, um die gesamte Schlechtigkeit zu minimieren. Das wird sogar noch teurer als Option 2. Ich gebe keinen Mustercode; Sie können wahrscheinlich herausfinden, wie Sie es tun könnten.
[EDITED zum Hinzufügen ...]
(4) Hier ist eine süße Variation zum Thema (1). Es wird am besten funktionieren, wenn das Raster quadratisch ist und seine Größe eine Potenz von 2 ist, aber Sie können es anpassen, um allgemeiner zu arbeiten. Es dauert nur proportional zur Größe Ihres Rasters, wie viele Fotos Sie auch haben. Für jede Position (x, y): Werfen Sie alle bis auf die unteren k Bits der Koordinaten für einige k weg. Bit-reverse sie und verschachteln die Bits, so dass eine Zahl m von 0 bis 2 ^ (2k) -1. Wähle k, so dass dies irgendwo in der Größenordnung von, sagen wir, n_photos / 4 ist. Jetzt, an der Position (x, y), werden Sie die Foto-Nummer runden (n_fotos * m / 2 ^ (2k) + smallish_random_number). Es gibt ein paar Details, die ich für dich ausfüllen lasse: -).
Schnellster Weg ist so etwas:
Dieser Algorithmus funktioniert, wenn Sie genügend URLs haben, um weniger als 2 Festplatten in das Grid zu zeichnen.
Sie können es erfolgreich ändern, wenn Sie der Regel folgen, dass URLs aus einem Satz so groß wie möglich sein müssen.
Was Sie wollen, ist eine raumfüllende Kurve, zum Beispiel eine Hilbert-Kurve. Es füllt Ihr Gitter mit einer durchgehenden Linie, die jedes Quadrat um nur 1 Bit trennt. Da die Eigenschaft eines SFC darin besteht, den Raum rekursiv zu füllen und eine Nachbarschaft aufrechtzuerhalten, können Sie dies ausnutzen und das Bild entlang der Linie platzieren. Wenn Sie nicht das gleiche Bild in der direkten Nachbarschaft platzieren möchten, können Sie eine Tiefensuche auf dem SFC auf jedem Knoten verwenden, um Kopien zu vermeiden.
Warnung, Brainstorming:
Ich hätte eine Sammlung der verfügbaren URLs und ziehe sie zufällig aus. Sobald ich eine URL verwende, werde ich sie entweder aus der Sammlung entfernen oder sie als verwendet markieren. Ich würde aufhören, sobald ich die Sammlung erschöpft oder 100 getroffen habe.
Wenn ich die Sammlung erschöpft habe, bevor ich 100 erreicht habe, würde ich die letzten verwendeten X-URLs notieren und die Schleife erneut starten, um sicherzustellen, dass die nächste ausgewählte URL nicht zu den letzten X gehört.
Sorry für keinen Code, hoffentlich ist das hilfreich.