2

私は本質的に調査を示しています。人々はテストのように質問に答えます。さまざまなパスがあります。これまでのところ非常に簡単ですが、より動的にしたかったので、一般的なルールを持つことができますすべてのパスを使用したテスト用です。評価者が作業しやすくするために、現在は 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 が true で、127 と 128 が false である場合に合格することを示しています。OR (ルール 2) は、123 と 125 が true で 127 が false の場合、それらも合格です。組み合わせが多いと面倒なので、ロジックにORを実装したいのですが、この問題に対する最善のアプローチが何であるかわかりません。

ルール エンジンは複雑すぎると思います。もっと簡単な方法があるはずです。たとえば、LINQ のようにグラフを作成してから、それらが成功するかどうかを評価します。

ありがとう!

-- コンプシ専攻ではありません。

4

4 に答える 4

2

これは複雑である必要はありません。あなたの and 要素は AND 型のルールを効果的に実装しているので、あなたはすでにほとんどの道を進んでいます。と要素を保持できる要素を紹介します。

あなたの可能性では、次のことができます。

  • 「public abstract bool Evaluate()」メソッドを持つ RuleBase クラス
  • RuleBase オブジェクトのリストを含む TrueRule、FalseRule、および OrRule クラス
  • 特定の質問を参照する QuestionRule クラス

次のように、これらのそれぞれに Evaluate メソッドを実装します。

  • TrueRule:含まれるすべてのルールが Evaluate から true を返す場合にのみ true を返します。
  • FalseRule:含まれているすべてのルールが Evaluate から false を返す場合にのみ true を返します。
  • OrRule:含まれるルールの少なくとも 1 つが Evaluate から true を返す場合、true を返します。
  • QuestionRule:元の質問に対する回答を返します

このクラス階層は、単純な抽象構文ツリー (AST) を実装します。System.Expressions.Expression クラスの形式の LINQ は、ほぼ同じことを行いますが、すべてがどのように適合するかが明らかでない場合は、独自に記述すると役に立ちます。

于 2008-10-29T18:17:11.153 に答える
1

推論をサポートする適切なルール エンジンを使用すると、より効率的で拡張性が高くなります。

3 種類のルールをサポートする柔軟で拡張可能なルール エンジンであるhttp://www.flexrule.comをご覧ください。手続き型、推論、およびルール フローのルールは、アプリケーションから外部化して、このフレームワークを使用して実行できます。

于 2011-04-18T09:22:44.227 に答える
0

あなたが解決しようとしている問題を完全に理解しているかどうかはわかりませんが、単純な XPath を使用して ID を取得できます。

これにより、ルール ID = 1 の「真の」ID がすべて得られます: /rule[@id="1"]/true//@ID

上記と同じですが、偽の ID が返されます: /rule[@id="1"]/false//@ID

最後に、.NET での XPath の紹介へのリンク http://www.developer.com/xml/article.php/3383961

幸運を

于 2008-10-29T18:22:53.843 に答える
0

trueand を使用しfalseて質問をグループ化するのではなく、質問に回答を付けることをお勧めします。XML が読みやすくなると思いますが、これには議論の余地があります。議論の余地のないことは、question要素を独立して評価できるようにすることです。つまり、要素を評価しようとしているコンテキストについての知識がなくても可能です。これにより、コードが単純になります。

また、XML スキーマからページを取得し、OR ロジックをchoice要素として実装します。そのchoice子のいずれかが true の場合、要素は true です。もちろん、ネストすることもできます:

<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 GetProvidedAnswer(int questionID)
  • bool IsQuestionCorrect(XmlElement question)
  • bool IsChoiceCorrect(XmlElement choice)
  • bool IsRuleSatisfied(XmlElement rule)

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;
}

メソッドList<XmlElement>のパラメーターにa を追加する価値があるかもしれません。IsFooCorrect(ルール エンジンがクラス内にある場合は、それをクラス フィールドにすることができます。) 答えが間違っている場合、すべてのメソッドが現在の要素をリストに追加するようにします。次に、そのリストの内容を調べて、ルールが失敗した正確な理由を知ることができます。

于 2008-10-29T19:15:08.340 に答える