Variantenräume verstehen. Erste Schritte mit MiniZinc!
Neulich habe ich einen Beitrag darüber gemacht, was ein SAT-Solver ist, und warum das eine wichtige Basis-Technologie für’s Variantenmanagement ist. In vielen Tools für Variantenmanagement, also auch in Produktkonfiguratoren, werkeln unter der Motorhaube solche SAT-Solver. Ein guter Grund, sich näher mit dieser Technologie auseinanderzusetzen 👍🙂
Tatsächlich gibt es sogar eine ganze Bandbreite an frei verfügbaren SAT-Solvern,… nur eben als Code-Bibliothek zum Einsatz in eigenen Software-Projekten. Zum damit “experimentieren” eignen sich diese Bibliotheken also nur für Menschen, die gerne Programmieren. Und kommerziell nutzbare Produktkonfiguratoren oder Tools für Variantenmanagement (z.B. ConfigIt, pure::variants oder auch die SAP-Variantenkonfiguration) kosten meistens Geld, und nicht wenig. Das sind die Tools zwar wert, für’s Lernen und Experimentieren darf es dann aber doch gern auch was günstigeres sein 😉
MiniZinc, der SAT-Solver-Experimentierbaukasten
Okay, vielleicht drückt die Überschrift das etwas verkürzt aus. Tatsächlich ist MiniZinc eine eigene deklarative Modellierungs-Sprache. Mit dieser lassen sich verschiedene “Probleme” (z.B. Variantenräume…) modellieren, die dann an “Problemlöser” übergeben werden können. Zu den “Problemlösern” gehören SAT-Solver, aber auch noch einige andere. Das Entscheidende für uns: MiniZinc gibt es zum Download und bringt alles mit, was wir zum Experimentieren brauchen. Einen Editor, verschiedene SAT-Solver, alles quasi mit einem Klick installiert. Und wer selbst den Download scheut, für den gibt es inzwischen auch eine Web-Version: https://play.minizinc.dev/
Um jetzt das Beispiel aus meinem Video auszuführen müsst ihr eigentlich nur Folgendes tun:
Zieht und installiert euch MiniZinc (Download hier) oder geht auf die Web-Version
Kopiert euch den Code unten in die Zwischenablage (oder ladet euch unten die Beispiel-Datei runter)
Fügt den Code in MiniZinc ein und klickt auf “Run”
… voilà. Das wars 😉
Der Code beinhaltet bereits die beiden Constraints für den Usecase, ob Cabrios mit Ledersitzen baubar sind. Wenn ihr den Variantenraum “pur” haben wollt, müsst ihr die beiden Zeilen einfach entfernen oder auskommentieren (in MiniZinc mit % am Zeilenanfang).
Kommentierter Beispiel-Code aus dem Video
/***************************************** * Definition des baubaren Variantenraums * *****************************************/ % Für jeden Variationspunkt müssen wir eine Variable deklarieren % Variationspunkte sind die Eigenschaften der Baureihe, die je % Fahrzeug unterschiedlich sein können. % % Jede Variable benötigt einen Datentyp. Es gibt vordefinierte % Datentypen, wie z.B. Integer oder Boolean. Benötigen wir eigene % Datentypen, müssen wir diese erst definieren. % Typen definieren enum eFahrzeugtyp = {Cabrio, Coupe, Kombi}; enum eAusstattungspaket = {Standard, Business, Sport}; enum eBremsscheibe = {BrStandard, BrGross}; enum eSitzkonfiguration = {Sitze2, Sitze4}; enum eSitzbezug = {Stoff, Leder}; % Variablen deklarieren var eFahrzeugtyp: Fahrzeugtyp; var eAusstattungspaket: Ausstattungspaket; var eBremsscheibe: Bremsscheibe; var eSitzkonfiguration: Sitzkonfiguration; var eSitzbezug: Sitzbezug; var bool: Schiebedach; % Variantenraum beschreiben % Nun beschreiben wir, wie die Variationspunkte zueinander in Be- % ziehung stehen (in SAP würde man deshalb "Beziehungswissen" % sagen. In MiniZinc erfolgt das mit dem Schlüsselwort "constraint" % Wenn es ein Cabrio ist, kann es kein Schiebedach haben, und % außerdem muss es ein 2-Sitzer sein constraint Fahrzeugtyp = Cabrio -> Schiebedach = false; constraint Fahrzeugtyp = Cabrio -> Sitzkonfiguration = Sitze2; % Beim Ausstattungspaket "Sport" ist die große Bremsscheibe drin constraint Ausstattungspaket = Sport -> Bremsscheibe = BrGross; % Der Produktmanager hat wohl entschieden, dass es Ledersitze nur % beim 4-Sitzer geben darf constraint Sitzbezug = Leder -> Sitzkonfiguration = Sitze4; /******************************************************* * Usecase: kann es Cabrios mit Lederausstattung geben? * ********************************************************/ constraint Fahrzeugtyp = Cabrio; constraint Sitzbezug = Leder; % Schließlich sagen wir noch dem Solver, dass wir auf Erfüllbarkeit % prüfen wollen solve satisfy;