2017-06-13 6 views
1

Ich habe ein binäres Raster, das Texturpixel darstellt, die aktualisiert werden sollen. Die Kosten für das Hochladen dieser Pixel können grob in eine feste (ähnlich einem Header in einem Protokoll) und einen dynamischen Teil aufgeteilt werden, der durch die Upload-Größe bestimmt wird. Beide sind systemabhängig, können aber gemessen werden.Gruppierung in Rechtecke auf einem binären Raster

Dies bedeutet, dass die Kosten für jedes Rechteck anfallen, in dem die Fixkosten (der Transferaufwand) immer gleich sind.

Die Kostenfunktion selbst kann von System zu System variieren; In den meisten Fällen wird es am besten durch eine lineare Funktion wie eine Liniengleichung angenähert, z. cost_per_rectangle = fixed_costs + dynamic_costs rectangle_size, oder kurz c = f + s * d. Aber es kann gut sein, dass diese Funktion logarithmisch oder exponentiell wird, wie c = f + s * log (d) oder c = f + s * d^(1 + etwas).

Hier einige reale Welt Messungen sind, aufgetragen in einem linearen und ein y-log-Diagramm mit Größen von 2 bis 1 M, wobei X die Anzahl der Punkte und Y der Zeit in uns ist:

upload performance

Ich suche nach einem Algorithmus, der Rechtecke berechnen kann, die alle für die Aktualisierung markierten Zellen abdecken und dabei die Gesamtkosten minimieren.

Die Rechtecke können sich überlappen.

Weil die Kosten für die Berechnung dieser Rechtecke die Gesamtkosten ausmachen, suche ich nach einem effizienten, aber nicht perfekten Algorithmus, obwohl es sehr schön wäre, von der perfekten Lösung zu hören und ob sie NP-fähig ist oder nicht .

Im Moment habe ich keine Ahnung, wie ich das am besten angehen soll, nur ein vages Gefühl, dass vielleicht kd-Bäume helfen könnten.

Hier sind einige Bilder von möglichen Ergebnissen für ein Beispiel Raster: four corner extreme

diagonal

L or X

overlapping

ich mit dem diagonalen Beispiel einige Versuch und Irrtum-Tests haben und gefunden eine optimale Rechteckgröße für das Diagonalbeispiel durch Vergleichen der Upload-Zeiten für alle möglichen Größen.

+0

Dies ist derzeit sehr unklar - können Sie einige Beispiele hinzufügen, um all dies zu erklären? – Dukeling

+0

@Dukeling Ich habe ein paar Beispielbilder hinzugefügt. –

+0

Ich habe immer noch Schwierigkeiten, die Kosten zu verstehen. Sind die Fixkosten einmal (für das Raster) oder einmal für jedes Rechteck? Ist der dynamische Teil linear proportional zur Anzahl der gesendeten Zellen (über alle Rechtecke) (z. B. 2 Einheiten pro Zelle, so würde ein 2x2 2 \ * 4 = 8 Einheiten und ein 5x5 und ein 3x3 Rechteck 2 \ * (25 + 9) = 68 Einheiten) oder gibt es eine andere Skalierung? Suchen Sie nach einem Algorithmus, der darauf abzielt, die Gesamtkosten für bestimmte fixe und dynamische Kosten zu minimieren, oder haben Sie Kosten und suchen Sie nur nach einem Algorithmus für diese spezifischen Kosten? – Dukeling

Antwort

0

Angenommen, jemand hat viele Rechtecke über Ihr Bild gezeichnet, wobei Rechtecke in Rechtecke geschachtelt sind, aber keine zwei Rechtecke überlappen. Sie könnten die dynamische Programmierung für Bäume verwenden, um eine Teilmenge von Rechtecken zu bestimmen, die alle Zellen abdeckt, die für die Aktualisierung markiert sind. Stellen Sie sich die Verschachtelung als Baumstruktur vor. Arbeiten Sie von oben nach unten und berechnen Sie die minimalen Kosten für jeden Knoten, um alle Zellen abzudecken, die unter diesem Knoten für die Aktualisierung markiert sind: entweder die Summe der von den Kindern dieses Knotens berechneten Kosten oder die Kosten des zugeordneten einzelnen Rechtecks dieser Knoten - welcher auch immer der kleinste ist. (In der Tat können Sie dieses einzelne Rechteck verkleinern, wenn Zellen nicht in der Nähe ihrer Kanten aktualisiert werden müssen)

Wie erhält man eine gute Baumstruktur? Zwei kommen mir in den Sinn. Eine ist die Quad-Tree-Dekomposition, die rekursiv jedes große Rechteck in vier kleinere teilt und dann diese kleineren zerteilt und so weiter.Der andere wäre, einen minimalen Spannbaum der Zellen zu bilden, die aktualisiert werden müssen, wahrscheinlich unter Verwendung der Manhattan-Distanz, und diese Baumstruktur als Baum von Rechtecken zu verwenden, wobei jeder Knoten ein Rechteck gerade groß genug hat, um die Begrenzungsbox für seine Nachkommen zu sein .

Verwandte Themen