2009-08-10 33 views
2

我有這種情況,我需要讓用戶根據給定條件的數量來定義決策。例如我的節目需要自動生成矩陣如下面給出的,有兩個條件(IsMale和IsSmoker):以編程方式在C#中生成決策表?

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 

對於每個條件只能有兩種狀態,。這樣的組合的總數被計算如下:

沒有可能狀態(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 

希望我已經解釋了自己比原來的問題好一點。

更新: 根據Guffa給出的答案。下面是他的算法來生成不同組合的手工計算。

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 
+0

看來你應該在每一列上都有一些標籤,這樣纔有意義? – ScottS 2009-08-10 07:00:22

+0

Martin Fowler寫的關於決策表:http://martinfowler.com/dslwip/DecisionTable.html – 2009-08-10 07:12:21

+0

在手計算結果的原始值應該介於0到3而不是1到4. – Guffa 2009-08-10 09:01:52

回答

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

所以,你想用它做什麼?

+0

在8小時的編程之後,一些人可以跳到救援中,stackoverflow是非常有用的。 – Jeff 2009-08-10 07:27:40

+0

我認爲你的代碼中存在一個錯誤,你應該從(1 <<條件)中刪除 - 1 – Jeff 2009-08-10 07:38:46

+0

是的,你是對的。Range方法的第二個參數是一個計數,而不是結束索引 – Guffa 2009-08-10 07:49:55

0

我想我知道你在說什麼。如果你的條件不那麼糟糕,你可以說:

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

哦等等!我想你正在尋找所有不同的條件組合!你想排列!如果你只有二進制,先生,每個組合可以通過計數找到。

我不太明白: 它看起來像

 
State   1 2 3 4 
Condition A T T F F 

+0

我不確定數學術語,但是「哦,等等!我認爲你正在尋找所有不同的條件組合!「這就是我想要做的。」 – Jeff 2009-08-10 07:23:16

0

除非我錯過了某些東西,在問題定義中缺少某些東西。您已經定義了可能的輸入範圍,這肯定很容易產生?

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

輸出需要定義,不能推導出來。作爲一個例子,我填寫了一個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}。然後迭代{T,F},並將第一個T和它們F加到產生{T,T}和{T,F},然後{F,T}和{F,F} 。

我希望很清楚getListOfCombinedStates(3)將如何調用getListOfCombinedStates(2)並生成所需的值。

0

我不知道你的意思,但也許這是你在找什麼:

我做了一些小的調整,因爲你的第二個例子是不是與第一個一致的;並取消了位(我用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 

現在,觀察每個的模式,想想二進制數)。

(我希望你的想法。)

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 

希望這有助於!