Das Problem der Bestimmung, ob ein Programm für nahezu jede Definition von "Optimalitätsleistung" die "Optimalitätsleistung" A oder die "Optimalitätsleistung" B aufweist, ist im Allgemeinen nicht zu entscheiden (Beweis unten). Dies bedeutet, dass es keine einzige Methode gibt, die Ihnen immer sagen kann, wie optimal ein Algorithmus ist.
Es gibt jedoch Methoden, die häufig bei der Analyse von Approximationsalgorithmen angewendet werden. Oft werden Approximationsalgorithmen anhand ihrer Garantien dahingehend bewertet, wie weit ihre Lösung von der optimalen Lösung entfernt ist. Ich werde ein Beispiel für ein Problem und eine Annäherung geben, die ich mit der Methode der unteren Grenze beweisen werde, die eine sehr häufig verwendete Methode zum Nachweis von Verhältnissen ist.
Das fragliche Problem ist das Problem des „Ladens von Lastwagen“: Wir haben viele identische Lastwagen (so viele wie wir möchten), die jeweils eine Ladung mit einem Gewicht von höchstens T tragen können. Wir haben n Objekte, für die wir in diese Lastwagen laden möchten Transport. Jedes Objekt i hat ein Gewicht w_i, wobei w_i <= T ist (es gibt also keine Gegenstände, die nicht einmal alleine auf einen LKW passen). Gegenstände können nicht in Teile geteilt werden. Wir möchten LKWs auffüllen, damit wir so wenig LKWs wie möglich benötigen. Dieses Problem ist NP-vollständig.
Für dieses Problem gibt es einen sehr einfachen Approximationsalgorithmus. Wir laden einfach einen LKW mit Gegenständen, bis der LKW so voll ist, dass der nächste Artikel nicht mehr passt. Wir nehmen dann einen anderen LKW und beladen diesen LKW mit diesem Artikel, der nicht auf den vorherigen LKW passte. Wir laden keine Gegenstände mehr auf diesen LKW: Stattdessen nehmen wir einen neuen LKW, füllen ihn wieder mit vielen Artikeln, bis er nicht mehr passt, setzen den letzten Artikel wieder auf seinen eigenen LKW und so weiter.
Dieser Algorithmus ist eine sogenannte 2-Näherung für das Problem: Er verwendet höchstens doppelt so viele Lastwagen, wie die optimale Lösung benötigen würde. Das "höchstens" ist entscheidend: Wir haben vielleicht Glück und finden die optimale Lösung, aber zumindest werden wir es nicht schlecht machen.
Um dies zu beweisen, definieren wir zunächst eine Untergrenze für die optimale Anzahl der benötigten LKWs. Stellen Sie sich dazu vor, wir dürfen Gegenstände in Teile schneiden: Wir könnten dann problemlos jeden LKW bis auf den letzten vollständig füllen. Die Anzahl der LKWs, die wir benötigen würden, ist eine Untergrenze für die Anzahl der LKWs, die wir für die ursprüngliche Frage benötigen: Im "besten" Fall füllt die optimale Lösung jeden LKW immer vollständig aus. In diesem Fall ist die Anzahl der LKWs ist gleich, aber wenn die optimale Lösung LKWs unbesetzt lässt, kann es nur mehr LKWs benötigen.
Nun betrachten wir unseren Approximationsalgorithmus. Beachten Sie, dass wir in jedem Schritt (teilweise) zwei LKWs füllen. Beachten Sie auch, dass aufgrund der Funktionsweise des Algorithmus die Elemente im ersten LKW und das Element im zweiten LKW nicht zusammen in den ersten LKW passen, sodass ihre Summe mindestens T beträgt. Dies bedeutet, dass wir bei jedem Schritt mindestens eine volle Ladung laden LKW-Wert von Gegenständen auf zwei LKWs. Vergleichen Sie dies nun mit unserer Untergrenze: In diesem Fall laden wir einen vollen LKW mit Artikeln auf einen LKW. Mit anderen Worten, unser Approximationsalgorithmus berechnet (in linearer Zeit) eine Lösung, die unserer unteren "Lösung" sehr ähnlich sieht, jedoch zwei LKWs anstelle von einem verwendet. Daher verwenden wir höchstens doppelt so viele Lastwagen wie der optimale Algorithmus, da wir höchstens doppelt so viele Lastwagen verwenden wie unsere Untergrenze für den optimalen Algorithmus.
Dieser Algorithmus liefert eine Konstantfaktor-Näherung: Er ist höchstens zweimal so schlecht wie die optimale Lösung. Einige Beispiele für andere Maßnahmen: höchstens C mehr als die optimale Lösung (additiver Fehler, ziemlich selten), höchstens c log n-mal so schlecht wie die optimale Lösung, höchstens cn-mal so schlecht wie die optimale Lösung, höchstens c 2 ^ (dn) mal so schlecht wie die optimale Lösung (sehr schlecht; zum Beispiel lässt der allgemeine TSP nur Algorithmen mit dieser Art von Garantien zu).
Wenn Sie sicher sein möchten, dass der von Ihnen nachgewiesene Faktor der beste Faktor ist, den Sie nachweisen können, sollten Sie natürlich versuchen, Fälle zu finden, in denen die von Ihrem Algorithmus angegebene Lösung tatsächlich so schlecht ist, wie es nur sein kann.
Beachten Sie auch, dass wir manchmal Approximationsalgorithmen für Probleme verwenden, die nicht NP-hart sind.
Das habe ich (unter anderem) im Kurs für Approximationsalgorithmen an meiner Universität gelernt.
Unentscheidbarkeitsbeweis: Sei P ein Problem und A und B Approximationsalgorithmen für P, wobei A und B nicht die gleiche 'Optimalität' für eine sinnvolle Definition von 'Optimalität' haben und die Laufzeit von A und B beide Omega ist (1) (streng langsamer als die konstante Zeit, dh sie werden für größere Fälle langsamer) und wo A und B immer anhalten.
Sei D ein Programm, das behauptet, dass es Folgendes berechnen kann: Wenn ein Programm C eine Näherung für P berechnet, entscheiden Sie, ob es für ausreichend große Eingaben so gut wie A oder so gut wie B ist (Sie können dies daher verwenden, um Programme zu kategorisieren nach ihrer Optimalität).
Wir können dann D verwenden, um das Halteproblem zu lösen. Sei E ein Programm und F eine Eingabe für dieses Programm. Wir werden D verwenden, um zu entscheiden, ob E bei Eingabe F anhalten wird.
Wir entwerfen ein Programm G, das Folgendes ausführt: Wenn eine Eingabe S für Problem P gegeben ist, wird E auf F und A auf S parallel ausgeführt: Es führt E für eine Weile aus, dann A, dann E erneut und so weiter. Wenn E auf F anhält, hört es auf, A auszuführen, und führt stattdessen B auf S aus und gibt das Ergebnis von B zurück. Wenn A anhält, bevor E anhält, gibt es das Ergebnis von A zurück.
Die Verwendung von D auf G entscheidet nun, ob E auf F anhält: Wenn E auf F anhält, hält E für ausreichend große Eingänge S auf F an, bevor A auf S anhält (da die Zeit, die E zum Anhalten benötigt, nicht von der Größe von abhängt die Eingabe im Gegensatz zu A). D berichtet daher, dass G die Optimalitätseigenschaften von B hat. Wenn E nicht bei F anhält, meldet D, dass G die Optimalitätseigenschaften von A hat.