以编程方式在C#中生成决策表?

我有这种情况,我需要让用户根据给定条件的数量来定义决策。 例如,假设有两个条件(IsMale和IsSmoker),我的程序需要自动生成如下的矩阵:

IsMale: YES YES NO NO IsSmoker: YES NO YES NO 

并且deicsion由用户定义,因此以下任何一个都是有效的:

 IsMale: YES YES NO NO IsSmoker: YES NO YES NO Decision: TFTF IsMale: YES YES NO NO IsSmoker: YES NO YES NO Decision: FFFF IsMale: YES YES NO NO IsSmoker: YES NO YES NO Decision: TTTT 

对于每个条件,只能有两种状态, TrueFalse 。 所以组合的总数计算如下:

没有可能的状态(S)无条件的幂(C) S ^ C =组合的总数

4种可能性(2 ^ 2 = 4)

 Condition ATTFF Condition BTFTF 

8种可能性(2 ^ 3 = 8)

 Condition ATTTTFFFF Condition BTTFFTFTF Condition CTFTFTTFF 

希望我比原来的问题更好地解释自己。

更新:根据Guffa给出的答案 。 下面是他的算法的手计算,以生成不同的组合。

 4 possibilities (2^2=4) 

index = 0,(右移0)

 binary 8 4 2 1 Value original 0 0 0 1 1 & 1 0 0 0 1 1 T original 0 0 1 0 2 & 1 0 0 0 1 0 F original 0 0 1 1 3 & 1 0 0 0 1 1 T original 0 1 0 0 4 & 1 0 0 0 1 0 F 

index = 1,(右移1)

 binary 8 4 2 1 Value original 0 0 0 1 1 shift 0 0 0 0 0 & 1 0 0 0 1 0 F original 0 0 1 0 2 shift 0 0 0 1 1 & 1 0 0 0 1 1 T original 0 0 1 1 3 shift 0 0 0 1 1 & 1 0 0 0 1 1 T original 0 1 0 0 4 shift 0 0 1 0 2 & 1 0 0 0 1 0 F 

组合:

 Condition 1: TFTF Condition 2: FTTF 

输出矩阵相当简单:

 int conditions = 3; for (int c = 0; c < conditions; c++) { Console.WriteLine( "Condition {0} : {1}", (char)('A' + c), new String( Enumerable.Range(0, (1 << conditions)) .Select(n => "TF"[(n >> c) & 1]) .ToArray() ) ); } 

那么,你想用它做什么?

正如djna在他/她的回答中提到的,你错过了决定的输出。

例如,如果您有一个带两个输入的运算符(例如:和,或运算符),则必须对所有可能的输入进行尝试。 对于一个非常简单的简单运算符,因为只有四个可能的输入,但对于更复杂的运算符,您必须生成2 ^ n个可能的输入来计算所有可能的输出。

我建议在一个n个布尔变量数组中执行此操作,您可以在其中翻转位以获得2 ^ n个可能的输入,然后使用生成的输入数组测试运算符并打印结果。

生成数组的一种简单方法是创建一个循环,在该循环中将变量从0增加到2 ^ n – 1,然后将数字转换为二进制。 你会得到这样的东西:(对于n = 3):

 0: 0 0 0 1: 0 0 1 2: 0 1 0 3: 0 1 1 4: 1 0 0 5: 1 0 1 6: 1 1 0 7: 1 1 1 

希望这可以帮助!

我不确定你的意思,但也许这就是你要找的东西:

我做了一些小调整,因为你的第二个例子与第一个例子不一致; 否定了这些位(我用0代替F,用1代替T),以表明我的观点。

 Condition A 0 0 0 0 1 1 1 1 Condition B 0 0 1 1 0 0 1 1 Condition C 0 1 0 1 0 1 0 1 

现在,观察每的模式,并考虑二进制数;)。

(我希望你明白这个主意。)

我想我知道你在说什么。 如果您的条件不是那么糟糕,您可以说:

 if(A && B && C){
     返回X;
 }
 if(!A && B && C){
     返回Y;
 }

等一下! 我想你想要产生所有不同的条件组合! 你想要排列! 如果你只是二元,先生,可以通过计算找到每个组合。

我不太关注:它看起来像

国家1 2 3 4
条件ATTFF

除非我遗漏了一些你在问题定义中缺少的东西。 您已经定义了可能的输入范围,这肯定很容易生成?

 Condition ATTFF Condition BTFTF Decision TFFF 

需要定义输出,不能推断出。 作为一个例子,我填写了一个AND。

好像我的glib“易于生成”就是问题所在。 递归解决方案不起作用吗?

 for (members of getListOfCombinedStates(n) ) print theMember getListOfCombinedStates(int howMany) { if ( n == 1 ) return list of possible States else { create empty resultlist for ( members of getListofCombinedStates(howMany -1) ) for ( members of listOfStates ) create new CombinedState by suffixing state, add to resultList return resultList } 

因此,对于n = 2,我们调用getListOfCombinedStates(2),它调用getListOfCombinedStates(1),并返回{T,F}。

getListOfCombinedStates(2)然后迭代{T,F}并将第一个T和它们F添加到每个成员,产生{T,T}和{T,F},然后{F,T}和{F,F}。

我希望很清楚getListOfCombinedStates(3)如何反过来调用getListOfCombinedStates(2)并生成所需的值。