<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PhiLIOsoph &#187; Freaky</title>
	<atom:link href="http://www.robertnitsch.de/category/pc/freaky/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.robertnitsch.de</link>
	<description>Ansichten, Erlebnisse und Werke eines Heranwachsenden</description>
	<lastBuildDate>Tue, 20 Jul 2010 19:27:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>RFA: Ein rekursiver Algorithmus für das metrische Traveling-Salesman-Problem</title>
		<link>http://www.robertnitsch.de/2010/01/14/rfa-ein-rekursiver-algorithmus-fur-das-metrische-traveling-salesman-problem/</link>
		<comments>http://www.robertnitsch.de/2010/01/14/rfa-ein-rekursiver-algorithmus-fur-das-metrische-traveling-salesman-problem/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 20:30:04 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Mathematik]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Schule]]></category>
		<category><![CDATA[Studium]]></category>

		<guid isPermaLink="false">http://www.robertnitsch.de/?p=483</guid>
		<description><![CDATA[In diesem Artikel stelle ich einen rekursiven Algorithmus namens RFA für das metrische bzw. geometrische Traveling-Salesman-Problem (Problem des Handlungsreisenden, auch genannt Rundreiseproblem) vor. Idee &#038; Umsetzung stammen von mir; bei meiner Recherche habe ich den Algorithmus nicht finden können. Ich gehe daher vorläufig davon aus, dass ich der erste damit bin. Bei dem hier betrachteten [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Artikel stelle ich einen rekursiven Algorithmus namens <strong>RFA</strong> für das metrische bzw. geometrische <a href="http://de.wikipedia.org/wiki/Problem_des_Handlungsreisenden" rel="nofollow" class="liwikipedia">Traveling-Salesman-Problem</a> (<em>Problem des Handlungsreisenden</em>, auch genannt <em>Rundreiseproblem</em>) vor. Idee &#038; Umsetzung stammen von mir; bei meiner Recherche habe ich den Algorithmus nicht finden können. Ich gehe daher vorläufig davon aus, dass ich der erste damit bin. <img src='http://www.robertnitsch.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Bei dem hier betrachteten Traveling-Salesman-Problem geht es darum, eine möglichst kostengünstige Rundreise durch eine gegebene Menge an &#8220;Städten&#8221; (ich werde bei der Terminologie &#8220;Stadt&#8221; bleiben) zu finden, wobei jede Stadt genau 1 Mal besucht werden muss. Jede Wegstrecke zwischen 2 Städten ist mit bestimmten Reisekosten verbunden. In dem von mir gemeinten Fall des metrischen TSP entsprechen die Reisekosten genau der Luftlinie zwischen den beiden Städten. Daher habe ich die Städte der Einfachheit halber als Punkte in der Ebene modelliert (mit einer X- und einer Y-Koordinate), womit bereits erste Experimente möglich sind.</p>
<h3>Phase 1: Reduktion auf den Trivialfall des TSP</h3>
<div id="attachment_484" class="wp-caption alignright" style="width: 228px"><a href="http://www.robertnitsch.de/wp-content/uploads/2010/01/00_TSP_Trivialfall.png" class="liimagelink"><img src="http://www.robertnitsch.de/wp-content/uploads/2010/01/00_TSP_Trivialfall.png" alt="TSP - Trivialfall mit nur 3 Städten" title="00_TSP_Trivialfall" width="218" height="201" class="size-full wp-image-484" /></a><p class="wp-caption-text">TSP - Trivialfall mit nur 3 Städten</p></div>
<p>Mein Algorithmus greift darauf zurück, dass das Rundreiseproblem für 3 Städte trivial ist, weil es nur 1 mögliche Rundreise durch 3 Städte gibt (siehe Grafik auf der rechten Seite).</p>
<p>Bei 1-3 Städten kann der Algorithmus daher direkt die Lösung zurückgeben, weil sie offensichtlich ist.</p>
<p>Bei mehr als 3 Städten arbeitet der Algorithmus in 2 Phasen.</p>
<p>In der 1. Phase werden die gegebenen Städte solange gefaltet, bis nur noch 3 Städte übrig sind.</p>
<p>Es werden jeweils 2 Städte gefaltet. Das sieht so aus, dass eine neue fiktive Stadt erzeugt wird, deren Koordinate gleich dem Mittelpunkt/Zentrum der 2 gefalteten Städte ist. Die 2 gefalteten Städte werden dann durch die neue fiktive Stadt <em>ersetzt</em>, wobei sich die fiktive Stadt ihre &#8220;Vorbilder&#8221; (<em>&#8220;Kind-Städte&#8221;</em>) merkt. Dadurch wird das Falten zugleich umkehrbar.</p>
<p>Eine naive Implementierung sieht zum Beispiel so aus, dass in jedem Schritt <em>zufällig</em> eine Stadt ausgewählt und ihr nächster Nachbar berechnet wird. Diese beiden Städte werden dann gefaltet. Der Vorgang wird so lange wiederholt, bis wie gesagt nur noch 3 Städte übrig sind. Fiktive Städte können genauso gefaltet werden wie die Ursprungs-Städte. (Dadurch ergibt sich je nach Anzahl der Städte eine beliebig tiefe &#8220;Verschachtelung&#8221;.)</p>
<div style="clear:both;"></div>
<h3>Phase 2: Entfalten der Städte mit optimaler Integration der Kind-Städte</h3>
<p>Nach der 1. Phase sind wir also beim Trivialfall mit 3 Städten angekommen. Das ist auch schon unsere vorläufige Lösung bzw. die vorläufige Rundreise.</p>
<p>In der 2. Phase werden die fiktiven Städte wieder entfaltet, wobei die vorläufige Rundreise bei jedem Schritt erhalten wird.</p>
<div id="attachment_487" class="wp-caption alignright" style="width: 228px"><a href="http://www.robertnitsch.de/wp-content/uploads/2010/01/01_TSP_Entfalten1.png" class="liimagelink"><img src="http://www.robertnitsch.de/wp-content/uploads/2010/01/01_TSP_Entfalten1.png" alt="" title="01_TSP_Entfalten1" width="218" height="201" class="size-full wp-image-487" /></a><p class="wp-caption-text">TSP - Fiktive Stadt (blau) mit Kind-Städten (rot) in einer vorläufigen Rundreise zu Beginn von Phase 2</p></div>
<p>Betrachten wir die Grafik auf der rechten Seite. Nehmen wir an die beiden rot markierten Städte seien die Kind-Städte der blau markierten fiktiven Stadt. (Wie man auch gut sehen kann befindet sich die blaue Stadt genau im Zentrum ihrer beiden Kind-Städte.)</p>
<p>Wenn die fiktive Stadt nun in Phase 2 durch ihre Kinder ersetzt wird, dann gibt es genau 2 Möglichkeiten, wie man die beiden Kind-Städte in die gegebene Rundreise integrieren kann. Dazu muss man sich die blaue Stadt wegdenken, denn diese existiert dann ja nicht mehr.</p>
<div style="clear:both;"></div>
<div id="attachment_594" class="wp-caption alignright" style="width: 228px"><a href="http://www.robertnitsch.de/wp-content/uploads/2010/01/02_TSP_Entfalten2.png" class="liimagelink"><img src="http://www.robertnitsch.de/wp-content/uploads/2010/01/02_TSP_Entfalten2.png" alt="TSP - Entfalten mit beiden Integrationsmöglichkeiten" title="02_TSP_Entfalten2" width="218" height="201" class="size-full wp-image-594" /></a><p class="wp-caption-text">TSP - Entfalten mit beiden Integrationsmöglichkeiten (grün = die bessere Variante)</p></div>
<p>Auf dem nächsten Bild sind die beiden Möglichkeiten eingezeichnet. Die grüne Variante ist offensichtlich die kürzere und damit auch die bessere Wahl.</p>
<p>Halten wir fest: Beim Entfalten muss der Algorithmus nach jedem Schritt entscheiden, wie er die neuen Städte in die bestehende Rundreise integriert. Dabei gilt es zwischen genau 2 Alternativen zu wählen&#8230; und das ist relativ leicht.</p>
<p>Phase 2 endet, wenn keine fiktiven Städte mehr übrig sind, die noch entfaltet werden könnten. Die Rundreise ist damit &#8220;fertig&#8221; und kann vom Algorithmus zurückgegeben werden.</p>
<div style="clear:both;"></div>
<h3>Namensgebung: RFA</h3>
<p>Weil der Algorithmus auf dem Falten &#038; Entfalten der Städte beruht taufe ich ihn <strong>RFA</strong>: <strong>Rekursiver-Falt-Algorithmus</strong> bzw. <em>recursive-fold-algorithm</em>.</p>
<h3>Beispiele</h3>
<div id="attachment_521" class="wp-caption alignleft" style="width: 299px"><a href="http://www.robertnitsch.de/wp-content/uploads/2010/01/03_TSP_Rundreise_100.png" class="liimagelink"><img src="http://www.robertnitsch.de/wp-content/uploads/2010/01/03_TSP_Rundreise_100-289x300.png" alt="TSP - Rundreise mit 100 Städten" title="03_TSP_Rundreise_100" width="289" height="300" class="size-medium wp-image-521" /></a><p class="wp-caption-text">TSP - Rundreise mit 100 Städten</p></div>
<div id="attachment_523" class="wp-caption alignright" style="width: 299px"><a href="http://www.robertnitsch.de/wp-content/uploads/2010/01/04_TSP_Rundreise_500.png" class="liimagelink"><img src="http://www.robertnitsch.de/wp-content/uploads/2010/01/04_TSP_Rundreise_500-289x300.png" alt="TSP - Rundreise mit 500 Städten" title="04_TSP_Rundreise_500" width="289" height="300" class="size-medium wp-image-523" /></a><p class="wp-caption-text">TSP - Rundreise mit 500 Städten</p></div>
<div style="clear:both;"></div>
<p>Die Rundreise auf der linken Seite besteht aus 100 Städten und wurde im Bruchteil einer Sekunde berechnet.</p>
<p>Die Rundreise auf der rechten Seite besteht aus 500 Städten und wurde in nur etwas mehr als 1 Sekunde berechnet.</p>
<p>Wie man an den beiden Beispielen auch gut sehen kann arbeitet der RFA keineswegs optimal, denn an der einen oder anderen Stelle überschneiden sich die Rundreisen sogar (das sicherste Zeichen dafür, dass eine Lösung suboptimal ist).</p>
<p>Nichtsdestotrotz handelt es sich in beiden Fällen um sehr gute Näherungslösungen, die zudem in kürzester Zeit berechnet wurden.</p>
<h3>Performanz &#038; Güte des RFA</h3>
<p>Der RFA befindet sich, was die Laufzeit betrifft, in der Komplexitätsklasse <strong>O(n²)</strong><sup class='footnote'><a href="#fn-483-1" id='fnref-483-1' class="liinternal">1</a></sup> (Faustregel: Verdoppelt man die Anzahl der Städte, so braucht der Algorithmus 4 Mal so lang). Die Speicherkomplexität liegt dagegen bei <strong>O(n)</strong>.</p>
<p>In allen mir bekannten Fällen stellten die vom Algorithmus erzeugten Rundreisen eine gute bis sehr gute Näherung an die optimale Lösung dar.</p>
<p>Dank seiner überragend hohen Geschwindigkeit <strong>eignet sich der RFA in meinen Augen besonders für die Berechnung von Näherungslösungen bei sehr großen Probleminstanzen mit vielen tausenden Städten</strong>. Für <a href="http://www.robertnitsch.de/wp-content/uploads/2010/01/TSP_Rundreise_10000.png" target="_blank" class="liinternal">eine Rundreise durch 10000 Städte *klick*</a> benötigt meine eigene, sehr simple Python-Implementierung beispielsweise ca. 7 Minuten und 20 Sekunden. Gemessen an der Qualität der erhaltenen Näherungslösung ist das ziemlich schnell.</p>
<p>Ausgehend von dieser Näherungslösung kann die Rundreise dann Stück für Stück durch weitere Algorithmen dem Optimum näher gebracht werden.</p>
<p>Zum Vergleich möchte ich außerdem an meinen evolutionären Algorithmus für das TSP erinnern (habe ich damals ebenfalls in Python implementiert). Dieser brauchte bei Städtezahlen jenseits der 100 bereits ewig für eine Näherungslösung. (Für weitere Details siehe <a href="http://www.robertnitsch.de/projekte/lernleistung/" class="liinternal">Projekte -&gt; Lernleistung</a>.)</p>
<h3>Testlauf mit TSP-Instanzen der TSPLIB</h3>
<p>Für TSP &#8211; Testläufe gibt es die sogenannte <a href="http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/" class="liexternal">TSPLIB</a>. Sie enthält dutzende von TSP-Instanzen mit den unterschiedlichsten Eigenschaften. Von kleinen bis sehr großen Städte-Zahlen ist alles dabei. Das besondere ist, dass in der TSPLIB in vielen Fällen die optimale Lösung bereits enthalten ist. Damit kann man die Ergebnisse von TSP-Algorithmen überprüfen oder ihre Güte in der Praxis abschätzen.</p>
<p>Bisher habe ich meinen Algorithmus zwar hoch gelobt, aber ich bin glaubwürdige Aussagen schuldig geblieben. Daher habe ich ihn auf einige metrische TSP-Instanzen der TSPLIB angesetzt (<a href="http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95/tsp/" class="liexternal">Quelle</a>):</p>
<table border="1">
<thead>
<tr>
<th>Instanz-Bezeichnung<br /><span class="tiny">(enthält Städte-Anzahl)</span></th>
<th>Gesamtlänge der<br />optimalen Rundreise<span class="tiny"> (<a href="http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/STSP.html" class="liexternal">Quelle</a>)</span></th>
<th>Lösung des RFA</th>
<th>Faktor<sup class='footnote'><a href="#fn-483-2" id='fnref-483-2' class="liinternal">2</a></sup></th>
<th>Laufzeit</th>
</tr>
</thead>
<tbody>
<tr>
<td>a280</td>
<td>2579</td>
<td>3372</td>
<td>130.75%</td>
<td>0.482s</td>
</tr>
<tr>
<td>berlin52</td>
<td>7542</td>
<td>8334</td>
<td>110.5%</td>
<td>0.022s</td>
</tr>
<tr>
<td>bier127</td>
<td>118282</td>
<td>139535</td>
<td>117.97%</td>
<td>0.106s</td>
</tr>
<tr>
<td>brd14051</td>
<td>469385</td>
<td>573675</td>
<td>122.22%</td>
<td>15m 27s</td>
</tr>
<tr>
<td>ch150</td>
<td>6528</td>
<td>7830</td>
<td>119.94%</td>
<td>0.159s</td>
</tr>
<tr>
<td>d18512</td>
<td>645238</td>
<td>779639</td>
<td>120.83%</td>
<td>26m 19s</td>
</tr>
<tr>
<td>eil51</td>
<td>426</td>
<td>524</td>
<td>123.0%</td>
<td>0.023s</td>
</tr>
<tr>
<td>pr76</td>
<td>108159</td>
<td>126086</td>
<td>116.57%</td>
<td>0.049s</td>
</tr>
<tr>
<td>pr107</td>
<td>44303</td>
<td>46578</td>
<td>105.14%</td>
<td>0.078s</td>
</tr>
<tr>
<td>pr439</td>
<td>107217</td>
<td>132462</td>
<td>123.55%</td>
<td>1.079s</td>
</tr>
<tr>
<td>pr1002</td>
<td>259045</td>
<td>323954</td>
<td>125.06%</td>
<td>5.157s</td>
</tr>
<tr>
<td>rat99</td>
<td>1211</td>
<td>1374</td>
<td>113.46%</td>
<td>0.068s</td>
</tr>
<tr>
<td>rat783</td>
<td>8806</td>
<td>10548</td>
<td>119.78%</td>
<td>3.171s</td>
</tr>
</tbody>
</table>
<p></p>
<p>Im Schnitt sind die von meinem Algorithmus berechneten Rundreisen <strong>119.14%</strong> länger als die jeweilige optimale Rundreise.</p>
<p>Damit schlägt sich der RFA bei deutlich besserer Laufzeitkomplexität mindestens genausogut wie die <a href="http://de.wikipedia.org/wiki/Christofides-Heuristik" rel="nofollow" class="liwikipedia">Christofides-Heuristik</a> bzw. der Christofides-Näherungsalgorithmus (mit einer Laufzeitkomplexität von <strong>O(n³)</strong>). Die Christofides-Heuristik hat nämlich für metrische Rundreiseprobleme eine feste Gütegarantie von 50%, d.h. sie garantiert einen Faktor von höchstens 150%, d.h. die Lösungen sind maximal 1,5fach so lang wie die optimale Lösung. (Sie ist damit der bisher beste Algorithmus mit einer festen Gütegarantie.)</p>
<p>Zwar kann ich (noch?) nicht beweisen, dass der RFA ebenfalls über eine Gütegarantie verfügt. Aber in der Praxis zeigt sich, dass der Faktor deutlich unter 150% bleibt.</p>
<h3>Übertragbarkeit auf nicht-metrische Rundreiseprobleme</h3>
<p>Der RFA ist zwar auch übertragbar auf nicht-metrische Rundreiseprobleme (das Falten von 2 &#8220;Städten&#8221; muss man dann entsprechend neu erfinden), allerdings erhoffe ich mir davon keine so guten Resultate. Der RFA beruht nunmal hauptsächlich auf der <a href="http://de.wikipedia.org/wiki/Dreiecksungleichung" rel="nofollow" class="liwikipedia">Dreiecksungleichung</a> (denn für je 2 &#8220;Städte&#8221; muss eine Art fiktive Stadt im Zentrum der 2 Städte konstruierbar sein). Je stärker diese verletzt wird, desto schlechter werden die Ergebnisse vermutlich sein. Daher eignet sich der RFA auch nur bedingt für asymmetrische TSP-Instanzen (also wenn die Reisekosten für A -&gt; B nicht immer auch den Reisekosten B -&gt; A entsprechen (bspw. bergauf vs. bergab)).</p>
<p>Ein dahingehender Test meinerseits steht aber noch aus.</p>
<h3>Verbesserungsmöglichkeiten</h3>
<p>Abgesehen von der Art der Implementierung (bis jetzt nur in Python; viel schneller wäre C++) kann man den Algorithmus selbst, d.h. seine Laufzeitkomplexität, definitiv noch weiter verbessern.</p>
<p>Ich sehe großen Spielraum in Phase 1 beim Falten der Städte. Die wesentliche Rechenleistung in Phase 1 besteht darin, zu einer gegebenen Stadt ihren nächsten Nachbarn zu finden. Das kann man deutlich beschleunigen, indem man die Städte zu Beginn von Phase 1 partitioniert (die &#8220;Landkarte&#8221; wird auf bestimmte Weise in Quadrate aufgeteilt). Dadurch muss man beim Suchen des nächsten Nachbars nicht mehr <em>alle</em> Städte berücksichtigen, sondern nur noch diejenigen Städte, die sich in den umliegenden/benachbarten Partitionen befinden. Beim Falten von 2 Städten muss dann natürlich sichergestellt werden, dass die neu erzeugte fiktive Stadt ihrerseits in die korrekte Partition eingeordnet wird.</p>
<p>Die Güte des Algorithmus kann man womöglich deutlich verbessern, indem man eine Methode entwickelt, die auf intelligente Weise die Städte faltet. In meiner naiven Implementierung geschieht die Auswahl der zu faltenden Städte nämlich <em>zufällig</em>. An dieser Stelle kann man gewiss noch Verbesserungen erzielen, indem man die Reihenfolge des Faltens nicht nur dem Zufall überlässt.</p>
<p>In Phase 2 sehe ich wenig Potenzial zur Verbesserung, weil das Entfalten &#8211; wie beschrieben &#8211; quasi optimal erfolgt. Die Reihenfolge des Entfaltens spielt jedoch mMn. wenigstens eine untergeordnete Rolle, deshalb behalte ich mir eine nähere Untersuchung von Phase 2 vor.</p>
<h3>Zusammenfassung</h3>
<p>Der von mir entwickelte Algorithmus für das metrische TSP hat eine Laufzeitkomplexität von <strong>O(n²)</strong> und eine Speicherkomplexität von <strong>O(n)</strong>. Weil er auf dem Falten &#038; Entfalten der Städte beruht und das TSP dabei (zumindest zwischenzeitlich) auf den Trivialfall reduziert, nenne ich ihn <strong>RFA: Rekursiver-Falt-Algorithmus</strong>.</p>
<p>Obwohl meine Python-Implementierung ausgesprochen naiv vorgeht und ich mir kaum Mühe gegeben habe effizienten Code zu schreiben, bewältigt sie TSP-Instanzen der TSPLIB in sehr kurzer Zeit. Die Länge der dabei gefundenen Lösungen lag im Durchschnitt nur ca. 19% über der jeweils optimalen Lösung (also Faktor 119%; der höchste Faktor betrug 130%).</p>
<p>Daher kann der RFA durchaus mit der <strong>Christofides-Heuristik</strong> &#8211; der bisher beste Algorithmus mit einer festen Gütegarantie für das metrische TSP &#8211; konkurrieren, nicht zuletzt weil diese eine deutlich schlechtere Laufzeitkomplexität von <strong>O(n³)</strong> besitzt (und überdies auch noch sehr viel komplizierter ist). Eventuell kann ich beweisen, dass auch für den RFA eine feste Gütegarantie gilt. In der Praxis schlägt er sich auf alle Fälle sehr gut.</p>
<p>Der RFA ist zwar grundsätzlich auch übertragbar auf nicht-metrische Rundreiseprobleme, allerdings hängt die Güte des RFA sehr wahrscheinlich von der Dreiecksungleichung ab. Je stärker diese verletzt wird, desto schlechter werden die Ergebnisse vermutlich sein.</p>
<p><strong>Dank seiner überragenden Geschwindigkeit eignet sich der Algorithmus in meinen Augen besonders für die Berechnung von Näherungslösungen für sehr große TSP-Instanzen mit vielen Tausend Städten.</strong></p>
<h3>Download meiner Python-Implementierung</h3>
<p><a href="http://www.robertnitsch.de/wp-content/uploads/2010/01/RFA_demo.zip" class="lizip">RFA_demo.zip</a> (2.2 MB)</p>
<p>Der Quelltext befindet sich im Ordner &#8220;src&#8221; (die Dateien sind <strong>UTF-8</strong>-kodiert). Die im Artikel verwendeten TSPLIB-Challenges (und viele weitere) befinden sich im Ordner &#8220;TSPLIB&#8221;.</p>
<p>Die auszuführende Datei ist <strong>src/RFA_demo.py</strong>. Ich habe <a href="http://python.org/download/" class="liexternal">Python 2.6</a> verwendet, es sollte aber auch mit <strong>Python 2.5</strong> laufen.</p>
<p>In der Datei <strong>RFA_demo.py</strong> kann man auch einige Einstellungen verändern. Ich habe die entsprechenden Stellen deutlich hervorgehoben und jede Einstellung in Deutsch beschrieben (ansonsten ist alles in Englisch gehalten). Sogar Laien haben also eine faire Chance die Demonstration auf ihrem PC auszuführen.</p>
<p>Viel Spaß damit!
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-483-1'>Einen Beweis bleibe ich vorerst schuldig. Allerdings ist O(n²) naheliegend, weil der wesentliche Aufwand darin besteht während des Faltens (Phase 1) immer und immer wieder den nächsten Nachbarn zu einer Stadt zu finden. Dort sehe ich übrigens auch schon die ersten vielversprechenden Verbesserungsmöglichkeiten mittels geschickter Partitionierung der Städte (mehr dazu unter &#8220;Verbesserungsmöglichkeiten&#8221;). <span class='footnotereverse'><a href="#fnref-483-1" class="liinternal">&#8617;</a></span></li>
<li id='fn-483-2'>Der Faktor berechnet sich als &lt;RFA-Lösung&gt; / &lt;Optimale-Lösung&gt; und gibt somit die relative Länge der RFA-Lösung zur Länge der optimalen Lösung an. <span class='footnotereverse'><a href="#fnref-483-2" class="liinternal">&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2010/01/14/rfa-ein-rekursiver-algorithmus-fur-das-metrische-traveling-salesman-problem/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>My brute&#8230;</title>
		<link>http://www.robertnitsch.de/2009/07/02/my-brute/</link>
		<comments>http://www.robertnitsch.de/2009/07/02/my-brute/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 13:12:51 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Lustiges]]></category>
		<category><![CDATA[Spiele]]></category>

		<guid isPermaLink="false">http://www.robertnitsch.de/?p=273</guid>
		<description><![CDATA[&#8230;ist das beste Diebspiel überhaupt. Sehr unterhaltsam. Also, denkt euch einen lustigen Namen aus, kämpft gegen mich und ladet auch eure Freunde ein! Traut ihr euch?]]></description>
			<content:encoded><![CDATA[<p>&#8230;ist das beste Diebspiel überhaupt. Sehr unterhaltsam.<br />
Also, denkt euch einen lustigen Namen aus, kämpft gegen mich und ladet auch eure Freunde ein!</p>
<p align="center"><a href="http://der-echte-bmaker.mybrute.com/" style="font-size:28pt; font-weight: bold;" title="In den Kampf" class="liimagelink">Traut ihr euch? <img src='http://www.robertnitsch.de/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2009/07/02/my-brute/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Meine Abrechnung mit Linux</title>
		<link>http://www.robertnitsch.de/2009/01/09/meine-abrechnung-mit-linux/</link>
		<comments>http://www.robertnitsch.de/2009/01/09/meine-abrechnung-mit-linux/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 16:35:34 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Erfahrungsberichte]]></category>
		<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Kubuntu]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PC]]></category>

		<guid isPermaLink="false">http://www.robertnitsch.de/?p=174</guid>
		<description><![CDATA[&#8220;Linux ist das größte, das schnellste, das schönste, das sicherste und das beste!&#8221; Dies ist die kurze Fassung dessen, was viele vermeintliche Computerexperten bei fast jeder Gelegenheit predigen. Ich bin zuerst selbst darauf reingefallen und bin Anfang 2006 von Windows auf Ubuntu (eine Linux-Distribution) umgestiegen. Windows war von da an etwa 1 Jahr lang nur [...]]]></description>
			<content:encoded><![CDATA[<p><strong>&#8220;Linux ist das größte, das schnellste, das schönste, das sicherste und das beste!&#8221;</strong></p>
<p>Dies ist die kurze Fassung dessen, was viele vermeintliche Computerexperten bei fast jeder Gelegenheit predigen. Ich bin zuerst selbst darauf reingefallen und bin Anfang 2006 von Windows auf Ubuntu (eine Linux-Distribution) umgestiegen. Windows war von da an etwa 1 Jahr lang nur noch ein Zweitsystem zum Spielen.</p>
<p><em>Hinweis:</em> Diese Abrechnung bezieht sich ausschließlich auf Linux-Systeme, die auf (privaten) Workstations ihren Einsatz finden! Auf Servern ist Linux meiner Meinung die erste Wahl (auch wenn meine Kritik teilweise auch auf &#8220;Server-Linuxe&#8221; übertragen werden kann)!</p>
<h3>Behauptung: Linux ist ein <em>grauenvolles</em> Frickelsystem</h3>
<p>Irgendwann gab meine Festplatte den Geist auf und ich musste das System komplett neu aufsetzen. Dazu hatte ich dann aber keine Lust mehr, weil Linux schier unendlich viel Zeit gefressen hatte, bis es vollständig eingerichtet war und alles so lief, wie es sollte. Das ist auch heute noch mein Hauptkritikpunkt: <strong>Linux ist ein <em>grauenvolles</em> Frickelsystem</strong>. Auch Ubuntu ist da nicht anders, obwohl es überall heißt, dass es ja ach so benutzerfreundlich wäre.</p>
<p>Die Betonung liegt auf <em>grauenvoll</em>, weil es nicht nur ein Frickelsystem ist, sondern eben auch noch ein <strong>besonders schlimmes bzw. schlecht gemachtes Frickelsystem</strong>. Damit meine ich vor allem, dass die Konfigurationsdateien (in denen z.B. das Verhalten der Programme festgelegt wird) aller größeren Programme/Daemons sich bezüglich ihres Formats/ihrer Syntax voneinander unterscheiden. Jedes dieser Programme muss demzufolge auch selbst &#8211; auf eigene Faust &#8211; seine Konfigurationsdateien auslesen, was eine gewaltige Fehlerquelle darstellt. Und wer bitte schön hatte zum Beispiel bei Linux noch nie das Problem, dass eine Konfigurationsdatei laut offizieller Anleitung/Dokumentation korrekt ist, aber irgendwie doch nicht funktioniert? Eben, das tritt nämlich fast immer auf. Manchmal steckt dahinter auch ein Fehler, den man selbst zu verantworten hat. Das ist aber letztendlich in den meistne Fällen nur eine Folge der viel zu komplizierten Konfigurationsdateien (Syntax zu komplex, zu wenig fehlertolerant etc.).</p>
<p>Wie man es besser machen könnte? Da, wo es angemessen und praktikabel ist, ein einheitliches Format einführen (für dieses Format muss dann auch nur 1x Code geschrieben werden => zentral => bessere Wartbarkeit und weniger Bugs). Beispielsweise eines wie das <strong>in</strong>tuitive <strong>IN</strong>I-Format (oder ein ähnliches):</p>
<blockquote><p>[SEKTION]<br />
name=wert<br />
name2=anderer_wert</p></blockquote>
<p>Größere Daemons, die tatsächlich noch mehr brauchen, dürfen gerne auch komplexere Formate für ihre Konfigurationsdateien definieren. Aber bitte, ihr Linux-Freaks, gebt nicht mehr jedem Kleinst-Daemon sein eigenes verdammtes Konfigurationsformat!<br />
Das führt nämlich dazu, dass man für jede etwas größere Konfigurationsänderung Manuals, Tutorials und Internetforen durchkämmen muss, bis es dann &#8211; meist nach Stunden &#8211; endlich klappt.</p>
<h3>Kritik: Linux gebe dem Anwender sehr viel mehr &#8220;Macht&#8221; als Windows</h3>
<p>Ein PRO-Argument für Linux lautet, dass man unter Linux &#8211; durch den berüchtigten root-Account &#8211; sehr viel mehr Einfluß auf sein System hat. Man kann sehr viel genauer bestimmen, was es macht und wie es das macht.<br />
Das stimmt auch. Allerdings werte ich das größtenteils nicht als Vorteil:</p>
<ol>
<li>Linux ist ein Frickelsystem (siehe oben) und man kann von dem root-Account nicht profitieren ohne sich zunächst (in jeder Angelegenheit aufs Neue) in komplizierte Details einzuarbeiten.</li>
<li>Es gibt nur ganz wenige Fälle in denen man unter Linux etwas machen kann, was unter Windows nicht auch (mit geringerem Aufwand) so oder so ähnlich möglich wäre. Das sind dann meistens auch nur Spielereien, auf die man auch gut und gerne ganz verzichten kann.</li>
</ol>
<p>Es gibt natürlich Momente in denen man vom mächtigen root-Account profitiert. Aber auch hier muss man sich erst mühsam in Details einarbeiten.</p>
<p>Absolut vernachlässigt werden bei Linux Benutzer, die entweder nicht oder kaum dazu in der Lage (wg. zu hohem Alter o.ä.) sind oder keine Lust darauf haben, sich so (unangemessen) viel Fachwissen anzueignen. Das äußert sich darin, dass vieles unter Linux nicht anders zu meistern ist als durch einen Umweg über die Konsole (Shell). Dann tippt man mehr oder weniger viele Befehle ein, die jeweils eine eigenen &#8220;Befehlssatz&#8221; aufweisen und man hat erreicht, was man erreichen wollte (zum Beispiel das Killen eines Programms). Es gibt zwar immer wieder Ansätze &#8211; gerade für Windows-Abwanderer &#8211; sich an Windows anzunähern, z.B. durch das Bereitstellen von Programmen, die Windows-Programmen ähnlich sehen (Taskmanager und ähnliches). Meine Erfahrung ist aber, dass diese Programme extrem unzuverlässig sind. Der Schwerpunkt wird bei Linux nunmal nach wie vor auf die Konsolenprogramme gelegt.</p>
<h3>Kritik: Linux hat viele Probleme mit Hardware</h3>
<p>Ob es daran liegt, dass die Hersteller keine Treiber bereitstellen oder nicht&#8230; es ist mir letztlich egal, was die Ursachen dafür sind und wer daran Schuld ist. Am Ende kommt es doch nur darauf an, was ein System kann und was es nicht kann. Und dazu gehört auch die (schnellstmögliche) Erkennung und Nutzung von neuer Hardware. Hier kommt Linux gar nicht gut weg.</p>
<p>Windows ist hier jedoch &#8211; wegen seiner Marktführerschaft &#8211; ganz klar an der Spitze. Man schließt die neue Hardware einfach an und meistens ist sie innerhalb weniger Sekunden voll einsatzbereit. Unter Linux muss man stattdessen häufig auf irgendwelche Arten improvisieren &#8211; das schließt meist auch wieder das Anlegen/Anpassen komplizierter Konfigurationsdateien ein -, um Hardware zu nutzen, die nicht auf Anhieb erkannt werden kann (und davon gibt es nicht wenig).</p>
<p>Das ist auch ein Punkt, der mich schließlich dazu bewegt hat, wieder zu Windows zurückzuwechseln. Unabhängig davon, ob es in der Macht der Linux-Entwickler steht, an der Hardware-Erkennung etwas wesentlich zu verbessern oder (mangels fehlender Kooperation der Hardware-Hersteller) nicht.</p>
<h3>Widerspruch: Windows sei unsicher(er als Linux)</h3>
<p>Ich kann mich nicht daran erinnern, wann ich mit Windows das letzte Mal Probleme mit Viren/Trojanern/Würmern o.ä. hatte. Zugegeben, ich habe zu XP-Zeiten zum Surfen und normalen Arbeiten ein eingeschränktes Benutzerkonto verwendet. Mein System so einzurichten hat mich aber nur ein paar Minuten Zeit gekostet&#8230;<br />
Natürlich hatte ich auch eine Firewall und ein Antiviren-Programm installiert. Das ist aber auch Pflicht bei Windows: Es ist schließlich das mit großem Abstand am weitesten verbreitete System.</p>
<p>Ich kann mich übrigens genausowenig daran erinnern, wann mein Windows das letzte Mal abgestürzt ist&#8230;</p>
<h3>Ein paar Worte zu Windows Vista</h3>
<p>Ich nutze Vista erst seit wenigen Tagen, aber mein erster Eindruck ist, dass es ein sehr mächtiges und modernes Betriebssystem ist. Viele Dialoge und v.a. die Navigation wurden im Vergleich zu Windows XP aufgebessert. Leider wird Windows Vista in einem sehr besch&#8230; Konfigurationszustand ausgeliefert. So frisst zum Beispiel die Systemwiederherstellung unglaublich viel Leistung; nachdem ich sie deaktiviert habe, läuft mein System viel flüssiger. Außerdem habe ich mit Hilfe von Tuneup Utilities viele unnötige Dienste deaktiviert oder &#8220;gedrosselt&#8221;.<br />
Zugegeben: Im &#8220;Auslieferungszustand&#8221; ist Vista <strong>unerträglich</strong> (meiner Meinung nach). Man kann aber auch dieses Windows innerhalb weniger Stunden in ein schnelles, sparsames und modernes System umwandeln. Dazu braucht es unter Windows auch keine komplizierten Konfigurationsdateien&#8230;</p>
<h3>Schlusswort</h3>
<p>Mir ist klar, dass die Mehrheit der &#8220;Experten&#8221; anderer Meinung ist. Diese Mehrheit ist auch dazu aufgerufen mir zu widersprechen und mich zu widerlegen. Letztlich ist es aber immer eine subjektive Entscheidung, wenn es darum geht, welches Betriebssystem man lieber verwendet. Daher habe ich mich in diesem Artikel auf die Aspekte konzentriert, die m.E. ganz objektive Schwächen von Linux darstellen oder Falschaussagen über Windows sind.</p>
<p>Bevor man mit mir eine Diskussion darüber anfängt, sollte man sich aber bitte einmal ehrlich fragen, wie viel Zeit man mit dem Konfigurieren seines Linux-Systems verbracht hat und wie viel Zeit unter Windows für die Konfiguration aufgewendet werden musste und was letztlich weniger nervenaufreibend war. Es sollte ja klar sein, was meine persönliche Antwort darauf ist&#8230;</p>
<p>Bitte &#8211; liebe Linux-Anhänger &#8211; zerreißt mich nicht gleich in der Luft sondern versucht erst einmal ungefähr zu verstehen, was mir an Linux stinkt&#8230;</p>
<p>Auch ich bin dankbar dafür, dass es so viele kluge Menschen gibt, die unentgeltlich sehr viel Arbeit in ein kostenloses &#8211; sogar quelloffenes &#8211; Betriebssystem stecken. Mit diesem Beitrag möchte ich aber unter anderem auch aufzeigen, dass Linux keineswegs perfekt ist und dass man den einfachen Leuten, die sich nicht so sehr auskennen, besser vermitteln muss, auf was sie sich mit Linux einlassen, wenn sie sich dafür entscheiden. Momentan gebärdet sich die Linux-Gemeinde aber eher so, wie eingangs erwähnt: <strong>&#8220;Linux ist das größte, das schnellste, das schönste, das sicherste und das beste!&#8221;</strong> Dazu kommen natürlich noch viele Seitenhiebe gegen Microsoft/Windows. Gegen dieses Gehabe wendet sich mein Artikel in erster Linie&#8230; von einem Betriebssystem, das so gefeiert wird, habe ich schlicht und ergreifend mehr erwartet, als mir letzlich geboten wurde.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2009/01/09/meine-abrechnung-mit-linux/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Motivationskurve beim Erlernen einer Programmiersprache</title>
		<link>http://www.robertnitsch.de/2008/09/19/motivationskurve-beim-erlernen-einer-programmiersprache/</link>
		<comments>http://www.robertnitsch.de/2008/09/19/motivationskurve-beim-erlernen-einer-programmiersprache/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 15:31:36 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Lustiges]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[Programmieren]]></category>

		<guid isPermaLink="false">http://www.robertnitsch.de/?p=115</guid>
		<description><![CDATA[Peter Kroener hat eine geniale Grafik / Motivationskurve veröffentlicht, die die Motivation beim Erlernen einer neuen Programmiersprache beschreibt. Ich musste herzhaft lachen, weil mich die Kurve so sehr an meine eigenen Erfahrungen erinnert.]]></description>
			<content:encoded><![CDATA[<p>Peter Kroener hat eine <a href="http://www.peterkroener.de/die-neue-programmiersprache-lernen/" class="liexternal">geniale Grafik / Motivationskurve veröffentlicht</a>, die die Motivation beim Erlernen einer neuen Programmiersprache beschreibt. Ich musste herzhaft lachen, weil mich die Kurve so sehr an meine eigenen Erfahrungen erinnert. <img src='http://www.robertnitsch.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><img style="margin-left:20px;" src="http://www.peterkroener.de/wp-content/uploads/2008/08/die-neue-programmiersprache-lernen-359x477.png" alt="Motivationskurve" border="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2008/09/19/motivationskurve-beim-erlernen-einer-programmiersprache/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Veröffentlichung der Lernleistung</title>
		<link>http://www.robertnitsch.de/2008/07/07/veroffentlichung-der-lernleistung/</link>
		<comments>http://www.robertnitsch.de/2008/07/07/veroffentlichung-der-lernleistung/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 10:46:10 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Mathematik]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Real Life]]></category>
		<category><![CDATA[Schule]]></category>

		<guid isPermaLink="false">http://www.robertnitsch.de/?p=99</guid>
		<description><![CDATA[Ich habe nun endlich meine Lernleistung veröffentlicht. Das Ganze hat sich wegen eines Festplattenfehlers verzögert. Außerdem fehlen nun einige ergänzende Texte, die ich speziell für die Veröffentlichung erstellt hatte. Jetzt muss erstmal das reichen, was in den Backups zu finden war, auch wenn es nun teilweise besonders schwer verdaulich ist.]]></description>
			<content:encoded><![CDATA[<p>Ich habe nun endlich <a href="http://www.robertnitsch.de/projekte/lernleistung/" class="liinternal">meine Lernleistung veröffentlicht</a>.<br />
Das Ganze hat sich wegen eines Festplattenfehlers verzögert. Außerdem fehlen nun einige ergänzende Texte, die ich speziell für die Veröffentlichung erstellt hatte. Jetzt muss erstmal das reichen, was in den Backups zu finden war, auch wenn es nun teilweise besonders schwer verdaulich ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2008/07/07/veroffentlichung-der-lernleistung/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ideenklau 2.0</title>
		<link>http://www.robertnitsch.de/2008/05/19/ideenklau-20/</link>
		<comments>http://www.robertnitsch.de/2008/05/19/ideenklau-20/#comments</comments>
		<pubDate>Mon, 19 May 2008 11:37:49 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Real Life]]></category>

		<guid isPermaLink="false">http://www.robertnitsch.de/?p=93</guid>
		<description><![CDATA[Ich musste kürzlich mit Erstaunen feststellen, dass ich innerhalb kurzer Zeit zum wiederholten Male nicht der erste war, dem eine mehr oder weniger geniale Idee zugeflogen ist. Durch Zufall bin ich nämlich auf OpenID gestoßen, ein Single Sign-on-System, das ziemlich genau einem System entspricht, an dessen Entwicklung ich selbst schon gearbeitet habe und das dasselbe [...]]]></description>
			<content:encoded><![CDATA[<p>Ich musste kürzlich mit Erstaunen feststellen, dass ich innerhalb kurzer Zeit zum wiederholten Male nicht der erste war, dem eine mehr oder weniger geniale Idee zugeflogen ist.</p>
<p>Durch Zufall bin ich nämlich auf <a href="http://de.wikipedia.org/wiki/OpenID" rel="nofollow" class="liwikipedia">OpenID</a> gestoßen, ein <a href="http://de.wikipedia.org/wiki/Single_Sign-On" rel="nofollow" class="liwikipedia">Single Sign-on</a>-System, das ziemlich genau einem System entspricht, an dessen Entwicklung ich selbst schon gearbeitet habe und das dasselbe Ziel hat: Das Problem der vielen Accounts/Logins auf etlichen verschiedenen Webseiten zu lösen&#8230;</p>
<p>Das würde mich ja gar nicht stören (bis auf die Arbeit, die ja jetzt quasi umsonst war, weil der OpenID-Standard sich offenbar bereits durchgesetzt hat), wenn da nicht noch dieser andere Vorfall wäre:<br />
Als ich vor kurzem eine Variante des <a href="http://de.wikipedia.org/wiki/Transportproblem" rel="nofollow" class="liwikipedia">Transportproblems</a> lösen musste, ist mir ein schier genialer Algorithmus eingefallen, der bereits verdammt gute Näherungslösungen und in den meisten Fällen sogar optimale Ergebnisse lieferte. Damals wusste ich gar nicht, dass das Problem in der Wissenschaft bereits abgehandelt wurde und ich wusste auch nicht, dass es &#8220;Transportproblem&#8221; genannt wird. Aber es handelt sich in der Tat um eine <em>Variante</em> des eigentlichen Problems (für die, die es interessiert: eine Lagerstätte/Quelle kann bei dieser Variante immer nur genau <strong>eine</strong> Ware liefern und somit nur <strong>einen</strong> Bedarf decken). Dennoch: Der Algorithmus, den ich entwickelt habe, entspricht der <a href="http://de.wikipedia.org/wiki/Vogelsche_Approximationsmethode" rel="nofollow" class="liwikipedia"><em>Vogelschen Approximationsmethode</em></a>&#8230; der Ansatz, der dahinter steckt, den gibt es also schon länger. <img src='http://www.robertnitsch.de/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> </p>
<p>Fazit: Ich lebe in der falschen Zeit! (Kommt mir auch aus ganz anderen Gründen häufig so vor.)<br />
PS: Den Titel bitte nicht falsch verstehen, ich käme im Leben nicht darauf, irgendwem vorzuwerfen, er hätte mir meine Idee geklaut, nur weil er sie vor mir hatte! Das ist eigentlich eine Selbstverständlichkeit, aber hier lesen ja immer noch Juristen mit und da erkläre ich es lieber nochmal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2008/05/19/ideenklau-20/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Besondere Lernleistung: Evolutionäre Algorithmen und das Traveling-Salesman-Problem</title>
		<link>http://www.robertnitsch.de/2008/01/06/besondere-lernleistung-evolutionare-algorithmen-und-das-traveling-salesman-problem/</link>
		<comments>http://www.robertnitsch.de/2008/01/06/besondere-lernleistung-evolutionare-algorithmen-und-das-traveling-salesman-problem/#comments</comments>
		<pubDate>Sat, 05 Jan 2008 23:11:51 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Real Life]]></category>
		<category><![CDATA[Schule]]></category>

		<guid isPermaLink="false">http://www.robertnitsch.de/2008/01/06/besondere-lernleistung-evolutionare-algorithmen-und-das-travelling-salesman-problem/</guid>
		<description><![CDATA[Das offizielle Thema meiner besonderen Lernleistung lautet &#8220;Spieltheorie&#8221; mit Schwerpunkt auf &#8220;evolutionären Algorithmen&#8221;. Ich bringe die Lernleistung zusammen mit einem Freund als Ersatz für das 5. Prüfungsfach ins Abitur, das ich dieses Jahr mache, ein. Der Freund hat natürlich einen anderen thematischen Schwerpunkt, das Hauptthema (Spieltheorie) ist jedoch dasselbe. Für das sogenannte Traveling-Salesman-Problem soll ich [...]]]></description>
			<content:encoded><![CDATA[<p>Das offizielle Thema meiner besonderen Lernleistung lautet &#8220;Spieltheorie&#8221; mit Schwerpunkt auf &#8220;evolutionären Algorithmen&#8221;. Ich bringe die Lernleistung zusammen mit einem Freund als Ersatz für das 5. Prüfungsfach ins Abitur, das ich dieses Jahr mache, ein. Der Freund hat natürlich einen anderen thematischen Schwerpunkt, das Hauptthema (Spieltheorie) ist jedoch dasselbe. <img src='http://www.robertnitsch.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Für das sogenannte <em>Traveling-Salesman-Problem</em> soll ich außerdem im Rahmen dieser Lernleistung einen evolutionären Algorithmus schaffen.</p>
<h3>Das Traveling-Salesman-Problem</h3>
<p>Das <em>Traveling-Salesman-Problem</em> (TSP) ist einfach formuliert: Ein Handlungsreisender muss <em>n</em> Städte besuchen und am Ende zu seinem Ausgangsort zurückkehren. Gesucht ist die kürzeste Rundreise.</p>
<p>Viele schlaue und dumme Menschen haben sich auf der Suche nach einem effizienten Algorithmus jahrzehntelang den Kopf darüber zerbrochen. Einen Ansatz stellen die sogenannten evolutionären Algorithmen dar, die die <a href="http://de.wikipedia.org/wiki/Evolution" rel="nofollow" class="liwikipedia">Evolution</a> als Vorbild haben.</p>
<h3>Was ist ein evolutionärer Algorithmus?</h3>
<p>Zitat <a href="http://de.wikipedia.org/wiki/Evolution%C3%A4rer_Algorithmus" rel="nofollow" class="liwikipedia">Wikipedia</a>:</p>
<blockquote><p>&#8220;Ein Evolutionärer Algorithmus (EA) ist ein Optimierungsverfahren, das als Vorbild die biologische Evolution hat.&#8221;</p></blockquote>
<p>Prinzipiell prozessiert ein evolutionärer Algorithmus eine <em>Population</em> mit <em>n</em> <em>Individuen</em> nach dem Vorbild der Evolution: <em>&#8220;survival of the fittest&#8221;</em>. Jedes Individuum stellt eine mögliche Lösung des jeweiligen Problems dar. Im Falle des TSP entspricht also jedes Individuum einer möglichen Rundreise.</p>
<p>Im Laufe des Algorithmus pflanzen sich außerdem je zwei Individuen fort und erzeugen ein Kind-Individuum nach Vorbild der Natur mittels <a href="http://de.wikipedia.org/wiki/Rekombination" rel="nofollow" class="liwikipedia">Rekombination</a>. Zusätzlich finden &#8211; ebenfalls nach Vorbild der Natur &#8211; mit einer bestimmten Wahrscheinlichkeit <a href="http://de.wikipedia.org/wiki/Mutation" rel="nofollow" class="liwikipedia">Mutationen</a> statt, also z.B. (normalerweise) zufällige Veränderungen der Route.</p>
<p>Jeder Durchlauf eines evolutionären Algorithmus&#8217; sieht also mehr oder weniger so aus:</p>
<ul>
<li>Entferne <em>x</em> Individuen aus der Population. (Zum Beispiel die beiden schlechtesten Routen.)</li>
<li>Rekombiniere <em>x</em>-Mal zwei Individuen aus der Population. (Zum Beispiel die beiden besten Routen.)</li>
<li>Wende mit einer bestimmten Wahrscheinlichkeit eine Mutation auf die Individuen an. (Zum Beispiel mit einer Wahrscheinlichkeit von 15%.)</li>
<li>Wenn die maximale Anzahl von Durchläufen (Generationen) erreicht ist, beende den Vorgang, ansonsten starte einen neuen Durchlauf.</li>
</ul>
<p>Die Güte bzw. Qualität eines evolutionären Algorithmus hängt vor allem von folgenden Faktoren ab:</p>
<ul>
<li>Populationsgröße</li>
<li>Rekombinationsmethode</li>
<li>Mutationsmethode</li>
<li>Mutationswahrscheinlichkeit</li>
<li>&#8230;</li>
</ul>
<h3>Ein evolutionärer Algorithmus für das Travelling-Salesman-Problem</h3>
<p>Wie oben gesagt ist es meine Aufgabe für das TSP einen evolutionären Algorithmus zu programmieren. Als Programmiersprache habe ich mich für <a href="http://python.org/" class="liexternal">Python</a> und als Entwicklungsumgebung für <a href="http://www.eclipse.org" class="liexternal">eclipse</a> mit <a href="http://pydev.sourceforge.net/" class="liexternal">PyDev</a> entschieden. (Damit lässt sich super arbeiten!)<br />
Mit der Arbeit am evolutionären Algorithmus habe ich heute begonnen, und ich muss sagen: Ich bin bereits jetzt sehr zufrieden. Da die Güte des evolutionären Algorithmus &#8211; siehe oben &#8211; von vielen Faktoren abhängt, habe ich mich für eine Umsetzung entschieden, bei der ich all diese Faktoren leicht ändern kann.</p>
<p>Das ist mir ganz gut gelungen: Alle Parameter und Komponenten des evolutionären Algorithmus sind ganz einfach austauschbar. (Leider werde ich bis zum Erhalt meines Abiturs keine Quelltexte veröffentlichen. Der menschlichen Dummheit sind einfach keine Grenzen gesetzt und ich könnte mir vorstellen, dass man mir vorwirft, meine Arbeit aus dem Internet von einem &#8220;Robert Nitsch&#8221; kopiert zu haben.)</p>
<p>Nun folgt der schwierigste, aber wohl auch spannendste Teil meiner besonderen Lernleistung. Ich werde prüfen welche Parameter den besten evolutionären Algorithmus ausmachen und verschiedene Konfigurationen miteinander vergleichen. Natürlich wird auch eine Begründung nicht fehlen &#8211; also warum Konfiguration A besser ist als Konfiguration B.</p>
<p>Meine Arbeit und meine Ergebnisse muss ich abschließend in einem Skript dokumentieren und in einer Präsentation vorstellen. Meine Ergebnisse werde ich natürlich auch hier auf meiner Homepage festhalten, damit Schüler, die eine ähnliche Lernleistung erbringen, davon vielleicht profitieren können.</p>
<p>Für Tipps und Ratschläge bezüglich meiner besonderen Lernleistung bin ich natürlich jederzeit offen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2008/01/06/besondere-lernleistung-evolutionare-algorithmen-und-das-traveling-salesman-problem/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Which programming language are you?</title>
		<link>http://www.robertnitsch.de/2007/05/13/which-programming-language-are-you/</link>
		<comments>http://www.robertnitsch.de/2007/05/13/which-programming-language-are-you/#comments</comments>
		<pubDate>Sun, 13 May 2007 12:14:56 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PC]]></category>

		<guid isPermaLink="false">http://robertnitsch.de/2007/05/13/which-programming-language-are-you/</guid>
		<description><![CDATA[Which Programming Language are You? Dieser Test wird mir sogar gerecht: mit PHP arbeite ich im Moment am meisten. Vor allem an DS OBST: http://obst-ab.sf.net.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.bbspot.com/News/2006/08/language_quiz.php"><img src="http://www.bbspot.com/Images/News_Features/2006/08/language/php.jpg" width="300" height="90" border="0" alt="You are PHP." /><br />
Which Programming Language are You?</a></p>
<p>Dieser Test wird mir sogar gerecht: mit PHP arbeite ich im Moment am meisten. Vor allem an <strong>DS OBST</strong>: <a href="http://obst-ab.sf.net" class="liexternal">http://obst-ab.sf.net</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2007/05/13/which-programming-language-are-you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;HackIts&#8221;</title>
		<link>http://www.robertnitsch.de/2007/01/04/hackits/</link>
		<comments>http://www.robertnitsch.de/2007/01/04/hackits/#comments</comments>
		<pubDate>Thu, 04 Jan 2007 11:53:14 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Freaky]]></category>
		<category><![CDATA[PC]]></category>

		<guid isPermaLink="false">http://robertnitsch.de/2007/01/04/hackits/</guid>
		<description><![CDATA[Heute möchte ich den sogenannten HackIts einen Artikel widmen. Bei solchen HackIts, die üblicherweise in Form von Webseiten erstellt werden, geht es darum sich durch eine bestimmte Anzahl von Leveln bzw. Stufen zu &#8220;hacken&#8221;. Der Begriff &#8220;hacken&#8221; ist aber insofern unabgebracht als dass es meistens wenig mit &#8220;Hacken&#8221; zu tun hat &#8211; mal abgesehen davon, [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich den sogenannten HackIts einen Artikel widmen. Bei solchen HackIts, die üblicherweise in Form von Webseiten erstellt werden, geht es darum sich durch eine bestimmte Anzahl von Leveln bzw. Stufen zu &#8220;hacken&#8221;. Der Begriff &#8220;hacken&#8221; ist aber insofern unabgebracht als dass es meistens wenig mit &#8220;Hacken&#8221; zu tun hat &#8211; mal abgesehen davon, dass Hacken sowieso eine ganz andere Bedeutung hat als uns die Medienwelt weiß machen will. Eine sehr gute und ausführliche Definition des Begriffs &#8220;Hacker&#8221; findet ihr hier: <a href="http://wiki.hackerboard.de/index.php/Hacker" title="Definition des Hackers - sehr empfehlenswert" class="liexternal">http://wiki.hackerboard.de/index.php/Hacker</a></p>
<p>Die Wikipedia beschreibt Hackits übrigens folgendermaßen:</p>
<blockquote><p>Eine <strong>Hacking Challenge</strong> (englisch: ‚Herausforderung zum <a href="http://de.wikipedia.org/wiki/Hacker" title="Hacker" rel="nofollow" class="liwikipedia">Hacken</a>‘) oder ein <strong>Hackit</strong> (englisch: ‚Knack es‘) ist eine Aufgabe oder in der Regel eine Abfolge von Aufgaben aus dem Bereich des Hackens, meist geht es um das Eindringen in speziell     dafür bereit gestellte passwortgeschützte Bereiche. Solche Aufgaben werden auf speziellen Webseiten für Menschen angeboten, die sich für Computersicherheit interessieren und fördern die spielerische und sportliche Auseinandersetzung mit diesem Themenbereich.</p></blockquote>
<p>(Quelle: <a href="http://de.wikipedia.org/wiki/Hackit" title="Hackit auf der Wikipedia" rel="nofollow" class="liwikipedia">http://de.wikipedia.org/wiki/Hackit</a>, Stand: 04.01.2007)</p>
<p>Nachdem euch jetzt hoffentlich grob bewusst geworden ist, worum es bei einem HackIt geht, möchte ich euch ein gutes Beispiel für ein HackIt geben. Das HackIt, von dem ich rede, heisst &#8220;InfoGamE&#8221; und ihr könnt es unter <a href="http://ighack.info" title="InfoGamE - Hackit" class="liexternal">http://ighack.info</a> erreichen. Wie man auf der Rangliste sieht habe ich das HackIt mit seinen insgesamt 20 Leveln erfolgreich absolviert (mein Nickname dort ist &#8220;bmaker&#8221;). Das hat aber &#8211; zugegeben &#8211; gute 4 Wochen gedauert. Ich glaube sogar es war etwas mehr &#8230;</p>
<p>Das InfoGamE ist in jedem Fall ein ganz typisches HackIt. Das erkennt man daran, dass vor allem die ersten und leichteren Levels viel mit Javascript zu tun haben. Man kommt also oft nur dann in das nächste Level, wenn man das Javascript versteht und das Passwort ermitteln kann. Beim InfoGamE kommt jedoch erschwerend hinzu, dass man oft sehr lange rätseln muss und manchmal dauert es Stunden oder sogar mehrere Tage bis man mit Google zu einem Hinweis gekommen ist. Aber gerade das macht auch einen gewissen Reiz aus. Am allerschönsten wird es, wenn man das HackIt gemeinsam mit Freunden durchspielt. Leider war mir &#8220;nur&#8221; der Wettbewerb mit flüchtigen Internetbekanntschaften vergönnt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.robertnitsch.de/2007/01/04/hackits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
