Je cherche à concevoir un système qui devra essentiellement prendre des décisions en fonction des entrées. L'entrée sera une personne.
class Person:
def __init__(self, name, age, sex, weight, height, nationality):
self.name = name
self.age = age
self.sex = sex
self.weight = weight
self.height = height
self.nationality = nationality
Nous voulons affecter chaque personne à une classe scolaire en fonction de certaines règles.
Par exemple:
Les femmes du Royaume-Uni entre 22-25 devraient aller en classe B. Les hommes de plus de 75 ans devraient aller en classe A. Les femmes de plus de 6 pieds devraient aller en classe C.
Nous aurons environ 400 règles différentes et la première règle qui doit être respectée doit être appliquée - nous devons maintenir l'ordre des règles.
Je réfléchis à la façon de stocker/représenter les règles ici. De toute évidence, vous pourriez juste avoir une longue veeeery if, Elif, Elif
mais ce n'est pas efficace. Une autre option serait de stocker les règles dans une base de données et peut-être d'avoir une table en mémoire.
Je voudrais pouvoir éditer les règles sans faire de version - possiblement un frontal pour permettre aux non-techniciens d'ajouter, de supprimer et de réorganiser les règles.
Tout est sur la table ici - la seule exigence certaine est que le langage de programmation doit être Python.
ajouté pour plus de contexte
Je suppose que ma question est de savoir comment stocker les règles. Pour le moment, c'est un énorme long if Elif elif
instruction donc chaque fois qu'il y a un changement dans la logique métier, le PM fait les nouvelles règles et je les convertis ensuite en l'instruction if.
Toutes les entrées du système seront envoyées via la même liste de règles et la première règle qui correspond sera appliquée. Plusieurs règles peuvent s'appliquer à chaque entrée, mais c'est toujours la première qui est appliquée.
par exemple.
Les femmes de plus de 25 ans passent en classe B
Les femmes vont en classe A.
Toutes les femmes de plus de 25 ans seront envoyées en classe B même si la deuxième règle s'applique également.
L'entrée contiendra toujours le même format d'entrée - n'a pas encore décidé où ce sera un objet ou un dict mais certaines des valeurs peuvent être None
. Certaines personnes peuvent ne pas avoir de poids associé.
Plutôt que de réinventer la roue, je vous suggère d'utiliser une solution facilement disponible. Il existe plusieurs systèmes experts et je me concentrerai sur ceux qui sont soit en Python ou qui peuvent être utilisés via Python.
CLIPS
est un système expert développé à l'origine par la NASA. Il est considéré comme à la pointe de la technologie et utilisé dans les cours universitaires lors de l'enseignement des bases de l'IA. C'est un excellent point de départ en raison de son excellente documentation.
Sa syntaxe n'est certainement pas Python, elle rappelle plutôt LISP. L'avantage de CLIPS
est qu'il s'agit d'un solide moteur C qui peut être entièrement intégré à tout autre système Python via ses liaisons: l'ancien pyclips et le plus récent clipspy . Les liaisons permettent d'intégrer le code Python dans le langage CLIPS, ce qui le rend très facile à étendre).
Les règles peuvent être chargées lors de l'exécution sans avoir à redémarrer le moteur, ce qui devrait mieux répondre à vos besoins.
Le Python Knowledge Engine
c'est un framework de programmation logique assez puissant. Quant à CLIPS
, PyKE
est livré avec sa propre syntaxe pour exprimer les règles et s'appuie sur Python pour implémenter la mécanique.
En d'autres termes, vous écrivez quoi faire en Python et vous exprimez quand et comment via des règles.
Les règles peuvent être activées et désactivées sur demande. Cela devrait vous permettre de prendre en charge les mises à jour sans libération.
Durable Rules
est un projet assez nouveau avec l'ambition de supporter plusieurs langages de programmation (Python, Node.js et Ruby jusqu'à présent).
Durable Rules
vous permet d'écrire toute la base de connaissances (faits et règles) en Python. La syntaxe peut sembler un peu étrange cependant, une note à ce sujet à la fin du post.
Je ne sais pas si vous pouvez mettre à jour l'ensemble de règles lorsque le système est en ligne.
Outre le support de la syntaxe multiple, ce qui m'intéresse dans ce projet est le fait que le noyau est une implémentation basée sur C de RETE
construite au-dessus de Redis DB. À long terme, cela pourrait conduire à un développement intéressant.
Ces projets permettent d'exprimer des bases de connaissances principalement en Python. Je ne les ai jamais vus en action et je ne suis pas sûr de leurs performances et de la prise en charge des fonctionnalités.
La principale raison pour laquelle je recommande de ne pas préparer votre propre moteur de règles à utiliser en production est que, même si cela semble une tâche facile au début, il devient rapidement évident que le domaine du problème est bien plus important que prévu.
Python OOP la nature semble au départ un bon moyen d'exprimer des connaissances car les règles et les faits peuvent être des classes simples. Néanmoins, dès que la correspondance de motifs devient un peu plus complexe (Employee
doit avoir travaillé> 3 ans en Company
dont la valeur Stock
est <10 $ au cours des 3 dernières années) deux choses deviennent évidentes.
and
, or
, not
, is
, ... rend les choses très difficiles à lireDe plus, forcer les employés d'une organisation à utiliser un autre langage construit en interne est généralement une mauvaise idée. Il les empêche d'apprendre quelque chose utilisé dans des contextes plus larges tels que CLIPS
ou Drools
et vous bloquera dans une boucle de maintenance/documentation pendant longtemps.