Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中以编程方式生成决策表?_C#_Algorithm - Fatal编程技术网

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

在C#中以编程方式生成决策表?,c#,algorithm,C#,Algorithm,在这种情况下,我需要让用户根据给定条件的数量定义决策。例如,如果有两个条件(IsMale和IsSmoker),我的程序需要自动生成一个矩阵,如下所示: 并且该定义是由用户定义的,因此以下任何一项都是有效的: 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

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

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

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
对于每个条件,只能有两种状态,TrueFalse。因此,组合的总数计算如下:

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

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

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

希望我的解释比原来的问题好一点

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

4 possibilities (2^2=4)
索引=0,(右移0)

索引=1,(右移1)

组合:

Condition 1: TFTF
Condition 2: FTTF

我想我知道你在说什么。如果你的情况没有那么糟糕,你可以说:

if (A && B && C) { return X; } if (!A && B && C) { return Y; } 如果(A&B&C){ 返回X; } 如果(!A&&B&&C){ 返回Y; } 哦,等等!我认为您正在寻找生成所有不同的条件组合!你想要排列!如果你只有二进制,那么先生,每个组合都可以通过计数找到

我不太明白: 它看起来像吗

State 1 2 3 4 Condition A T T F F 国家1 2 3 4 条件A T F

除非我遗漏了问题定义中的某些内容。您已经定义了可能的输入范围,这当然很容易生成

Condition A   T T F F
Condition B   T F T F
Decision      T F F F
输出需要定义,不能推断。例如,我填写了一个和

似乎我的油嘴滑舌“容易产生”是问题所在。递归解决方案不起作用吗

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,我们调用getListofCombinedState(2),它调用getListofCombinedState(1),它返回{T,F}

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


我希望清楚地知道getListOfCombinedStates(3)将如何调用getListOfCombinedStates(2)并生成所需的值。

我不确定您的意思,但也许这就是您要寻找的:

我做了一些小的调整,因为你的第二个例子与第一个不一致;并对位求反(我用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
现在,观察每列的模式,并考虑二进制数;)

(我希望你能理解。)

正如djna在回答中提到的那样,你错过了决策的结果

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

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

生成数组的一种简单方法是创建一个循环,在该循环中,将变量从0递增到2^n-1,然后将数字转换为二进制。您将得到如下结果:(对于n=3):


希望这有帮助

输出矩阵相当简单:

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()
       )
    );
}
int条件=3;
for(int c=0;c>c)&1])
.ToArray()
)
);
}

那么,你想用它做什么呢?

似乎你应该在每列上都有一些标签来说明这一点。Martin Fowler写到决策表:在手工计算的结果中,原始值应该在0到3之间,而不是1到4之间。哦,是的,但我太懒了,无法更新。Lol但我想这只会影响结果的顺序?我不是确定数学术语,但是“哦,等等!我想你正在寻找生成所有不同条件的组合!”这是我想要做的。stackoverflow在编程8小时后非常有用,有人可以跳出来救援。谢谢。这正是我想要的。我想你的代码中有一个bug,你应该从中删除-1(1)是的,你是对的。Range方法的第二个参数是计数,而不是结束索引。我不太了解Enumerable.Range(0,(1“TF”[(n>>索引)&1])。ToArray()位。你能解释一下吗?我知道它在做什么,我可以手工计算(然后按位右移&1),但我不知道为什么。 State 1 2 3 4 Condition A T T F F
Condition A   T T F F
Condition B   T F T F
Decision      T F F F
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
     }
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
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
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()
       )
    );
}