Программно создать таблицу решений в C #? - PullRequest
2 голосов
/ 10 августа 2009

У меня есть такая ситуация, что я должен позволить пользователям определять решения на основе количества заданных условий. Например, моей программе необходимо автоматически сгенерировать матрицу, как показано ниже, учитывая, что есть два условия (IsMale и IsSmoker):

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

И определение определяется пользователем, поэтому может быть допустимо любое из следующего:

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

Надеюсь, я объяснил себя немного лучше, чем первоначальный вопрос.

Обновлен: в соответствии с ответом Гуффа . Ниже приведен ручной расчет его алгоритма для генерации различных комбинаций.

4 possibilities (2^2=4)

index = 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

index = 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 ]

4 голосов
/ 10 августа 2009

Вывод матрицы довольно тривиален:

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

Итак, что вы хотите с ним сделать?

2 голосов
/ 10 августа 2009

Как упомянул 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

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

0 голосов
/ 10 августа 2009

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

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) и сгенерирует необходимые значения.

0 голосов
/ 10 августа 2009

Я не уверен, что вы имеете в виду, но, возможно, это то, что вы ищете:

Я сделал несколько небольших корректировок, потому что ваш второй пример не соответствовал первому; и отрицал биты (я заменил 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

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

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

0 голосов
/ 10 августа 2009

Мне кажется, я знаю, что вы говорите. Если ваши условия не так плохи, вы можете сказать:

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

Ой, подождите! Я думаю, что вы хотите создать все различные комбинации условий! Вы хотите перестановки! И если у вас есть только двоичный файл, ну, сэр, каждую комбо можно найти, посчитав.

Я не совсем понимаю: Это выглядит как

State         1 2 3 4
Condition A   T T F F

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...