Simulated Annealing ist eine Optimierungsmethode, die von natürlichen Kristallisationsprozessen inspiriert ist. Man startet in der Schmelze bei hohen Temperaturen und lässt es dann abkühlen, sodass die Atome sich in einem Zustand minimaler Energie anordnen, dem Kristallgitter. Wenn man also für ein Optimierungsproblem die zu optimierende Größe als Energie ansieht, und man eine Lösung durch eine kleine Änderung in eine andere Lösung verwandeln kann, kann man mit dieser Methode eine Näherung für das Optimum finden.
Wenn wir also eine Sequenz von Zahlen sortieren wollen, können wir die Summe der Differenzen zwischen benachbarten Zahlen als Energie betrachten, denn die ist minimal in einer sortierten Liste. Um eine Lösung in eine andere zu verwandeln, reicht eine Permutation.
Genug der Theorie: Hier präsentiere ich ein schnell terminierendes Sortierprogramm, das zwar nicht immer eine sortierte Liste findet, aber zumindest eine Näherung! Es ist also Bogosort in mehr als nur einer Hinsicht überlegen!
Wer braucht da noch O(n log(n)) Sortier-Algorithmen?!
Samstag, 14. Juni 2014
Samstag, 10. Mai 2014
Munin
Weil bunte Diagramme das beste auf der Welt sind, ist Munin mein neuer lieblings-Daemon: man konfiguriert ihn einmal kurz und er zeichnet alle 5 Minuten hunderte Diagramme über alle Vitalfunktionen seines Hosts.
Hier besonders schön: ein Kopiervorgang. Die Festplatte wird von außen nach innen beschrieben; weil sie sich außen schneller dreht, ist die Schreibgeschwindigkeit anfangs höher.
Oder auch immer hübsch: "Fieberkurven" der Festplatten. Die externe wird offenbar schlecht gekühlt. Die Lücken entstehen übrigens sobald eine Festplatte in den Standby wechselt.
Zum Schluss noch was klassisches: CPU Benutzung. Das Kopieren ist natürlich nicht durch die CPU begrenzt.
Hier besonders schön: ein Kopiervorgang. Die Festplatte wird von außen nach innen beschrieben; weil sie sich außen schneller dreht, ist die Schreibgeschwindigkeit anfangs höher.
Oder auch immer hübsch: "Fieberkurven" der Festplatten. Die externe wird offenbar schlecht gekühlt. Die Lücken entstehen übrigens sobald eine Festplatte in den Standby wechselt.
Donnerstag, 1. Mai 2014
Compiler Benchmark
Ich habe eine kleine Sammlung selbst implementierter Kryptographie, wie ich im letzten Post schon angedeutet habe. Was kann man nun mit kaum/gar nicht optimierten krypto-Funktionen anfangen? Man kann sie natürlich benutzen, um die Daten, die man mit eigenen Programmen verwaltet, zu verschlüsseln. Aber noch viel besser kann man optimierende Compiler darauf los lassen und sehen, welcher am besten optimiert.
Hier sind also meine Messdaten. Grün ist Linux, Blau ist Windows.
Als Compiler Option habe ich jeweils nur -O3 (oder vergleichbar) übergeben. Das schlechte Abschneiden des Microsoft Compilers liegt übrigens daran, dass er Sonderwünsche betreffend der AES-NI Befehle hatte, weshalb dort der reine-Software-Zweig gemessen wurde. Messwerte für den Linux 32 Bit Intel Compiler fehlen, da die Installation scheinbar schief gegangen ist und 32 Bit auf Linux meiner Meinung nach nur eine sehr untergeordnete Rolle spielt.
Besonderes Augenmerk sollte übrigens auf die Unterschiede zwischen 32 und 64 Bit gelegt werden. Nehmt das ihr Leute die glauben, dass 64 Bit nur wegen des RAM gut sei ;) Zugegebenermaßen arbeiten Threefish sowie SHA512 mit 64 Bit breiten Worten, die auf einem 64 Bit Betriebssystem mindestens doppelt so schnell verarbeitet werden können.
Es ist auf jeden Fall interessant zu sehen, dass verschiedene Compiler verschiedene Warnungen ausgeben -- und dass der Microsoft Compiler bis 2012 scheinbar noch nichts vom c99 Standard wusste.
Außerdem sind die farbigen Ausgaben von clang und seine statische Code Analyse sehenswert.
Den höchsten Komfort bietet meiner Meinung nach gcc, der dank MinGW-w64 auch unter Linux für Windows kompiliert -- und dabei Code erzeugt, der in diesem Test sehr konkurrenzfähig ist.
Hier sind also meine Messdaten. Grün ist Linux, Blau ist Windows.
Als Compiler Option habe ich jeweils nur -O3 (oder vergleichbar) übergeben. Das schlechte Abschneiden des Microsoft Compilers liegt übrigens daran, dass er Sonderwünsche betreffend der AES-NI Befehle hatte, weshalb dort der reine-Software-Zweig gemessen wurde. Messwerte für den Linux 32 Bit Intel Compiler fehlen, da die Installation scheinbar schief gegangen ist und 32 Bit auf Linux meiner Meinung nach nur eine sehr untergeordnete Rolle spielt.
Besonderes Augenmerk sollte übrigens auf die Unterschiede zwischen 32 und 64 Bit gelegt werden. Nehmt das ihr Leute die glauben, dass 64 Bit nur wegen des RAM gut sei ;) Zugegebenermaßen arbeiten Threefish sowie SHA512 mit 64 Bit breiten Worten, die auf einem 64 Bit Betriebssystem mindestens doppelt so schnell verarbeitet werden können.
Es ist auf jeden Fall interessant zu sehen, dass verschiedene Compiler verschiedene Warnungen ausgeben -- und dass der Microsoft Compiler bis 2012 scheinbar noch nichts vom c99 Standard wusste.
Außerdem sind die farbigen Ausgaben von clang und seine statische Code Analyse sehenswert.
Den höchsten Komfort bietet meiner Meinung nach gcc, der dank MinGW-w64 auch unter Linux für Windows kompiliert -- und dabei Code erzeugt, der in diesem Test sehr konkurrenzfähig ist.
Mittwoch, 23. April 2014
SHA-256 in 256 Zeilen
Programmiersprachen muss man üben, um sie zu lernen und um sie nicht wieder zu verlernen.
Ich habe also meine Zeit damit vertrieben einen SHA-256 zu schreiben -- eine kryptographische Hash Funktion. Die Spezifikation ist Glücklicherweise sehr sehr verständlich.
Und auch wenn es tausende andere Implementationen gibt, die schneller sind, alle Grenzfälle beachten (ich befürchte, dass mein Programm Probleme auf Big Endian Systemen bekommt), und sogar Schaltkreise, die hochoptimiert nur diese Operation beherrschen (vgl. Bitcoin ASIC), ist meiner dennoch sehenswert, da er SHA-256 in 256 Zeilen darstellt.
Natürlich fehlt die main() Funktion, was daran liegt, dass es als Bibliothek entworfen ist.
In Python ist es übrigens etwas kürzer ;)
Und auch wenn es tausende andere Implementationen gibt, die schneller sind, alle Grenzfälle beachten (ich befürchte, dass mein Programm Probleme auf Big Endian Systemen bekommt), und sogar Schaltkreise, die hochoptimiert nur diese Operation beherrschen (vgl. Bitcoin ASIC), ist meiner dennoch sehenswert, da er SHA-256 in 256 Zeilen darstellt.
Natürlich fehlt die main() Funktion, was daran liegt, dass es als Bibliothek entworfen ist.
In Python ist es übrigens etwas kürzer ;)
Mittwoch, 19. März 2014
DGLshow
Das ist ein Doppelpendel. Soetwas möchte man eigentlich auf seinem Schreibtisch stehen haben. Aber dann stellt man fest, dass ein Doppelpendel viel zu teuer ist, und entschließt sich, dass ein virtuelles auf dem virtuellen Schreibtisch ausreicht.
Also erinnert man sich an eine alte Vorlesung, schreibt ein kleines C++ Programm mit einen adaptiven Runge-Kutta-4 Löser, das mit den Qt Zeichenprimitiven Lösungen visualisiert.
Da die Differentialgleichung zum Doppelpendel etwas abschreckt, habe ich zuerst einige DGLn lösen lassen, mit denen ich schon vertraut war. Den Lorenz Attraktor. Ein Dreikörper Problem. Und ein Sonnensystem/Bohrsches Atommodell.
Auch wenn der Code nicht sehr aufgeräumt ist -- und er wird vermutlich auch nie besser aussehen -- sind die Quellen auf GitHub: github.com/surt91/DGLshow.
Dieses Programm ist übrigens ein Paradebeispiel für ein schlechtes GUI und Anfangswerte ändert man direkt im Code -- aber mir zumindest macht es Spaß :)
Sonntag, 9. März 2014
Wie man einen Borg Kubus baut
Wie man am neuen Logo dieser Seite sieht, gefällt mir die Ästhetik, der Depth First Search (DFS) Labyrinthe und ihrer Entstehung. Und was könnte besser sein, als so eine 2D Animation? Richtig eine in 3D! Streng genommen, ist es zwar nur eine zweidimensionale Projektion mittels POV-Ray. Aber dennoch löst es ein Gefühl der Seekrankheit aus, was ich als Indiz für gelungene 3D Darstellung werte.
Sobald ich eine Möglichkeit finde zur 4D Darstellung, werde ich nicht zögern, das entstehende Video hier zu zeigen. Ich fürchte allerdings, dass das noch eine Weile dauern könnte. Bis dahin könnt ihr einer Borg Sphäre bei der Entstehung zusehen.
Sobald ich eine Möglichkeit finde zur 4D Darstellung, werde ich nicht zögern, das entstehende Video hier zu zeigen. Ich fürchte allerdings, dass das noch eine Weile dauern könnte. Bis dahin könnt ihr einer Borg Sphäre bei der Entstehung zusehen.
Abonnieren
Kommentare (Atom)
.png)



