{"id":2449,"date":"2013-07-18T11:45:10","date_gmt":"2013-07-18T09:45:10","guid":{"rendered":"http:\/\/fernuni.digreb.net\/?p=2449"},"modified":"2025-11-25T23:04:48","modified_gmt":"2025-11-25T22:04:48","slug":"p-np-problem-und-das-problem-des-handlungsreisenden","status":"publish","type":"post","link":"https:\/\/fernuni.digreb.net\/?p=2449","title":{"rendered":"P-NP-Problem und das Problem des Handlungsreisenden"},"content":{"rendered":"<p>Bei dem \\(P-NP\\)-Problem geht es um die Frage wie die beiden Komplexit\u00e4tsklassen zueinander stehen. Das Skript fasst sich nur sehr kurz, was \u00a0dieses Thema angeht, so dass ich beschlossen habe es hier noch einmal im Detail aufzuarbeiten.<\/p>\n<p>Das \\(P-NP\\)-Problem geh\u00f6rt zu den <a href=\"http:\/\/de.wikipedia.org\/wiki\/Millennium-Probleme\">Millenium-Problemen<\/a>, d.h. es winken eine Million USD wenn es gel\u00f6st wird. Aber eine Million USD sind im Vergleich zu den Folgen, die z.B. \\(P=NP\\) (beide Komplexit\u00e4tsklassen sind gleich) ausl\u00f6sen w\u00fcrde keine Erw\u00e4hnung wert. Es w\u00e4re uns auf einen Schlag m\u00f6glich f\u00fcr jedes Problem in \\(NP\\) einen effizienten Algorithmus anzugeben.<\/p>\n<p>Als Beispiel nehmen wir das <a href=\"http:\/\/de.wikipedia.org\/wiki\/Faktorisierungsverfahren\">Faktorisierungsverfahren<\/a>, auf dem sehr viele kryptographische Algorithmen (u.a. <a href=\"http:\/\/de.wikipedia.org\/wiki\/RSA-Kryptosystem\">RSA<\/a>\u00a0oder das Verfahren von <a href=\"https:\/\/de.wikipedia.org\/wiki\/Diffie-Hellman-Schl%C3%BCsselaustausch\">Diffie-Hellmann<\/a> zum Schl\u00fcsselaustausch) basieren. Diese Algorithmen gehen davon aus, dass das Faktorisierungsproblem nicht effizient zu l\u00f6sen ist. Es w\u00e4re das blanke Chaos, w\u00fcrde sich herausstellen, dass \\(P=NP\\). \\(P\\neq NP\\) w\u00e4re hingegen nicht so schlimm.<\/p>\n<p>Machen wir uns einmal klar, was \\(P\\) und \\(NP\\) denn nun wirklich sind. Dazu betrachten wir zun\u00e4chst eine etwas gr\u00f6\u00dfere Klasse.<\/p>\n<p><strong>Klassifizierung<\/strong> \\(EXPTIME\\)<\/p>\n<p style=\"padding-left: 30px;\">In \\(EXPTIME\\) liegen Probleme, die auf einer deterministischen Turingmaschine in \\(O(2^n)\\), d.h. in exponentieller Zeit, entschieden werden k\u00f6nnen. Hier ist \\(n\\) die Eingabel\u00e4nge.<\/p>\n<p style=\"padding-left: 30px;\">Es ist nicht schwer zu sehen, dass man hier nur f\u00fcr sehr kleine Probleminstanzen effizient nach einer L\u00f6sung suchen kann. F\u00fcr gr\u00f6\u00dfere Eingabel\u00e4ngen \\(n\\) wird die Suche ungleich schwerer.<\/p>\n<p style=\"padding-left: 30px;\">Was w\u00e4re so ein Problem, dass deterministisch in exponentieller Zeit l\u00f6sbar w\u00e4re? Na klar, das <a href=\"http:\/\/de.wikipedia.org\/wiki\/Problem_des_Handlungsreisenden\">Problem des Handlungsreisenden<\/a> (auch TSP, travelling salesman, genannt). Der folgende Abschnitt basiert mehrheitlich auf dem Artikel aus der Wikipedia.<\/p>\n<p style=\"padding-left: 30px;\"><strong>Beispiel\u00a0TSP<\/strong><\/p>\n<p style=\"padding-left: 60px;\">Das TSP geh\u00f6rt zur der Klasse der Optimierungsprobleme. Bei diesem Problem geht es darum f\u00fcr eine gegebene Anzahl St\u00e4dte und einer Entfernung zwischen diesen den k\u00fcrzesten Weg f\u00fcr einen Rundkurs zu finden.<\/p>\n<p style=\"padding-left: 60px;\">Diese Problem hat eine Vielzahl an Anwendungsm\u00f6glichkeiten (Logistik, Design von Mikrochips, etc.), so dass eine optimale L\u00f6sung durchaus w\u00fcnschenswert erscheint.<\/p>\n<p style=\"padding-left: 60px;\">Leider haben wir hier, in Abh\u00e4ngigkeit der Anzahl der zu besuchenden Punkte, nur dann eine optimale L\u00f6sung wenn wir jeden Punkt pr\u00fcfen. Das Wachstum ist also exponentiell und zweifellos geh\u00f6rt TSP zur Klasse \\(EXPTIME\\), zumindest bei seinem deterministischen L\u00f6sungsansatz.<\/p>\n<p style=\"padding-left: 60px;\">Auch wenn mittlerweile f\u00fcr mehrere Tausend Punkte optimale L\u00f6sungen durch heuristische und exakte Verfahren gefunden wurden, so bleibt das Problem gleich: mit wachsendem \\(n\\) (der Anzahl der Punkte) steigt unser Aufwand immer noch exponentiell.<\/p>\n<p style=\"padding-left: 60px;\">Graphisch ausgedr\u00fcckt (geklaut aus der Wikipedia):<\/p>\n<p style=\"padding-left: 60px; text-align: center;\"><a href=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-2450\" style=\"margin-left: 10px; margin-right: 200px;\" alt=\"tsm\" src=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm.png\" width=\"339\" height=\"275\" srcset=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm.png 565w, https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm-300x243.png 300w\" sizes=\"auto, (max-width: 339px) 100vw, 339px\" \/><\/a><\/p>\n<p style=\"padding-left: 60px; text-align: left;\">Frage: <em>Wie ist der k\u00fcrzeste Weg von \\(A\\) nach \\(A\\) \u00fcber alle Punkte? <\/em><\/p>\n<p style=\"padding-left: 60px; text-align: left;\">W\u00e4hrend das bei \\(4\\) Punkten noch einfach ist, wird es f\u00fcr \\(100.000\\) Punkte schon deutlich schwerer.<\/p>\n<p style=\"padding-left: 60px; text-align: left;\">Es sind derzeit nur effiziente, <strong>heuristische Algorithmen<\/strong> bekannt, die die L\u00f6sung approximieren. Z.B. der <a href=\"http:\/\/de.wikipedia.org\/wiki\/Christofides-Heuristik\">Algorithmus von Christofides<\/a>, der in polynomieller Laufzeit eine L\u00f6sung approximieren kann, die maximal \\(1.5\\) Mal so lang ist wie die optimale L\u00f6sung.<\/p>\n<p style=\"padding-left: 60px; text-align: left;\">F\u00fcr exakte L\u00f6sungen gilt: jede Rundreise muss berechnet und die k\u00fcrzeste ausgew\u00e4hlt werden. Bei \\(15\\) St\u00e4dten haben wir \\(43\\) Mrd. M\u00f6glichkeiten. Hat man einen Rechner, der die L\u00f6sung f\u00fcr \\(30\\) St\u00e4dte in einer Stunde berechnet, dann braucht dieser f\u00fcr zwei zus\u00e4tzliche St\u00e4dte ann\u00e4hernd die tausendfache Zeit; das sind mehr als \\(40\\) Tage.<\/p>\n<p style=\"padding-left: 60px; text-align: left;\">Die <a href=\"http:\/\/hackvalue.de\/files\/tsp_slides.pdf\">Folien<\/a> der <a href=\"www.rwth-aachen.de\">RWTH Aachen<\/a> zeigen eine sch\u00f6ne Tabelle, die ich hier Snapshotten m\u00f6chte:<\/p>\n<p style=\"padding-left: 60px; text-align: center;\"><a href=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm_aachen.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-2451\" style=\"margin-left: 10px; margin-right: 200px;\" alt=\"tsm_aachen\" src=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm_aachen.png\" width=\"421\" height=\"265\" srcset=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm_aachen.png 702w, https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/tsm_aachen-300x188.png 300w\" sizes=\"auto, (max-width: 421px) 100vw, 421px\" \/><\/a><\/p>\n<p style=\"padding-left: 60px; text-align: left;\">Das Beispiel f\u00fchrt vor Augen, dass uns sehr daran gelegen, dass wir Probleme nicht in Exponentialzeit l\u00f6sen m\u00fcssen.<\/p>\n<p style=\"padding-left: 60px; text-align: left;\">Nachdem wir die <strong>Optimierungsvariante<\/strong> haben, kommen wir zum Bindeglied des \\(TSP\\) zu der Klasse \\(NP\\): uns geht es zun\u00e4chst nicht um Optimierung, sondern um eine Entscheidung.<\/p>\n<p style=\"padding-left: 60px; text-align: left;\">Die <strong>Entscheidungsvariante<\/strong> des \\(TSP\\) ist:<\/p>\n<blockquote>\n<p style=\"padding-left: 60px; text-align: left;\">Gibt es eine Tour mit Kosten \\({}\\leq b\\)?<\/p>\n<\/blockquote>\n<p style=\"padding-left: 60px; text-align: left;\">Und hier beginnt unsere Reise: w\u00e4hrend wir hier wieder alle Wege durchprobieren und so in der Klasse der Exponentialzeit-Algorithmen landen, k\u00f6nnen wir uns das Leben deutlich einfacher machen. Aber dazu gleich mehr.<\/p>\n<p style=\"padding-left: 60px; text-align: left;\">Ich gehe auf das \\(TSP\\) nun nicht weiter ein, da es mir nur um \\(P-NP\\) geht und die Ausf\u00fchrungen bis hierhin f\u00fcr diese Betrachtung ausreichen.<\/p>\n<p style=\"padding-left: 30px;\">Kleiner Exkurs zum Schluss: Durch die <a title=\"TIB: Separations- und Hierarchies\u00e4tze (Lernziele KE2, Update 2)\" href=\"https:\/\/fernuni.digreb.net\/?p=1390\">Hierarchies\u00e4tze<\/a> k\u00f6nnen wir z.B. zeigen, dass \\(P\\subsetneq EXPTIME\\) ist. Damit gibt es in \\(EXPTIME\\) Probleme, die nicht in \\(P\\) liegen.<\/p>\n<p><strong>Klassifizierung<\/strong> \\(P\\)<\/p>\n<p style=\"padding-left: 30px;\">Ein Problem in \\(P\\) bedeutet, dass es effizient <strong>l\u00f6sbar<\/strong> ist. Effizient hei\u00dft: die deterministische Turingmaschine, die das Problem l\u00f6st ist nach oben durch ein Polynom \\(n^k\\) beschr\u00e4nkt, wobei \\(n\\) die L\u00e4nge der Eingabe ist. Wichtig hieran ist: \\(k\\) ist zwar beliebig, aber absolut unabh\u00e4ngig von unserer Eingabe!<\/p>\n<p style=\"padding-left: 30px;\">Ein Beispiel f\u00fcr ein Problem in der Komplexit\u00e4tsklasse \\(P\\) ist das \\(PRIMES\\).<\/p>\n<p style=\"padding-left: 30px;\"><strong>Beispiel<\/strong> \\(PRIMES\\)<\/p>\n<p style=\"padding-left: 60px;\">Hier ist die Frage ob eine Zahl \\(x\\) eine Primzahl ist oder nicht.<\/p>\n<p style=\"padding-left: 60px;\">Die Antwort auf diese Frage ist ziemlich simpel: wir testen einfach aus ob alle Zahlen von \\(2\\) bis \\(x-1\\) unsere Zahl \\(x\\) ohne Rest teilen k\u00f6nnen. Wenn das nicht der Fall ist, ist die Zahl eine Primzahl.<\/p>\n<p style=\"padding-left: 60px;\">Mit dem <a href=\"http:\/\/de.wikipedia.org\/wiki\/AKS-Primzahltest\">AKS-Algorithmus<\/a> gibt es sogar einen, der das in Polynomzeit entscheiden kann. Damit geh\u00f6rt \\(PRIMES\\) tats\u00e4chlich zur Komplexit\u00e4tsklasse \\(P\\).<\/p>\n<p style=\"padding-left: 60px;\">Nach dem der Urvater der AKS-Algorithmen gefunden wurde, wurden weitere ersonnen, die die Laufzeit noch ein St\u00fcck nach unten korrigierten. Der schnellste bekannte Algorithmus aus der AKS-Familie terminiert in \\(O((log\\text{ }N)^{6+\\varepsilon})\\).<\/p>\n<p style=\"padding-left: 30px;\">Kommen wir nun zur Komplexit\u00e4tsklasse, die uns so brennend interessiert.<\/p>\n<p><strong>Klassifizierung<\/strong> \\(NP\\)<\/p>\n<p style=\"padding-left: 30px;\">Ist ein Problem in \\(NP\\), so bedeutet es, dass es effizient <strong>pr\u00fcfbar<\/strong> ist. In diesem Fall hei\u00dft effizient ebenfalls: die deterministische Turingmaschine, die pr\u00fcft ob das Zertifikat \\(z\\) zum Problem \\(X\\) (ein Zertifikat ist ein L\u00f6sungsvorschlag f\u00fcr ein Problem), ist nach oben durch ein Polynom \\(n^k\\) beschr\u00e4nkt, wobei \\(n\\) die L\u00e4nge der Eingabe ist.<\/p>\n<p style=\"padding-left: 30px;\">Gemerkt, was der Unterschied zwischen \\(NP\\) und \\(P\\) ist? Es ist ein Unterschied ob wir ein Problem l\u00f6sen oder &#8222;nur&#8220; einen L\u00f6sungsvorschlag pr\u00fcfen.<\/p>\n<p style=\"padding-left: 30px;\">Was bedeutet es f\u00fcr unser \\(TSP\\)?<\/p>\n<p style=\"padding-left: 30px;\"><strong>Beispiel<\/strong> \\(TSP\\)<strong>-Instanz<\/strong><\/p>\n<p style=\"padding-left: 60px;\">Nehmen wir unsere \\(4\\) Punkte aus dem obigen Beispiel und stellen uns die Frage:<\/p>\n<p style=\"padding-left: 90px;\"><em>Gibt es einen Weg von \\(A\\) nach \\(A\\) mit L\u00e4nge \\({}\\leq{100}\\)?<\/em><\/p>\n<p style=\"padding-left: 60px;\">Das ist ein Entscheidungsproblem. Und hier m\u00fcssten wir im schlimmsten Fall nun alle Wege durchprobieren bis wir einen Weg finden, der k\u00fcrzer als\/gleich \\(100\\) ist. Was bei vielen Punkten schon eine betr\u00e4chtliche Zeit in Anspruch nehmen kann, wie wir gesehen haben. Dieses &#8222;Durchprobieren&#8220; ist genau unser \\(N\\) aus \\(NP\\). Das Orakeln einer L\u00f6sung.<\/p>\n<p style=\"padding-left: 60px;\">Lassen wir das Orakeln weg und geben eine L\u00f6sung vor, bleibt nur noch \\(P\\): die Pr\u00fcfung einer gegebenen L\u00f6sung auf ihre Korrektheit. Und das k\u00f6nnen wir ziemlich zackig bewerkstelligen:<\/p>\n<p style=\"padding-left: 90px;\">Wir pr\u00fcfen die Kanten zwischen den Knoten und rechnen sie einfach zusammen:<\/p>\n<p style=\"padding-left: 90px;\">\\(A\\rightarrow{C}\\rightarrow{D}\\rightarrow{B}\\rightarrow{A}\\Rightarrow{{42}\\rightarrow{12}\\rightarrow{34}\\rightarrow{20}=108}\\)<\/p>\n<p style=\"padding-left: 90px;\">Nope, das war nichts. Versuchen wir es mit:<\/p>\n<p style=\"padding-left: 90px;\">\\(A\\rightarrow{D}\\rightarrow{C}\\rightarrow{B}\\rightarrow{A}\\Rightarrow{{35}\\rightarrow{12}\\rightarrow{30}\\rightarrow{20}=97}\\)<\/p>\n<p style=\"padding-left: 90px;\">Bingo!<\/p>\n<p style=\"padding-left: 90px;\">Man sieht leicht, dass wir zur Pr\u00fcfung einer vorgegebenen L\u00f6sung auf einer deterministischen Turingmaschine deutlich weniger Zeit ben\u00f6tigen als alle Wege durchzuprobieren.<\/p>\n<p style=\"padding-left: 60px;\">Und nun holen wir uns unser \\(N\\) aus \\(NP\\), indem wir orakeln. Wir raten einfach alle Kombinationen und pr\u00fcfen sie polynomiell durch unsere deterministische &#8222;Kontrollturingmaschine&#8220;.<\/p>\n<p style=\"padding-left: 60px;\">Im Schlimmsten Fall haben wir zwar immer noch einen exponentiellen Aufwand, aber vielleicht raten wir so gut, dass die Kombination \\(A\\rightarrow{D}\\rightarrow{C}\\rightarrow{B}\\rightarrow{A}\\)\u00a0die erste geratene M\u00f6glichkeit ist und wir schon nach dem ersten Orakeln eine L\u00f6sung gefunden haben.<\/p>\n<p style=\"padding-left: 60px;\">Und genau das bedeutet \\(NP\\): raten und pr\u00fcfen. Oder ganz, ganz frei interpretiert: Orakel\\(N\\) und \\(P\\)r\u00fcfen.<\/p>\n<p style=\"padding-left: 60px;\">Codieren wir den Graphen als Turingmaschine, so hat z.B. der Zustand \\(A\\) drei m\u00f6gliche Folgezust\u00e4nde (wir k\u00f6nnen zu \\(B\\), \\(C\\) oder \\(D\\) reisen). Es existieren also drei m\u00f6gliche Zustands\u00fcberg\u00e4nge, von denen wir einen w\u00e4hlen k\u00f6nnen. Genau hier beginnt das Raten\/Orakeln, unser \\(N\\) aus \\(NP\\). Anschlie\u00dfend haben wir zwei M\u00f6glichkeiten zur Auswahl, usw.<\/p>\n<p style=\"padding-left: 60px;\">So geht dann unsere \\(NTM\\) f\u00fcr das \\(TSP\\) vor und r\u00e4t eine Rundreise. Wir brechen ab wenn die Kosten h\u00f6her sind als \\(b\\) oder wir bei unserem Ausgangsknoten landen ohne alle Knoten besucht zu haben.<\/p>\n<p style=\"padding-left: 30px;\">Zusammenfassend l\u00e4sst sich sagen: \\(NP\\) bedeutet orakeln und pr\u00fcfen. Und das Pr\u00fcfen geschieht in maximal polynomieller Zeit.<\/p>\n<p style=\"padding-left: 30px;\">Habt Ihr nun ein Gef\u00fchl daf\u00fcr, was \\(NP\\) bedeutet? Gut.<\/p>\n<p>Nachdem wir nun alle notwendigen Komplexit\u00e4tsklassen \\(EXPTIME\\), \\(P\\) und \\(NP\\) besprochen haben, sollte euch klar sein wie der Zusammenhang zwischen \\(P\\) und \\(NP\\) ist.<\/p>\n<p>Jetzt k\u00f6nnen wir auch die Frage stellen, die das \\(P-NP\\)-Problem beschreibt:<\/p>\n<blockquote><p><em>Gilt \\(P=NP\\) oder \\(P\\neq{NP}\\)?<\/em><\/p>\n<p>In Worten:<\/p>\n<p><em>Sind die Klassen \\(P\\) und \\(NP\\) gleich oder nicht, <\/em><\/p>\n<p>bzw.<\/p>\n<p><em>kann jede Sprache, die nicht-deterministisch in Polynomzeit entschieden werden kann auch deterministisch in Polynomzeit entschieden werden?<\/em><\/p><\/blockquote>\n<p>Derzeit gehen <del>alle<\/del>\u00a0die meisten von letzterem aus. Die Folgen w\u00e4ren, wie gesagt, \u00fcbersichtlich wenn das stimmt. Daf\u00fcr m\u00fcssten wir nur zeigen, dass es in \\(NP\\) Probleme gibt, die definitiv nicht deterministisch polynomiell l\u00f6sbar, also nicht in \\(P\\) sind.<\/p>\n<p>Graphisch aufgearbeitet sieht die hier beleuchtete, problematische Beziehung zwischen \\(P\\) und \\(NP\\) so aus:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/pnpklassen.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-2452\" style=\"margin-left: 50px; margin-right: 300px;\" alt=\"pnpklassen\" src=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2013\/07\/pnpklassen.png\" width=\"204\" height=\"200\" \/><\/a><\/p>\n<p>Entnommen aus den <a href=\"http:\/\/www-m10.ma.tum.de\/foswiki\/pub\/Lehre\/SS11\/SeminarPHS\/PvsNP.pdf\">Folien der TUM<\/a>.<\/p>\n<p>Und welche M\u00f6glichkeiten haben wir nun um \\(P=NP\\) oder \\(P\\neq{NP}\\) zu beweisen?<\/p>\n<ol style=\"padding-left: 30px;\">\n<li><span style=\"line-height: 13px;\"><strong>Konstruktiver Beweis\n<p><\/strong>Wir finden einen polynomiellen Algorithmus, der ein \\(NP\\)-Vollst\u00e4ndiges Problem polynomiell l\u00f6st. Die Vollst\u00e4ndigkeit ist wichtig, so dass wir diesen Algorithmus auch auf alle anderen aus \\(NP\\) reduzieren k\u00f6nnen m\u00fcssen um die Klasse komplett abzudecken.<\/p>\n<p>Schaffen wir es also z.B. \\(TSP\\) deterministisch polynomiell zu l\u00f6sen, haben wir &#8211; da \\(TSP\\) eben \\(NP\\)-vollst\u00e4ndig ist, nichts geringeres als \\(P=NP\\) bewiesen.<\/span><\/li>\n<li><strong>Nicht-konstruktiver Beweis\n<p><\/strong>Nicht-konstruktiv bedeutet, dass man keine konkrete L\u00f6sung angibt, aber eindeutig auf die Existenz einer L\u00f6sung schlie\u00dfen kann.<\/p>\n<p>Man kann hier auch einen indirekten Beweis f\u00fchren, indem man annimmt, es g\u00e4be keine L\u00f6sung und diesen Satz zu einem Widerspruch f\u00fchrt. Daraus kann man dann schlie\u00dfen, dass es eine L\u00f6sung geben muss. Aber welche das ist, wird nicht genannt.<\/li>\n<\/ol>\n<p>Also an die Arbeit \ud83d\ude09<\/p>\n<p>Ich hoffe, ich konnte euch die Beziehung zwischen \\(P\\) und \\(NP\\) in diesem Beitrag etwas deutlicher machen.<\/p>\n<p>Wie immer: Bei Ungenauigkeiten, ab in die Kommentare.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei dem -Problem geht es um die Frage wie die beiden Komplexit\u00e4tsklassen zueinander stehen. Das Skript fasst sich nur sehr kurz, was \u00a0dieses Thema angeht, so dass ich beschlossen habe es hier noch einmal im Detail aufzuarbeiten. Das -Problem geh\u00f6rt zu den Millenium-Problemen, d.h. es winken eine Million USD wenn es gel\u00f6st wird. Aber eine &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/fernuni.digreb.net\/?p=2449\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eP-NP-Problem und das Problem des Handlungsreisenden\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-2449","post","type-post","status-publish","format-standard","hentry","category-theoretische-informatik"],"_links":{"self":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts\/2449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2449"}],"version-history":[{"count":11,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts\/2449\/revisions"}],"predecessor-version":[{"id":3528,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts\/2449\/revisions\/3528"}],"wp:attachment":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}