ブール論理ルールエバリュエーター
-
05-07-2019 - |
質問
基本的にアンケートが表示されており、テストによく似た質問に人々が答えますが、 さまざまなパスがあり、これまでのところ非常に簡単ですが、すべてのパスを使用したテスト用の汎用ルールを作成して、現在のi ANDを許可するだけで、各ORは基本的にセット内の別のルールになります。
QuestionID、その後、私はそのようなANDルールの束を形成します
<rule id="1">
<true>
<question ID=123>
<question ID=124>
</true>
<false>
<question ID=127>
<question ID=128>
</false>
</rule>
<rule id="2"><true>
<question ID=123>
<question ID=125>
</true>
<false>
<question ID=127>
</false>
</rule>
このルール1では、質問123と124が真であり、127と128が偽である場合、合格となります。 OR(ルール2)は、123と125がtrueで、127がfalseの場合、同様に合格します。 多くの組み合わせがある場合、これは面倒になります。そのため、ロジックにORを実装したいのですが、この問題に対する最善のアプローチが何であるかわかりません。
ルールエンジンは複雑すぎると思うので、もっと簡単な方法が必要です。おそらくLINQのようなグラフを作成し、それらが合格するかどうかを評価して、
ありがとう!
-compsci専攻ではありません。
解決
これは複雑である必要はありません:あなたと要素はANDタイプのルールを効果的に実装しているので、あなたはすでにほとんどの方法を使用しています。保持できる要素と要素を紹介します。
可能であれば、次のことができます:
- RuleBaseクラス、<!> quot; public abstract bool Evaluate()<!> quot;メソッド
- RuleBaseオブジェクトのリストを含むTrueRule、FalseRule、OrRuleクラス
- 特定の質問を参照するQuestionRuleクラス
次のように、これらのそれぞれにEvaluateメソッドを実装します。
- TrueRule:は、含まれるすべてのルールが評価からtrueを返す場合にのみtrueを返します
- FalseRule:は、含まれるすべてのルールが評価からfalseを返す場合にのみtrueを返します
- OrRule:含まれるルールの少なくとも1つがEvaluateからtrueを返す場合、trueを返します
- QuestionRule:は、元の質問に対する回答を返します
このクラス階層は、単純な抽象構文ツリー(AST)を実装します。 System.Expressions.Expressionクラスの形式のLINQは、ほぼ同じことを行いますが、すべてがどのように適合するかが明らかでない場合は、独自に記述するのが役立ちます。
他のヒント
推論をサポートする適切なルールエンジンを使用すると、より効率的で拡張可能になります。
http://www.flexrule.com をご覧ください。これは、柔軟で拡張可能なルールエンジンです。 3種類のルールをサポートします。手続き、推論、およびルールフロールールは、アプリケーションから外部化し、このフレームワークを使用して実行できます。
あなたが解決しようとしている問題を完全に理解しているかどうかはわかりませんが、単純なXPathを使用してIDを取得できます。
これにより、すべての<!> quot; true <!> quot; IDは、ルールID = 1です。 / rule [@id = <!> quot; 1 <!> quot;] / true // @ ID
上記と同じだけで、偽のIDが得られます。 / rule [@id = <!> quot; 1 <!> quot;] / false // @ ID
最後に、.NETのXPathの紹介へのリンク http://www.developer.com/xml/article.php/3383961
幸運
質問をグループ化するためにtrue
およびfalse
を使用するのではなく、質問に回答を置くことをお勧めします。 XMLが読みやすくなり、議論の余地があると思います。議論の余地のないことは、それがquestion
要素を独立して評価することを可能にするということです。これによりコードが簡単になります。
XMLスキーマからページを取得し、ORロジックをchoice
要素として実装します。 bool GetProvidedAnswer(int questionID)
要素は、その子のいずれかが真の場合に真になります。もちろん、ネストすることができます:
<rule id="1">
<question id="123" answer="true" />
<question id="124" answer="false" />
<choice id="1">
<question id="125" answer='true' />
<choice id="2">
<question id="126" answer='false' />
<question id="127" answer='false' />
</choice>
</choice>
</rule>
これにより、実装する4つの非常に単純なメソッドが残ります。各メソッドは、その前のメソッドで使用されます。
-
bool IsQuestionCorrect(XmlElement question)
-
bool IsChoiceCorrect(XmlElement choice)
-
bool IsRuleSatisfied(XmlElement rule)
-
List<XmlElement>
XMLの構造により、これらのメソッドは非常に簡単に実装できます。
bool IsRuleSatisfied(XmlElement rule)
{
bool satisfied = true;
foreach (XmlElement child in rule.SelectNodes("*"))
{
if (child.Name == "question")
{
satisfied = satisfied && IsQuestionCorrect(child);
}
if (child.Name == "choice")
{
satisfed = satisfied && IsChoiceCorrect(child);
}
if (!satisfied)
{
return false;
}
}
return true;
}
IsFooCorrect
メソッドのパラメーターに<=>を追加する価値があるかもしれません。 (ルールエンジンがクラスにある場合、それをクラスフィールドにすることができます。) `すべてのメソッドは、答えが間違っているときに現在の要素をリストに追加します。その後、そのリストの内容を調べて、ルールが失敗した正確な理由を知ることができます。