2009-08-10 5 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) к мощности не из условий (С) S не^С = общее количество комбинаций

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

+0

Мартин Фаулер пишет о таблицах решений: http://martinfowler.com/dslwip/DecisionTable.html –

+0

В вычисленных результатах руки исходное значение должно быть в диапазоне от 0 до 3 вместо 1 до 4. – Guffa

ответ

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

stackoverflow действительно полезен после 8 часов программирования, что некоторые могут прыгать на помощь. Спасибо. Это именно то, что я хочу – Jeff

+0

Я думаю, что в вашем коде есть ошибка, вы shoud remove - 1 из (1 << условия) - 1 – Jeff

+0

Да, вы правы. Второй параметр метода Range - это счетчик, а не конечный индекс. – Guffa

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

0

Если мне не хватает чего-то, чего-то у вас не хватает в определении проблемы. Вы определили диапазон возможных входов, которые, несомненно, легко сгенерировать?

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

Выход должен быть определен, его нельзя вывести. В качестве примера я заполнил И.

Похоже, что мой 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 
    } 

Так при п = 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) и сгенерирует требуемые значения.

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 

Теперь наблюдать картину каждого колонны, и думать о двоичных чисел;).

(я надеюсь, что вы получите идею.)

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 

Надеюсь, это поможет!

Смежные вопросы