私は本質的に入力に基づいて意思決定を行う必要があるシステムを設計しようと思っています。入力は人になります。
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
特定のルールに基づいて、一人一人を学校のクラスに割り当てたいと思います。
例えば:
22〜25歳の英国の女性はクラスBに行く必要があります。75歳以上の男性はクラスAに行く必要があります。6フィート以上の女性はクラスCに行く必要があります。
約400の異なるルールがあり、最初に満たされたルールを適用する必要があります。ルールの順序を維持する必要があります。
ここにルールを保存/表現する方法を考えています。明らかに、あなたは長い間veeeeryを持つことができましたif, Elif, Elif
ステートメントですが、これは効率的ではありません。別のオプションは、データベースにルールを格納し、おそらくメモリ内のテーブルを持つことです。
リリースを行わずにルールを編集できるようにしたい-技術者以外の人がルールを追加、削除、並べ替えできるようにフロントエンドを持っている可能性がある。
すべてがここにあります-唯一の特定の要件は、実際のプログラミング言語がPythonでなければならないことです。
追加のコンテキストに追加
私の質問は、ルールを保存する方法だと思います。現時点では、1つの長いif Elif elif
ステートメントなので、ビジネスロジックに変更がある場合はいつでも、PMが新しいルールを実行し、それらをifステートメントに変換します。
システムへのすべての入力は、同じルールのリストを介して送信され、最初に一致したルールが適用されます。複数のルールを各入力に適用できますが、常に最初に適用されます。
例えば.
25歳以上の女性はクラスBに行く
女性はクラスAに行きます。
2番目のルールも適用されますが、25歳以上の女性はクラスBに送られます。
入力には常に同じ形式の入力が含まれます-オブジェクトまたは辞書のどちらになるかはまだ決まっていませんが、値の一部はNone
の場合があります。一部の人はそれらに関連付けられている重みを持っていない可能性があります。
ホイールを再発明するのではなく、すぐに利用できるソリューションを使用することをお勧めします。そこにはいくつかのエキスパートシステムがあり、Pythonにあるか、Pythonを介して使用できるシステムに焦点を当てます。
CLIPS
は、もともとNASAが開発したエキスパートシステムです。最先端の技術と見なされ、大学のコースでAIの基本を教えるときに使用されます。優れたドキュメントにより、これは素晴らしい出発点です。
その構文は間違いなくPythonではなく、LISPを連想させます。 CLIPS
の利点は、他のすべてのPythonシステムとのバインディングを介して完全に統合できる固体Cエンジンです:古い pyclips および新しい clipspy 。バインディングにより、CLIPS言語内にPythonコードを埋め込むことができ、拡張が非常に簡単になります。
ルールは、必要に応じてエンジンを再起動する必要なく、実行時にロードできます。
Python Knowledge Engine
かなり強力なロジックプログラミングフレームワークです。 CLIPS
と同様に、PyKE
には独自の構文を使用してルールを表現し、Python=に依存してメカニズムを実装しています。
言い換えれば、Pythonで何をすべきかを記述し、いつどのようにルールで表現するかということです。
ルールはオンデマンドでアクティブ化および非アクティブ化できます。これにより、リリースのない更新をサポートできるようになります。
Durable Rules
は、複数のプログラミング言語(Python、Node.js、およびRubyこれまでのところ)をサポートすることを目指している、かなり新しいプロジェクトです。
Durable Rules
Pythonでナレッジベース全体(ファクトとルール)を記述できます。構文は少し奇妙に見えるかもしれませんが、これに関する注意は投稿の最後にあります。
システムがオンラインのときにルールセットを更新できるかどうかはわかりません。
複数の構文のサポートとは別に、このプロジェクトで私が興味を持っているのは、コアがRedis DBの上に構築されたCベースの実装 RETE
であるという事実です。長い目で見れば、これは興味深い発展につながるかもしれません。
これらのプロジェクトでは、大部分がPythonでナレッジベースを表現できます。私は彼らが実際に動いているのを見たことがなく、彼らのパフォーマンスと機能のサポートについてはわかりません。
独自のルールエンジンを作成して本番環境で使用しないことをお勧めする主な理由は、最初は簡単な作業のように見えますが、問題ドメインが予測よりもはるかに大きいことがすぐに明らかになるためです。
Python OOP性質は、最初はルールとファクトの両方が単純なクラスである可能性があるため、知識を表現するのに適しているようです。それにもかかわらず、パターンマッチングが少し複雑になるとすぐに(Employee
Company
で3年以上働いていた必要があります。Stock
の値は過去3年間で<10 $です)2つのことが明らかになります。
and
、or
、not
、is
、...を使用することの制限は、物事を本当に読みにくくするさらに、組織の従業員に、さらに別の社内で構築された言語を使用するように強制することは、通常、悪い考えです。これにより、CLIPS
や Drools
などの幅広いコンテキストで使用されるものを学習できなくなり、メンテナンス/ドキュメントループに長時間留まってしまいます。