17

8 つの共依存条件のかなり大きなセットに基づいて決定を下す必要があります。

           | A | B | C | D | E | F | G | H
-----------+---+---+---+---+---+---+---+---
Decision01 | 0 | 1 | - | 1 | 0 | 1 | - | 1
Decision02 | 1 | 0 | - | 0 | 0 | - | 1 | -
    ...   
Decision11 | 1 | 0 | 1 | 1 | 1 | - | 1 | 1

A から H までの各条件は、判定に真 (1)、偽 (0)、または無関係 (-) のいずれかになります。

したがって、与えられた入力で

A B C D E F G H 
1 0 1 0 0 1 1 1

Decision02 に評価される必要があります。

決定は明確であるため、入力条件の任意のセットから、どの決定を行う必要があるかが明確になります (決定マトリックスでカバーされていない場合は、例外がスローされます)。

このプロジェクトで私の前に働いていた開発者は、これを 500 行の長さのネストされたものとして実装しようとしました。

そこで、そのようなロジックを実装する最善の方法を探したところ、意思決定テーブル/ルックアップ テーブル/コントロール テーブルにたどり着きました。

私は多くの意思決定表ジェネレーターを見つけましたが、意思決定プロセスを実装する方法に関する単一のコードはありません:(

基礎となる MSSQL データベース、コード、xml、またはそれが必要とするものなら何でも、デシジョン テーブルを作成できます。これを実装する方法について、いくつかの指針が必要です。

このロジックを実装するためのベスト プラクティスは何ですか? 辞書?多次元配列?全然違うもの?

4

6 に答える 6

1

2 バイト フィールドで表現される決定クラスを持つことができます。最初のバイトは、どの条件が true または false であるかを指定します。2 番目のバイトは、関連する条件を指定します。さらに、入力バイトがオブジェクトと一致するかどうかを判断する関数を定義できます。

これから、決定のリストをラップするマトリックス クラスを作成し、LINQ を使用して入力に一致する決定をリストから検索できます。

このような決定クラスを持つことができます

class Decision
{
    byte Conditions;
    byte RelevantConditions;

    bool IsMatch(byte input)
    {
        byte unmatchedBits = input ^ Conditions; //matching conditions are set to 0
        unmatchedBits &= RelevantConditions; //Irrelevant conditions set to 0
        return (unmatchedBits == 0); //if any bit is 1, then the input does not match the relevant conditions
    }
}

したがって、Decision01 のオブジェクトは次のように定義できます。

Decision decision01 = new Decision()
{
    Conditions         = 0x55; //01010101 in binary
    RelevantConditions = 0xdd; //11011101 in binary
}

次に、Decision Matrix クラスを次のように作成できます

class DecisionMatrix
{
    List<Decision> decisions;

    Decision Find(byte input)
    {
        return decisions.Find(d => d.IsMatch(input));
    }
}

バイトをラップする Input クラスを作成することも役立つ場合があります。AH フィールドを使用して Input オブジェクトをインスタンス化すると、これらのフィールドに一致するバイトが作成されます。

于 2013-06-03T17:26:12.547 に答える