square: Ein Optimierungsproblem
und eine Aufforderung zum Mitmachen
- gegeben:
- ein Quadrat der Kantenlänge n und
n-1 Quadrate der Kantenlängen 1,2,...,n-1
- gesucht:
- eine Anordnung von kleinen Quadraten in dem
Quadrat der Kantelänge n, so dass eine möglichst
große Fläche überdeckt wird. Jedes kleine Quadrat
darf nur einmal verwendet werden.
Diese Aufgabe ist ein spezielles 2-dimensionales Rucksackproblem (engl.: knapsack). Es ist NP-vollständig, d.h. für wachsende Größe des Quadrates steigt die Rechenzeit für eine optimale Lösung mindestens exponentiell.
Dieses Problem eignet sich deshalb gut zum Austesten unterschiedlicher Suchstrategien: z.B. vollständige Suche mit möglichst frühem Abschneiden der Suchbäume, heuristische Verfahren, constraint-basierte Verfahren (mit clp(FD) oder eclipe) oder Genetische Algorithmen.
Beispiel
In dem Archiv square.tar.gz ist ein Beispiel für die Lösung dieses Optimierungsproblems enthalten. Es arbeitet als einfaches client/server Programm.
Der client (square.tcl) implementiert die graphische Benutzungsschnittstelle,
er ist vollständig mit Tcl/Tk implementiert,
er ist in der Lage, verschiedene Suchprogramme (server) aufzurufen.
Zwei Suchprogramme sind bisher implementiert: square-0 ist ein Minimalprogramm,
es liefert immer die triviale Lösung (für n immer n-1,1).
Die Aufrufkonventionen können hieran aber einfach abgelesen werden,
ein Testaufruf: square-0 15
square-1 ist ein besseres Suchprogramm: es führt eine vollständige
Suche durch. Es plaziert die Quadrate immer in Ecken, nie in eine freie Fläche,
und versucht, den Suchbaum möglichst früh zu kappen.
Es arbeitet bis zu einer Kantenlänge n=50 in annehmbarer Zeit,
darüber hinaus wird es sehr schnell unbrauchbar. Dieses Programm ist in
Prolog erstellt (--> SWI Prolog).
Ein Testaufruf square-1 15 zeigt, daß für n=15
eine bessere, als die triviale Lösung existiert.
Hier sind viele Verbesserungsmöglichkeiten denkbar, wer noch ein
C oder OOP Programm zu erstellen hat, kann hier interessante Optimierungsstrategien
ausprobieren. Wenn die (sehr einfachen) Aufrufkonventionen eingehalten werden,
kann das Optimierungsprogramm ohne Änderung mit dem GUI-Programm square.tcl
zusammenarbeiten.
Aufrufkonventionen
- Der Programmname des Suchprogramms
muss auf das Muster
square-[0-9A-Za-z]+passen, d.h. der Programmname muss mitsquare-beginnen und aus beliebigen Buchstaben und Ziffern gebildet werden. Die Namensquare-0undsquare-1sind schon belegt. - Das Programm wird mit
square-<name> <größe>aufgerufen, also mit einem Parameter, dieser muss eine ganze Zahl größer als 1 sein.
- Das Programm enthält keine weiteren Eingaben.
- Das Programm schreibt auf die Standardausgabe (für C:
stdout) die folgenden Informationen, jede Information besteht aus genau einer Zeile, nach Ausgabe einer Zeile wird immer der Ausgabepuffer geleert (für C:fflush(stdout)).Jede Zeile bildet genau ein Tcl-Kommando, daß von dem GUI-Programm ausgeführt wird:
-
Version {<Programmname und Version>}der Name und die Version des Suchprogramms in geschwungenen Klammern
- pro gefundener Lösung eine Zeile in dem Format:
Solution <covered> {<size+position> ... }mit
<size+position> = {<size> <x> <y>}Mit diesem Kommando kann also immer die augenblicklich beste Lösung angezeigt werden.
<covered>gibt die überdeckte Fläche dieser Lösung an, es folgt in geschwungenen Klammern eine Liste von Quadraten, diese einzelnen Einträge bestehen aus drei Werten: der Größe des Quadrates, der X- und Y- Koordinate der Ecke, die sich am dichtesten am Punkt (0,0) befindet. Schließende und öffnende geschwungene Klammern müssen durch einen Zwischenraum getrennt sein.Das zu überdeckende Quadrate wird durch die Punktemenge
{(0,0),(0,1),...,(0,n-1)
,(1,0),(1,1),...,(1,n-1)
,...,...,...
,(n-1,0),(n-1,1),...,(n-1,n-1)
}dargestellt.
- als letzte Zeile
BestSolution <size> <covered>dieses Kommando wird am Ende der Suche ausgegeben,
<size>ist die Kantenlänge des Quadrates, also der Programmparameter,<covered>gibt die überdeckte Fläche an.
-
ein Beispiel-Programmlauf
für n=15 mit square-1 15
Bestenliste (Stand 11.7.96)
Wenn eine interessante Lösung gefunden wurde, bitte bei mir melden.
Viel Spaß beim Ausprobieren