next up previous contents index
Nächste Seite: 8.3.3 Ergebnisse des ersten Aufwärts: 8.3 Validierung anhand synthetischer Vorherige Seite: 8.3.1 Übersicht über die   Inhalt   Index

8.3.2 Initialisierung der Constraint-Netze

Zur Dokumentation des Testprogramms YacsTester erfolgt an dieser Stelle eine Übersicht über die erforderlichen Schritte, die für eine Initialisierung der Constraint-Netze bis zum Starten der Constraint-Auswertung erforderlich sind.8.5

Die main()-Routine von YacsTester (Zeile 519-521) erstellt eine Instanz der Klasse, in dessen Konstruktor die eigentlichen Testläufe durchgeführt werden (Zeile 441-517). Für jedes getestete Lösungsverfahren existiert eine eigene Methode, die vom Konstruktor jeweils aufgerufen wird.

Zunächst muss eine Instanz des YCM erzeugt werden. Dafür ist der Pfad zu den Constraint-Lösungsstrategien erforderlich. Es wird in diesem Fall lediglich der Default-Name verwendet (Zeile 41):

private final String strategyPath = "yacs_strategies.xml";

Die Instantiierung des Constraint-Managers wird in Zeile 447 von YacsTester vorgenommen:

this.ycm = new YacsConstraintManagerImpl(this.strategyPath);

Es werden als nächstes sämtliche Testroutinen initialisiert (Zeile 452-457). Während dieser Initialisierung werden für jeden Testfall eine Reihe von Constraints erzeugt und innerhalb eines String-Arrays gespeichert. Zusammen mit dem Namen der jeweils einzusetzenden Lösungsstrategie werden diese Arrays jeweils der Methode initConstraints() (Zeile 96) übergeben. Innerhalb dieser Methode werden in einer Iteration sämtliche in dem übergebenen Array enthaltenen Constraint-Ausdrücke zusammen mit dem Namen der jeweiligen Lösungsstrategie an den YCM übertragen (Zeile 99):

this.ycm.addConstraint(constraintArray[i], strategyName);

Diese Methode muss bereits innerhalb einer try/catch-Umgebung aufgerufen werden, um die ggf. vom YCM ausgelöste ConstraintParserException bzw. StrategyNotFoundException abfangen zu können. Während die erste Exception auf einen syntaktischen Fehler innerhalb des Constraint-Ausdrucks hinweist, muss letztere Exception bei jeder Gelegenheit abgefangen werden, wenn dem YCM der Name einer Strategie übergeben wird.

Anschließend müssen in jeder Testroutine die Wertebereiche der Constraint-Variablen belegt werden. Hierfür wird jeweils eine Liste angelegt, welche die Variablen der jeweiligen Strategie enthält:

variablesList = this.ycm.getVariables(strategyName);

Die von dieser Methode ggf. ausgelöste StrategyNotFoundException wird ebenso wie alle folgenden Exceptions in den Testroutinen abgefangen.

In den Testroutinen wird danach innerhalb einer Iteration jede Variable mit einer gültigen Domäne belegt. Beispielhaft für numerische finite Domänen wird an dieser Stelle die Erzeugung der Wertebereiche in NCSolverTest dargestellt (Zeile 136-137):

this.ycm.setVariableDomain((String)variablesList.get(i),
                           new NumericFDDomain(0, 9));

Neben numerischen finiten Domänen werden, speziell für das Kartenfärbeproblem in AC3SolverTest, auch symbolische finite Domänen erzeugt (Zeile 194-198):

domain = new SymbolicFDDomain();
domain.add(new SymbolicFDElement("rot"));
domain.add(new SymbolicFDElement("gruen"));
domain.add(new SymbolicFDElement("blau"));
this.ycm.setVariableDomain((String)variablesList.get(i), domain);

Die Testroutine für den HullConsistencySolver erstellt für jede der beteiligten Variablen eine Intervalldomäne (in diesem Fall ohne Iteration, Zeile 415-417):

this.ycm.setVariableDomain("v1", new IntervalDomain(2, 12));
this.ycm.setVariableDomain("v2", new IntervalDomain(4, 9));
this.ycm.setVariableDomain("v3", new IntervalDomain(2, 8));

Nach dieser Initialisierung befinden sich die jeweiligen Teilprobleme innerhalb von YACS in den Constraint-Netzen der zugehörigen Lösungsstrategie. Es erfolgen an dieser Stelle jeweils durch den Aufruf der Methode printTestValues() einige Ausgaben, um dem Nutzer die Überprüfung der Belegungen zu ermöglichen. Anschließend wird die Constraint-Auswertung gestartet werden (Zeile 465):

this.ycm.evaluate();



Fußnoten

...8.5
Erwähnenswert ist, dass hierfür, wie auch im restlichen Programm, ausschließlich die ,,äußere Schnittstelle`` des YACS-Frameworks, d.h. die Methoden des Constraint-Managers, genutzt werden.

next up previous contents index
Nächste Seite: 8.3.3 Ergebnisse des ersten Aufwärts: 8.3 Validierung anhand synthetischer Vorherige Seite: 8.3.1 Übersicht über die   Inhalt   Index