Das Buch „Perfekter Algorithmus. Gierige Algorithmen und dynamische Programmierung »

BildHallo habrozhiteli! In dem neuen Buch spricht Tim Rafgarden ĂŒber gierige Algorithmen (das Planungsproblem, minimale SpannbĂ€ume, Clustering, Huffman-Codes) und dynamische Programmierung (das Rucksackproblem, Sequenzausrichtung, kĂŒrzeste Wege, optimale SuchbĂ€ume). In diesem Beitrag wird ein Auszug „Entwickeln eines gierigen Algorithmus“ vorgestellt.

Gierige Algorithmen scheinen fĂŒr die Aufgabe der Arbeitsplanung gut geeignet zu sein, um die gewichtete Summe der Fertigstellungszeiten zu minimieren. Die Ausgabe hat eine iterative Struktur, in der die Arbeit einzeln verarbeitet wird. Warum nicht einen gierigen Algorithmus verwenden, der iterativ entscheidet, welcher Job als nĂ€chstes kommt?

Der erste Schritt unseres Plans besteht darin, zwei SonderfĂ€lle des allgemeinen Problems zu lösen. Unsere Lösungen fĂŒr diese FĂ€lle werden zeigen, wie ein gieriger Algorithmus im allgemeinen Fall aussehen könnte. Dann beschrĂ€nken wir die DomĂ€ne auf einen Kandidatenalgorithmus und beweisen, dass es dieser Kandidat ist, der das Problem richtig löst. Der Prozess, durch den wir zu diesem Algorithmus kommen, ist fĂŒr das Erinnern wichtiger als der Algorithmus selbst; Dieser Vorgang ist wiederholbar und kann in Ihren eigenen Anwendungen verwendet werden.

13.3.1. Zwei SonderfÀlle


Nehmen wir an, dass es fĂŒr die Minimierung der gewichteten Summe der Fertigstellungstermine tatsĂ€chlich einen korrekten Greedy-Algorithmus gibt. Wie wĂŒrde es aussehen, wenn wir annehmen, dass alle Werke die gleiche LĂ€nge (aber möglicherweise unterschiedliche Gewichte) oder umgekehrt das gleiche Gewicht (aber möglicherweise unterschiedliche LĂ€ngen) haben?
13.2

(1) , ?
(2) , ?
) ;
) ;
) ;
) ;
( . 13.3.3.)

13.3.2.


Im Allgemeinen kann die Arbeit unterschiedliche Gewichte und LĂ€ngen haben. Wann immer unsere beiden Faustregeln - kĂŒrzere Arbeit bevorzugen und mit höheren Gewichten arbeiten - das GlĂŒck haben, dass ein paar Jobs zusammenfallen, wissen wir, welche wir zuerst planen mĂŒssen (kĂŒrzer mit höheren Gewichten). Was aber, wenn diese beiden Regeln widersprĂŒchliche RatschlĂ€ge geben? Was sollen wir mit einer kurzen Arbeit mit geringem Gewicht und einer langen Arbeit mit hohem Gewicht tun?

Was wird der einfachste gierige Algorithmus sein, der so funktioniert, wie er sollte? Jede Arbeit hat zwei Parameter, und der Algorithmus sollte beide betrachten. Die beste Option wÀre, eine Formel zu entwickeln, die die LÀnge und das Gewicht jeder Arbeit zu einer einzigen Note (Beitrag) zusammenfasst, sodass Planungsarbeiten von der höchsten zur niedrigsten Note garantiert werden, um die Anzahl der gewichteten Fertigstellungstermine zu minimieren. Wenn eine solche Formel existiert, folgt aus unseren beiden besonderen FÀllen, dass sie zwei Eigenschaften haben muss: (i) Wenn die LÀnge fest bleibt, sollte sie sich um das Gewicht der Arbeit erhöhen; (ii) Wenn das Gewicht fest bleibt, sollte es von der LÀnge der Arbeit abnehmen (denken Sie daran, dass je höher die Marke, desto besser). Verbringen Sie eine Minute mit dem Brainstorming mehrerer Formeln, die beide Eigenschaften haben.

Bild

Die vielleicht einfachste Funktion, die an Gewicht zunimmt und an LĂ€nge abnimmt, ist der Unterschied zwischen ihnen:
Vorschlag Nr. 1 fĂŒr die Note des Werkes. Bild

Die angegebene Note könnte negativ sein, dies stellt jedoch keine Hindernisse fĂŒr die konsequente Konstruktion von Werken von der höchsten bis zur niedrigsten Note dar . Es gibt jedoch viele andere Optionen. Zum Beispiel ist das VerhĂ€ltnis zweier Parameter ein weiterer Kandidat:

Vorschlag Nr. 2 zur Bewertung der Arbeit. Bild

Diese beiden Funktionen zur Berechnung der Bewertung fĂŒhren zu zwei verschiedenen gierigen Algorithmen.
GREEDYDIFF GREED DIFFERENCE

Planen Sie die Arbeit in absteigender Reihenfolge Bild
(willkĂŒrlich das Zusammentreffen von Werten brechen).
GREEDYRATIO

Bild
( ).

So veranschaulicht bereits unsere erste Fallstudie das erste Thema des gierigen Paradigmas (Abschnitt 13.1.2): Es ist normalerweise nicht schwierig, mehrere konkurrierende gierige Algorithmen fĂŒr eine Aufgabe vorzuschlagen. Aber welcher der beiden Algorithmen, falls vorhanden, ist richtig? Eine schnelle Möglichkeit, einen von ihnen auszuschließen, besteht darin, eine Instanz zu finden, in der zwei Algorithmen unterschiedliche ZeitplĂ€ne mit unterschiedlichen Werten der Zielfunktion anzeigen. FĂŒr jeden Algorithmus, dessen Ergebnisse in diesem Beispiel schlechter sind, können wir schließen, dass er nicht immer optimal ist. In zwei SonderfĂ€llen mit gleichem Gewicht oder gleicher LĂ€nge funktionieren beide Algorithmen korrekt. Das einfachste mögliche Beispiel fĂŒr den Ausschluss eines von ihnen kann ein Beispiel fĂŒr eine Aufgabe sein, bei der zwei Werke unterschiedliche Gewichte und LĂ€ngen haben.Infolgedessen planen beide Algorithmen, in entgegengesetzter Reihenfolge zu arbeiten. Das heißt, wir suchen nach zwei Werken, deren Reihenfolge im Unterschied das Gegenteil ihrer Reihenfolge in Bezug ist. Beispiel:

Bild

Die erste Arbeit hat ein grĂ¶ĂŸeres großes VerhĂ€ltnis, Bildaber einen grĂ¶ĂŸeren Unterschied (–2 vs. –1). Somit GreedyDiffplant der Algorithmus zuerst die zweite Arbeit, wĂ€hrend der Algorithmus GreedyRatiodas Gegenteil plant.
ÜBUNG 13.3

Was ist die Summe der gewichteten Fertigstellungstermine in den Listen von den abgeleiteten GreedyDiffund Algorithmen, die jeweils GreedyRatio?

a) 22 und 23
b) 23 und 22
c) 17 und 17
d) 17 und 11
(Eine Lösung und ErklÀrung finden Sie in Abschnitt 13.3.3.)

Wir haben uns weiterentwickelt, indem wir den Algorithmus GreedyDiffvon weiteren Überlegungen ausgeschlossen haben. Das Ergebnis von Übung 13.3 fĂŒhrt jedoch nicht direkt dazu, dass der Algorithmus GreedyRatioimmer optimal ist. Soweit wir wissen, gibt es andere FĂ€lle, in denen dieser Algorithmus einen nicht optimalen Zeitplan erzeugt. Sie sollten immer skeptisch gegenĂŒber einem Algorithmus sein, der nicht von einem Beweis seiner Richtigkeit begleitet wird, auch wenn dieser Algorithmus in mehreren TestfĂ€llen das Richtige tut und gierigen Algorithmen Ă€ußerst skeptisch gegenĂŒbersteht.

In unserem Fall wird der Algorithmus GreedyRatiotatsÀchlich garantiert, um die Anzahl der gewichteten Fertigstellungstermine zu minimieren.

Satz 13.1 (die Richtigkeit des Algorithmus GreedyRatio) . FĂŒr jeden Satz positiver ArbeitsgewichteBildBei positiven AuftragslĂ€ngen zeigt der BildAlgorithmus GreedyRatioeinen Zeitplan mit der kleinstmöglichen Summe der gewichteten Fertigstellungstermine an.

Diese logische Aussage ist nicht offensichtlich, und Sie sollten ihm nicht vertrauen, ohne Beweise zu erhalten. In Übereinstimmung mit dem dritten Thema des gierigen Paradigmas (Abschnitt 13.1.2) nimmt dieser Beweis den gesamten nĂ€chsten Abschnitt ein.
, . .

. — , ( ). — , , , . «» ( ) , .

Das verbleibende Thema des gierigen Paradigmas ist die Einfachheit der Laufzeitanalyse (Abschnitt 13.1.2). Hier ist es natĂŒrlich. Der GreedyRatio-Algorithmus sortiert die Jobs nur nach Beziehung, was O (n log n) Zeit benötigt, wobei n die Anzahl der Jobs in der Eingabe ist (siehe Fußnote 1 auf S. 24).

13.3.3. Übungslösungen 13.2–13.3


Die Lösung fĂŒr Übung 13.2 Die

richtige Antwort lautet: (a) . Nehmen wir zunĂ€chst an, dass alle n Jobs dieselbe LĂ€nge haben, z. B. 1. Dann hat jeder Zeitplan genau die gleichen Fristen - {1, 2, 3, ..., n} - und die einzige Frage ist, welche Art von Job erhalten wird Fertigstellungstermin und Frist. Unsere Semantik fĂŒr Arbeitsgewichte impliziert sicherlich, dass Arbeiten mit grĂ¶ĂŸerem Gewicht kĂŒrzere Abschlusszeiten erhalten sollten, und dies ist wahr. Zum Beispiel möchten Sie keine Arbeit mit einem Gewicht von 10 Dritteln (mit einer Frist von 3) und mit einem Gewicht von 20 FĂŒnftel (mit einer Frist von 5) planen. Sie sollten die Positionen dieser beiden Werke Ă€ndern, wodurch sich die Summe der gewichteten Fristen um 20 verringert (wie Sie selbst sehen können).

Der zweite Fall, in dem alle Werke das gleiche Gewicht haben, ist etwas dĂŒnner. Hier möchten Sie kĂŒrzere Arbeiten bevorzugen. Betrachten Sie beispielsweise zwei Jobs mit Einheitsgewicht und LĂ€ngen von 1 und 2. Wenn Sie zuerst eine kĂŒrzere Arbeit planen, betragen die Fertigstellungstermine 1 und 3 mit insgesamt 4. In umgekehrter Reihenfolge sind die Fristen 2 und 3 mit dem schlechtesten Ergebnis 5. Im Allgemeinen sind die geplanten Die erste Arbeit trĂ€gt zur Fertigstellungszeit aller Arbeiten bei, da alle Arbeiten auf die Fertigstellung der ersten warten mĂŒssen. Wenn alle Dinge gleich sind, minimiert die Planung der kĂŒrzesten Arbeit zuerst diese negativen Auswirkungen. Der zweite Job trĂ€gt zu allen Fertigstellungsterminen mit Ausnahme des ersten Jobs bei, daher sollte der zweitkĂŒrzeste Job als nĂ€chstes geplant werden und so weiter.

Lösung von Übung 13.3

Die richtige Antwort lautet: (b). Der Algorithmus GreedyDiffplant zuerst einen zweiten Job. Die Frist fĂŒr die Fertigstellung dieser Arbeit ist, BildwĂ€hrend die Frist fĂŒr die Fertigstellung einer anderen Arbeit die BildSumme der gewichteten Fristen fĂŒr die Fertigstellung ist

Bild

Der Algorithmus GreedyRatioplant die erste Arbeit zuerst, was zu Fristen Bild
und einer Summe der gewichteten Fristen von fĂŒhrt

Bild

Da der Algorithmus GreedyDiffden optimalen Zeitplan fĂŒr dieses Beispiel nicht berechnet, ist er nicht immer korrekt.

»Weitere Informationen zum Buch finden Sie auf der Website des Herausgebers.
» Inhalt
» Auszug

fĂŒr Khabrozhiteley 25% Rabatt auf den Gutschein - Algorithmen

Nach Zahlung der Papierversion des Buches wird ein elektronisches Buch per E-Mail verschickt.

All Articles