Desde DECISION MANAGEMENT COMMUNITY proponen cada ciertos meses unos retos sobre Decision Management que cuelgan en su web, en los que cualquiera puede participar y mandar su solución utilizando cualquier sistema de gestión de decisiones y reglas de negocio.
Tras encontrarnos este problema tan divertido, hemos decidido resolverlo creando un proyecto de reglas con IBM ODM versión 8.6. Aunque está claro que la situación no es muy realista (todos sabemos que los Hombres Lobo no viven en los cementerios) es un buen ejemplo que nos muestra como se puede definir el cálculo de un riesgo.
El enunciado es el siguiente:
Decision Model: “Determine the Risk of Meeting a Werewolf“
Trying to determine the risk of meeting a Werewolf based upon two factors: Phase of the Moon, and Distance from Graveyard. Here are the rules:
Fact Type: Phase of the Moon
Values: New Moon, Half Moon, Three-Quarter Moon, Full Moon
Rule Family: Phase of the Moon Risk
Conditions | Conclusions
New Moon | .01
Half Moon | .25
Three-Quarter Moon | .50
Full Moon | .75
Fact Type: Miles from Graveyard
Values: < 5 miles, between {5 miles, 25 miles}, > 25 miles
Rule Family: Miles from Graveyard Risk
Conditions | Conclusions
<5 miles | .75
between {5 miles, 25 miles} | .25
> 25 miles | .01
Fact Type: Werewolf Risk
Values: Phase of the Moon, Miles from Graveyard
Rule Family: Werewolf Risk Weights
Conditions | Conclusion
Phase of the Moon | .75
Miles from Graveyard | .5
Calculate Werewolf Risk:
(Phase of the Moon weight * Phase of the Moon Risk) + (Miles from Graveyard weight * Miles from Graveyard Risk) = Werewolf Risk
En primer lugar definimos un tipo MoonPhase con un dominio estático de posibles valores con las diferentes fases de la luna para poder utilizar como argumento de entrada:
Con el nuevo tipo ya podemos definir los dos parámetros de entrada («the input moon phase» y «the input miles from graveyard») y el riesgo calculado de salida («the output werewolf risk»)
Definimos además una serie de variables internas para poder almacenar los riesgos y los pesos que se usarán en el cálculo final
Tabla de Decisión: Phase of the Moon Risk Table (Tabla de Riesgo según la Fase Lunar)
Tabla de Decisión: Miles from Graveyard Risk Table (Tabla de Riesgo según las millas respecto al Cementerio)
Regla de Decisión: asignamos valor a la variable «Miles from Graveyard Weight» (peso del facor ‘Millas respecto al Cementerio’). Esto se podría haber hecho directamente en la definición de la variable pero de esta manera el usuario tendrá una ‘regla de negocio’ sobre la que controlar este valor.
Regla de Decisión: valor de la variable «Moon Phase Weight» (peso del factor ‘Fase Lunar’). Esto se podría haber hecho directamente en la definición de la variable pero de esta manera el usuario tendrá una ‘regla de negocio’ sobre la que controlar este valor.
Regla de Decisión: Calculate Warewolf Risk (Cálculo de Riesgo de encontrarse un Hombre Lobo)
Las reglas están organizadas en el proyecto en las siguientes carpetas:
Para construir el ruleflow asignaremos cada carpeta a un ruletask y lo ejecutaremos siguiendo un flujo ordenado:
Ya podemos probar nuestro servicio de cálculo de riesgo. Para ello generamos un test basado en un fichero Excel en que representamos 3 escenarios de prueba disitintos:
Los resultados esperados que decidirán el éxito o fallo de la prueba los definimos:
Creamos la prueba del servicio en nuestro Decision Center subiendo nuestro fichero Excel
Ejecutamos la prueba y observamos cómo el informe de ejecución nos indica que uno de los tres escenarios ha fallado:
El resultado esperado del primer escenario planteado es correcto:
Nuestro resultado esperado (0,25) no coincide con el resultado de la ejecución del segundo escenario (0,3125):
El resultado esperado del tercer escenario planteado es correcto:
Nuestro Servicio de Decisión así ya estaría completo confirmándonos que las noches de luna llena es mejor quedarse en casa.
¡Hasta el próximo reto!