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