2012-02-07 3 views
0

Команда:Weighted Перестановка Алгоритм

Я строй двигателя бизнеса-правила, которые контекстуально знают - но это взвешенное - или другие слова, каждый бизнес-правило имеет уровень детализации, определенную отрезки ключа. Сегменты не являются комбинаторными, поскольку они не могут быть взвешены в любом порядке, а скорее перестановочны, как комбинационный замок (достаточно интересный, но широко принятый).

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

Итак, теперь, когда у нас есть абстрактный фон, давайте возьмем конкретный пример. Определенные сегменты следующим образом:

  1. линия бизнеса (LOB)
  2. Компания
  3. государственный

Теперь, давайте предположим, что для этого примера, что LOB является ABC, компания G и Состояние - WY. Если вы нарушите что вниз я должен получить следующие перестановки:

  • ABC_G_WY
  • ABC_G_ALL
  • ABC_ALL_WY
  • ABC_ALL_ALL
  • ALL_G_WY
  • ALL_G_ALL
  • ALL_ALL_WY
  • ALL_ALL_ALL

Однако мне нужен алгоритм для решения этой проблемы. Сегменты также должны быть возвращены в вышеупомянутом порядке, так как вы должны всегда находить самое конечное правило сначала.

Я с нетерпением жду ваших ответов и благодарю вас всех заблаговременно!

+0

Есть только когда три сегмента? Кроме того, можете ли вы опубликовать все, что у вас есть, и сообщить нам, где вы застряли? –

+1

Вы не должны копировать письма от своего руководителя группы прямо в SO. Что, если они тоже прочтут? –

+0

@ АнтонТыхый - Наверное, я не понимаю, о чем вы говорите. Это не от моего руководителя команды. –

ответ

1
public static void Main(string[] args) 
{ 
    List<string> inputValues = new List<string>() { "ABC", "G", "WY" }; 
    List<string> results = new List<string>(); 

    int permutations = (int)Math.Pow(2.0, (double)inputValues.Count); 

    for (int i = 0; i < permutations; i++) 
    { 
     int mask = 1; 
     Stack<string> lineValues = new Stack<string>(); 
     for (int j = inputValues.Count-1; j >= 0; j--, mask <<= 1) 
     { 
      if ((i & mask) == 0) 
      { 
       lineValues.Push(inputValues[j]); 
      } 
      else 
      { 
       lineValues.Push("ALL"); 
      } 
     } 
     results.Add(string.Join("_", lineValues.ToArray())); //ToArray can go away in 4.0(?) I've been told. I'm still on 3.5 
    } 

    foreach (string s in results) 
    { 
     Console.WriteLine(s); 
    } 

    Console.WriteLine("Press any key to exit..."); 
    Console.ReadKey(true); 
} 
+0

Исправлен заказ – Servy

+0

Я бы добавил +1 к вам в ответ, но я не могу, потому что у меня пока нет достаточно очков. Как только я смогу. –

0

Если я получаю право вопрос, Вы должны:

-Generate all binary strings of length N (there will be 2^N of them) 
-sort them by number of bits set 
-generate rules. Rule has 'ALL' in position i, if bit number i in the corresponding binary string is set 
Смежные вопросы