Hace poco escribí una entrada sobre qué es un SAT-solver y por qué es una tecnología base importante para la gestión de variantes. En muchas herramientas de gestión de variantes, incluidos los configuradores de producto, estos SAT-solvers trabajan bajo el capó. Un buen motivo para profundizar un poco más en esta tecnología 👍🙂
De hecho, existe toda una variedad de SAT-solvers de libre acceso… solo que como bibliotecas de código para usar en proyectos de software propios. Para «experimentar» con ellas, estas bibliotecas solo son adecuadas para quienes disfrutan programando. Y los configuradores de producto o las herramientas de gestión de variantes de uso comercial (por ejemplo, ConfigIt, pure::variants o también la configuración de variantes de SAP) suelen costar dinero, y no poco. Esas herramientas lo valen, pero para aprender y experimentar también puede valer algo más económico 😉
MiniZinc, el kit de experimentación para SAT-solvers
Vale, quizá el titular lo simplifica un poco. En realidad, MiniZinc es un lenguaje de modelado declarativo propio. Con él se pueden modelar distintos «problemas» (por ejemplo, espacios de variantes…), que luego se entregan a «solucionadores de problemas». Entre esos «solucionadores» están los SAT-solvers, pero también hay varios más. Lo decisivo para nosotros: MiniZinc se puede descargar e incluye todo lo que necesitamos para experimentar. Un editor, varios SAT-solvers, prácticamente todo instalado con un clic. Y para quien prefiera evitarse la descarga, ahora también hay una versión web: https://play.minizinc.dev/
Para ejecutar ahora el ejemplo de mi vídeo, en realidad solo tienes que hacer lo siguiente:
- Descarga e instala MiniZinc (descarga aquí) o entra en la versión web
- Copia el código de abajo al portapapeles (o descarga más abajo el archivo de ejemplo)
- Pega el código en MiniZinc y haz clic en «Run»
… voilà. Eso es todo 😉
El código ya incluye las dos restricciones para el caso de uso de si se pueden fabricar descapotables con asientos de cuero. Si quieres tener el espacio de variantes «puro», simplemente elimina o comenta esas dos líneas (en MiniZinc con % al inicio de la línea).
Código de ejemplo comentado del vídeo
/*****************************************
* 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;


