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

时间:2009-08-10 06:50:57

标签: c# algorithm

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

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

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

IsMale:   YES YES NO  NO
IsSmoker: YES NO  YES NO
Decision: T   F   T   F

IsMale:   YES YES NO  NO
IsSmoker: YES NO  YES NO
Decision: F   F   F   F

IsMale:   YES YES NO  NO
IsSmoker: YES NO  YES NO
Decision: T   T   T   T

对于每种情况,只能有两种状态, True False 。因此,组合的总数计算如下:

状态(S)没有条件(C)     S ^ C =组合总数

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

Condition A   T T F F
Condition B   T F T F

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

Condition A   T T T T F F F F
Condition B   T T F F T F T F
Condition C   T F T F T T F F

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

更新 根据{{​​3}}给出的答案。下面是他的算法的手工计算,以生成不同的组合。

4 possibilities (2^2=4)

指数= 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

指数= 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

5 个答案:

答案 0 :(得分:4)

输出矩阵非常简单:

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

那么,你想用它做什么?

答案 1 :(得分:2)

正如 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

希望这有帮助!

答案 2 :(得分:0)

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

if (A && B && C) {
     return X;
}
if (!A && B && C) {
     return Y;
}
等等哦!我想你想要产生所有不同的条件组合!你想要排列!如果你只有二元,先生,可以通过计算找到每个组合。

我不太关注: 它看起来像

State         1 2 3 4
Condition A   T T F F

<?/ s的>

答案 3 :(得分:0)

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

Condition A   T T F F
Condition B   T F T F
Decision      T F F F

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

似乎我的滑稽“容易生成”就是问题所在。递归解决方案不起作用吗?

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)并生成所需的值。

答案 4 :(得分:0)

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

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

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

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

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