{"id":20455,"date":"2023-08-19T02:32:09","date_gmt":"2023-08-19T00:32:09","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=20455"},"modified":"2023-08-18T08:58:01","modified_gmt":"2023-08-18T06:58:01","slug":"das-haus-vom-nikolaus-mit-seinen-88-moeglichkeiten-und-seine-bedeutung-in-der-graphentheorie","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=20455","title":{"rendered":"Das &#8222;Haus vom Nikolaus&#8220; mit seinen 88 M\u00f6glichkeiten und seine Bedeutung in der Graphentheorie"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/08\/hausvomnikolaus-circo.png\" alt=\"\" width=\"325\" height=\"313\" class=\"aligncenter size-full wp-image-20456\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/08\/hausvomnikolaus-circo.png 325w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/08\/hausvomnikolaus-circo-300x289.png 300w\" sizes=\"auto, (max-width: 325px) 100vw, 325px\" \/><\/p>\n<p>Das &#8222;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Haus_vom_Nikolaus\" rel=\"noopener\" target=\"_blank\">Haus vom Nikolaus<\/a>&#8222;, ein einfaches geometrisches Muster aus f\u00fcnf Linien, das die Form eines stilisierten Hauses darstellt, mag auf den ersten Blick wie eine unschuldige Kindermalerei wirken. Doch hinter diesem scheinbar simplen Muster verbirgt sich eine faszinierende Verbindung zur Graphentheorie, einem Teilgebiet der Mathematik, das sich mit den Eigenschaften und Beziehungen von Graphen besch\u00e4ftigt. Dann mal los, und ein kleines Java Programm dazu.<\/p>\n<p><strong>Was ist das &#8222;Haus vom Nikolaus&#8220;?<\/strong><!--more--><\/p>\n<p>Das &#8222;Haus vom Nikolaus&#8220; ist eine Zeichnung, die aus f\u00fcnf Strichen besteht und die Form eines stilisierten Hauses zeigt. Es besteht aus einem Quadrat als Basis, einem Dreieck als Dach und einem rechteckigen Schornstein oben auf dem Dach. Es ist benannt nach dem &#8222;Nikolaus, dem Schutzpatron der Kinder&#8220;, da es oft von Kindern gezeichnet wird.<\/p>\n<p><strong>Graphentheorie und das &#8222;Haus vom Nikolaus&#8220;<\/strong><\/p>\n<p>Die Verbindung zwischen dem &#8222;Haus vom Nikolaus&#8220; und der Graphentheorie liegt in der M\u00f6glichkeit, die Zeichnung als Graphen darzustellen. Ein Graph in der Mathematik besteht aus Knoten (auch als Ecken oder Punkte bezeichnet) und Kanten (auch als Linien oder Verbindungen bezeichnet), die die Beziehungen zwischen den Knoten repr\u00e4sentieren. In diesem Zusammenhang k\u00f6nnen die Ecken des &#8222;Hauses vom Nikolaus&#8220; als Knoten betrachtet werden, w\u00e4hrend die Linien zwischen den Ecken die Kanten darstellen. Wie oben oder hier als gerichteter Graph:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/08\/hausvomnikolaus-dot.png\" alt=\"\" width=\"164\" height=\"443\" class=\"aligncenter size-full wp-image-20457\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/08\/hausvomnikolaus-dot.png 164w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/08\/hausvomnikolaus-dot-111x300.png 111w\" sizes=\"auto, (max-width: 164px) 100vw, 164px\" \/><\/p>\n<p><strong>Die Bedeutung der &#8222;Haus vom Nikolaus&#8220;-Graphen<\/strong><\/p>\n<p>Der &#8222;Haus vom Nikolaus&#8220;-Graph ist ein Beispiel f\u00fcr einen nicht-planaren Graphen. Ein planarer Graph ist ein Graph, der so auf einer Ebene gezeichnet werden kann, dass sich keine seiner Kanten \u00fcberschneiden. Der &#8222;Haus vom Nikolaus&#8220;-Graph kann jedoch nicht ohne Kanten\u00fcberschneidungen auf eine Ebene gezeichnet werden, was ihn zu einem klassischen Beispiel f\u00fcr einen nicht-planaren Graphen macht.<\/p>\n<p>Ein Graph G ist ein Tupel (V,E), wobei V eine Menge von Knoten (englisch vertex, oft auch Ecken genannt) und E eine Menge von Kanten (engl. edge, manchmal auch B\u00f6gen genannt) bezeichnet.<\/p>\n<p>In der Graphentheorie gibt es den ber\u00fchmten Satz von dem polnischen Mathematiker <a href=\"https:\/\/de.wikipedia.org\/wiki\/Kazimierz_Kuratowski\" rel=\"noopener\" target=\"_blank\">Kuratowski<\/a>, der besagt, dass ein Graph genau dann nicht-planar ist, wenn er einen Teilgraphen enth\u00e4lt, der homomorph zu einem &#8222;Haus vom Nikolaus&#8220;-Graphen ist. Das bedeutet, dass das &#8222;Haus vom Nikolaus&#8220; eine wichtige Rolle in der Untersuchung von nicht-planaren Graphen spielt und als Beispiel dient, um verschiedene Konzepte und Eigenschaften von Graphen zu veranschaulichen.<\/p>\n<p>Das &#8222;Haus vom Nikolaus&#8220; mag auf den ersten Blick wie eine einfache Kindermalerei aussehen, aber es hat eine tiefere Bedeutung in der Welt der Graphentheorie. Es veranschaulicht die Idee von nicht-planaren Graphen und bietet ein anschauliches Beispiel f\u00fcr den ber\u00fchmten Satz von Kuratowski. Dieses scheinbar unschuldige Muster ist ein hervorragendes Beispiel daf\u00fcr, wie abstrakte mathematische Konzepte in visuellen Darstellungen veranschaulicht werden k\u00f6nnen, um komplexe Ideen zu vermitteln.<\/p>\n<p>Dann mal hier ein Beispiel in Java und mit <a href=\"http:\/\/blog.wenzlaff.de\/?s=jGrapht\" rel=\"noopener\" target=\"_blank\">jGrapht<\/a>:<\/p>\n<pre class=\"lang:default decode:true \" >package de.wenzlaff.twgraph;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\nimport org.apache.logging.log4j.LogManager;\r\nimport org.apache.logging.log4j.Logger;\r\nimport org.jgrapht.ListenableGraph;\r\nimport org.jgrapht.alg.cycle.HierholzerEulerianCycle;\r\nimport org.jgrapht.graph.DefaultEdge;\r\nimport org.jgrapht.graph.DefaultListenableGraph;\r\nimport org.jgrapht.graph.SimpleDirectedGraph;\r\nimport org.jgrapht.traverse.DepthFirstIterator;\r\nimport org.jgrapht.traverse.GraphIterator;\r\n\r\n\/**\r\n * Ziel ist es, ein \u201eHaus\u201c in einem Linienzug aus genau acht Strecken zu\r\n * zeichnen, ohne eine Strecke zweimal zu durchlaufen. Begleitet wird das\r\n * Zeichnen mit dem simultan gesprochenen Reim aus acht Silben: \u201eDas ist das\r\n * Haus vom Ni-ko-laus.\u201c\r\n * \r\n * https:\/\/de.wikipedia.org\/wiki\/Haus_vom_Nikolaus\r\n * \r\n * @author Thomas Wenzlaff\r\n *\/\r\npublic class HausVomNikolaus {\r\n\r\n\tprivate static final Logger LOG = LogManager.getLogger(HausVomNikolaus.class);\r\n\r\n\tprivate ListenableGraph&lt;Object, DefaultEdge&gt; graph;\r\n\r\n\tpublic HausVomNikolaus() {\r\n\t\terstelleHausVomNikolausGraph();\r\n\t}\r\n\r\n\tprivate void erstelleHausVomNikolausGraph() {\r\n\r\n\t\t\/\/ Erstelle einen gerichteten Graphen mit SimpleDirectedGraph edges\r\n\t\tgraph = new DefaultListenableGraph&lt;&gt;(new SimpleDirectedGraph&lt;&gt;(DefaultEdge.class));\r\n\r\n\t\t\/\/ F\u00fcge 5 Knoten zum Graphen hinzu\r\n\t\tgraph.addVertex(\"1\");\r\n\t\tgraph.addVertex(\"2\");\r\n\t\tgraph.addVertex(\"3\");\r\n\t\tgraph.addVertex(\"4\");\r\n\t\tgraph.addVertex(\"5\");\r\n\r\n\t\t\/\/ F\u00fcge 8 Kanten = Verbindungsstrecken zwischen den Knoten hinzu\r\n\t\tgraph.addEdge(\"1\", \"2\");\r\n\t\tgraph.addEdge(\"2\", \"4\");\r\n\t\tgraph.addEdge(\"4\", \"3\");\r\n\t\tgraph.addEdge(\"3\", \"5\");\r\n\t\tgraph.addEdge(\"5\", \"4\");\r\n\t\tgraph.addEdge(\"4\", \"1\");\r\n\t\tgraph.addEdge(\"1\", \"3\");\r\n\t\tgraph.addEdge(\"3\", \"2\");\r\n\r\n\t\talleKnotenAusgeben();\r\n\t}\r\n\r\n\tpublic ListenableGraph&lt;Object, DefaultEdge&gt; getGraph() {\r\n\t\treturn graph;\r\n\t}\r\n\r\n\t\/**\r\n\t * Problemgegenstand ist ein Graph, f\u00fcr den ein Eulerweg, aber kein Eulerkreis\r\n\t * existiert, da er zwei Knoten von ungeradem Grad (die Knoten 1 und 2 haben\r\n\t * hier jeweils einen Grad von 3) enth\u00e4lt.\r\n\t * \r\n\t * @return true wenn es ein eulerscher Graph w\u00e4hre, sonst immer false\r\n\t *\/\r\n\tpublic boolean isHausVomNikolausEulerian() {\r\n\r\n\t\tHierholzerEulerianCycle&lt;Object, DefaultEdge&gt; hier = new HierholzerEulerianCycle&lt;&gt;();\r\n\t\tboolean isEulerian = hier.isEulerian(graph); \/\/ eigentlich nur f\u00fcr ungerichtete Graphen, geht in diesem Fall aber so auch\r\n\t\tif (isEulerian) {\r\n\t\t\tLOG.info(\"Das HausVomNikolaus ist ein eulerscher Graph. Das trifft nie zu.\");\r\n\t\t} else {\r\n\t\t\tLOG.info(\"Das HausVomNikolaus f\u00fcr den es ein Eulerweg, aber kein Eulerkreis existiert wenn von 1 oder 2 gestartet wird.\");\r\n\t\t}\r\n\t\treturn isEulerian;\r\n\t}\r\n\r\n\tpublic List&lt;Object&gt; alleKnotenAusgeben() {\r\n\r\n\t\tString startVertex = \"1\"; \/\/ start Knoten\r\n\r\n\t\tGraphIterator&lt;Object, DefaultEdge&gt; it = new DepthFirstIterator&lt;&gt;(graph, startVertex);\r\n\r\n\t\tList&lt;Object&gt; ergebnisKnoten = new ArrayList&lt;&gt;();\r\n\r\n\t\twhile (it.hasNext()) {\r\n\t\t\tergebnisKnoten.add(it.next());\r\n\t\t}\r\n\t\tLOG.info(ergebnisKnoten);\r\n\t\treturn ergebnisKnoten;\r\n\t}\r\n}\r\n<\/pre>\n<p>Und eine Testklasse dazu:<\/p>\n<pre class=\"lang:default decode:true \" >package de.wenzlaff.twgraph;\r\n\r\nimport static org.junit.jupiter.api.Assertions.assertFalse;\r\nimport static org.junit.jupiter.api.Assertions.assertNotNull;\r\nimport static org.junit.jupiter.api.Assertions.assertTrue;\r\n\r\nimport java.io.File;\r\n\r\nimport org.apache.logging.log4j.LogManager;\r\nimport org.apache.logging.log4j.Logger;\r\nimport org.jgrapht.ListenableGraph;\r\nimport org.jgrapht.alg.cycle.HierholzerEulerianCycle;\r\nimport org.jgrapht.graph.DefaultEdge;\r\nimport org.jgrapht.graph.DefaultListenableGraph;\r\nimport org.jgrapht.graph.SimpleGraph;\r\nimport org.jgrapht.nio.dot.DOTExporter;\r\nimport org.junit.jupiter.api.Test;\r\n\r\n\/**\r\n * \r\n * @author Thomas Wenzlaff\r\n *\r\n *\/\r\nclass HausVomNikolausTest {\r\n\r\n\tprivate static final Logger LOG = LogManager.getLogger(HausVomNikolausTest.class);\r\n\r\n\t\/** SUT. *\/\r\n\tprivate HausVomNikolaus graph = new HausVomNikolaus();\r\n\r\n\t@Test\r\n\tvoid testHausVomNikoloaus() {\r\n\t\tassertNotNull(graph);\r\n\t}\r\n\r\n\t@Test\r\n\tvoid testIsHausVomNikolausEulerian() {\r\n\r\n\t\tDotExporter dotExp = new DotExporter();\r\n\r\n\t\tassertFalse(graph.isHausVomNikolausEulerian());\r\n\r\n\t\tFile dotFile = new File(\"target\", \"junit-test-hausvomnikolaus.dot\");\r\n\r\n\t\tDOTExporter&lt;Object, DefaultEdge&gt; writeDotFile = dotExp.writeDotFile(graph.getGraph(), dotFile);\r\n\r\n\t\tassertNotNull(writeDotFile);\r\n\t\tassertTrue(dotFile.exists());\r\n\t}\r\n\r\n\t@Test\r\n\tvoid testIsEulerian() {\r\n\r\n\t\t\/\/ https:\/\/de.wikipedia.org\/wiki\/Algorithmus_von_Hierholzer\r\n\t\t\/\/ der in einem ungerichteten Graphen Eulerkreise bestimmt\r\n\t\tHierholzerEulerianCycle&lt;Object, DefaultEdge&gt; hier = new HierholzerEulerianCycle&lt;&gt;();\r\n\t\tboolean isEulerian = hier.isEulerian(getTestEulerGraph());\r\n\r\n\t\tassertTrue(isEulerian);\r\n\t}\r\n\r\n\tprivate ListenableGraph&lt;Object, DefaultEdge&gt; getTestEulerGraph() {\r\n\r\n\t\tListenableGraph&lt;Object, DefaultEdge&gt; eulersGraphQuadrat = new DefaultListenableGraph&lt;&gt;(new SimpleGraph&lt;&gt;(DefaultEdge.class));\r\n\r\n\t\teulersGraphQuadrat.addVertex(\"1\");\r\n\t\teulersGraphQuadrat.addVertex(\"2\");\r\n\t\teulersGraphQuadrat.addVertex(\"3\");\r\n\t\teulersGraphQuadrat.addVertex(\"4\");\r\n\r\n\t\teulersGraphQuadrat.addEdge(\"1\", \"2\");\r\n\t\teulersGraphQuadrat.addEdge(\"2\", \"3\");\r\n\t\teulersGraphQuadrat.addEdge(\"3\", \"4\");\r\n\t\teulersGraphQuadrat.addEdge(\"4\", \"1\");\r\n\r\n\t\treturn eulersGraphQuadrat;\r\n\t}\r\n}\r\n<\/pre>\n<p>Wer noch ein Template f\u00fcr <a href=\"https:\/\/graphviz.org\/\" rel=\"noopener\" target=\"_blank\">Graphviz<\/a> braucht:<\/p>\n<pre class=\"lang:default decode:true \" >strict digraph G {\r\n  1 [ label=\"1\" style=\"filled\" fillcolor=\"#EEEEEE\" color=\"#31CEF0\" ];\r\n  2 [ label=\"2\" style=\"filled\" fillcolor=\"#EEEEEE\" color=\"#31CEF0\" ];\r\n  3 [ label=\"3\" style=\"filled\" fillcolor=\"#EEEEEE\" color=\"#31CEF0\" ];\r\n  4 [ label=\"4\" style=\"filled\" fillcolor=\"#EEEEEE\" color=\"#31CEF0\" ];\r\n  5 [ label=\"5\" style=\"filled\" fillcolor=\"#EEEEEE\" color=\"#31CEF0\" ];\r\n  1 -&gt; 2;\r\n  2 -&gt; 4;\r\n  4 -&gt; 3;\r\n  3 -&gt; 5;\r\n  5 -&gt; 4;\r\n  4 -&gt; 1;\r\n  1 -&gt; 3;\r\n  3 -&gt; 2;\r\n}\r\n<\/pre>\n<p>Nun fehlt noch ein kleines Programm, um alle 88 M\u00f6glichkeiten zu erzeugen. Der ganze Quellcode ist auf <a href=\"https:\/\/gitlab.com\/IT-Berater\/twgraph\" rel=\"noopener\" target=\"_blank\">GitLab<\/a>. Aber nicht mehr heute &#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das &#8222;Haus vom Nikolaus&#8222;, ein einfaches geometrisches Muster aus f\u00fcnf Linien, das die Form eines stilisierten Hauses darstellt, mag auf den ersten Blick wie eine unschuldige Kindermalerei wirken. Doch hinter diesem scheinbar simplen Muster verbirgt sich eine faszinierende Verbindung zur Graphentheorie, einem Teilgebiet der Mathematik, das sich mit den Eigenschaften und Beziehungen von Graphen besch\u00e4ftigt. &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=20455\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDas &#8222;Haus vom Nikolaus&#8220; mit seinen 88 M\u00f6glichkeiten und seine Bedeutung in der Graphentheorie\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,3897,5,79,2713],"tags":[5702,5696,1596,5697,5699,1632,3132,5701,5648,1594,5689,5643,5666,5653,5700,5693,5652,5688,5691,5704,5694,5690,5692,5705,5695,5698,5703],"class_list":["post-20455","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java-programmierung","category-java","category-programmierung","category-statistik","tag-abstrakte-konzepte","tag-beziehungen","tag-dot","tag-ebene","tag-geometrie","tag-graph","tag-graphen","tag-graphendarstellung","tag-graphentheorie","tag-graphviz","tag-haus-vom-nikolaus","tag-jgrapht","tag-jgrapht-bibliothek","tag-kanten","tag-kinderspiel","tag-kinderzeichnung","tag-knoten","tag-kuratowski","tag-kuratowskis-satz","tag-mathematische-verbindung","tag-mathematisches-muster","tag-nicht-planarer-graph","tag-planarer-graph","tag-schutzpatron","tag-teilgraph","tag-ueberschneidungen","tag-visuelle-darstellung"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/20455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=20455"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/20455\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=20455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=20455"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=20455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}