svg2png
Konvertiere .svg in .png mit weißem Hintergrund.
inkscape -z -b \"#fff\" -e img.png -h 1080 img.svg
Oder einen ganzen Ordner.
for i in *.svg
do inkscape -z -b \"#fff\" -e $(basename -s .svg $i).png -h 1080 $i
done
Konvertiere .svg in .png mit weißem Hintergrund.
inkscape -z -b \"#fff\" -e img.png -h 1080 img.svg
Oder einen ganzen Ordner.
for i in *.svg
do inkscape -z -b \"#fff\" -e $(basename -s .svg $i).png -h 1080 $i
done
Das Problem des Handlungsreisenden ist es, die kürzeste Rundtour zu planen, sodass man alle Städte besucht. Es ist eines der berühmtesten Optimierungsprobleme und gehört zur Klasse NP-hard.
Es gibt also (bis jetzt) keine effiziente Möglichkeit zur Lösung. Allerdings gibt es Näherungen, untere Schranken und unzählige Heuristiken.
Die einfachsten dieser Heuristiken habe ich in einem kleinen Programm TSPview implementiert, mitsamt Visualisierung. Der Quellcode ist auf GitHub zu finden.
Hier folgt eine kurze Beschreibung der verwendeten Algorithmen und jeweils ein Bild, welche Lösung die Methode auf einer berühmten Instanz des TSP findet.
Das sind 42 Hauptstädte der Vereinigten Staaten von Amerika und Washington, DC (Hawaii und
Alaska, sowie einige Staaten an der Ostküste, die das Problem nicht schwieriger
machen, fehlen). Dieses Problem war das erste größere, das 1956 beweisbar
optimal gelöst wurde.
Die Nearest Neighbor Heuristik ($\mathcal{O}(N^2)$) startet bei einer zufälligen Stadt und wählt
als nächste Stadt immer die Stadt, die am nächsten an der aktuellen Stadt ist und
noch nicht besucht wurde.
Diese Heuristik ($\mathcal{O}(N^2 \log N)$) ist ähnlich zu Kruskals Algorithmus für minimal spannende Bäume.
Sie nimmt die kürzeste Verbindung zwischen zwei Städten und fügt sie der Tour
hinzu, wenn sie in der Tour noch erlaubt ist.
Farthest Insertion ($\mathcal{O}(N^3)$) startet bei einer zufälligen Stadt und fügt dann die Stadt,
die am weitesten von der aktuellen Tour entfernt ist an der Stelle in die Tour,
die dafür sorgt, dass die Tour möglichst kurz bleibt.
Two-Opt beginnt mit einer beliebigen Tour, die bspw. durch eine der obigen
Heuristken erstellt wurde und verbessert sie, indem sie zwei Verbindungen nimmt
und die Endpunkte über Kreuz austauscht, wenn die Tour dadurch verbunden bleibt
und kürzer wird.
Lineare Programmierung (LP) zu erklären, würde diesen Artikel sprengen. Aber diese Methode liefert
untere Schranken für die Tourlänge und kann somit benutzt werden, um die
Qualität einer heuristischen Lösung abzuschätzen. Falls man die optimale
Lösung durch lineare Programmierung findet, erkennt man sie auch sofort als optimal.
Für weitere Details, kann ich auf einen arXiv Artikel von mir verweisen.
Concorde
ist der „State of the Art“ Solver für das Problem des Handlungsreisenden
und löst problemlos Instanzen mit mehr als 1000 Städten.
Intern benutzt es zwar eine Menge Heuristiken, allerdings auch lineare
Programmierung, um nachzuweisen, dass die gefundene Lösung optimal ist.
TSPview ist ein Python3 Programm, das zur Darstellung PyQt5 benutzt, das sich
per pip3 install PyQt5 einfach installieren lässt.
Darüber hinaus enthält es eine optionale Abhängigkeit zu CPLEX, einem kommerziellen LP solver.
Da das Hauptprogramm in Python geschrieben ist, aber der LP-Teil in C++, braucht man eine Möglichkeit der Kommunikation. Glücklicherweise gibt es mit boost::python eine Möglichkeit C++ Klassen in Python als Python-Klassen zu benutzen.
Um beispielsweise die C++ Klasse MyClass, deren Konstruktor einen Integer und
eine Python-Liste entgegen nehmen soll, in Python benutzen und myMethod
aufrufen zu können, reicht folgender Code:
#include <boost/python.hpp>
namespace py = boost::python;
// implement MyClass
BOOST_PYTHON_MODULE(MyClass)
{
py::class_<MyClass>("MyClass", py::init<int, py::list>())
.def("myMethod", &MyClass::myMethod)
;
}
Soeben habe ich mein Blog von Blogger auf einen kleinen Raspberry Pi 2 in meiner Wohnung verschoben. Als Engine benutze ich Pelican, ein statischer Blog Generator in Python, der mir auf den ersten Blick sehr gefällt.
Nicht nur, dass ich alle Einträge jetzt in Markdown schreiben kann, was es ermöglicht das ganze Blog per git zu verwalten (dementsprechend gibt es den Quellcode auf GitHub), sondern es steht mit Pygments ein sehr hübsches Syntax Highlighting zur Verfügung.
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
Außerdem Formeln in $\LaTeX$ Notation dank MathJax
$$\mathcal H = \sum_{\left< i, j \right>} s_i s_j$$
Ich werde diese Gelegenheit außerdem nutzen die meisten Einträge meines Blogs zu verwerfen und nur einige ausgewählte zu überarbeiten und hier zu veröffentlichen.