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:

  1. Zieht und installiert euch MiniZinc (Download hier) oder geht auf die Web-Version

  2. Kopiert euch den Code unten in die Zwischenablage (oder ladet euch unten die Beispiel-Datei runter)

  3. 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;

 

Fragen oder Feedback?🙂 => Gebt mir einen Ping

Zurück
Zurück

Warum reden wir so oft aneinander vorbei, wenn es um Konfiguration geht?

Weiter
Weiter

Wofür sind SAT-Solver im Variantenmanagement gut?