2012-09-19 6 views
1

다음을 수행 할 수있는 알고리즘을 찾으려고합니다. 부울 변수가 10 개 있다고 가정하고 모든 조합을 시도하고 싶습니다. 내 목표는 모든 조합을 찾는 것이므로 그 결과 내 방법 중 하나에 결과로 줄 것이다. (이 방법에는 많은 제한이 있기 때문에 모든 가능한 조합을 테스트해야하며 문제를 해결할 조합이없는 경우 사용자에게 알리고 싶다. 이). 이해할 수 있기를 바랍니다!가능한 모든 부울 변수 조합

답변

1

마지막으로 좀 더 효율적인 방법을 생각해 냈습니다. 바이너리 숫자 사용 : 변수 8 개 중에서 가능한 모든 부울 값 조합을 테스트하고 싶다고 가정 해 봅시다 : 다음을 선택하면 모든 조합을 테스트합니다 :

public string CombinationFinder() 
{ 
    for (int i = 0; i < 2^8; i++) 
    { 
     String ans = Convert.ToInt32(i, 2).ToString(); 
     if (myMethod(ans)) 
     { 
      return ans; 
     } 
    } 
    return null; 
} 

이 0에서 255로 이동되는 00000000의 각 디지트가 부울 표현 될 수있는 값은 0 또는 1을 취 11111111 가는 이진 수단이다. 이 예에서는, 결합이 발견되지 않는 경우, 메소드는 null를 돌려줍니다.

7

이 시도 :

for (int i = 0; i < (1 << 10); i++) 
{ 
    bool b1 = (i & (1 << 0)) != 0; 
    bool b2 = (i & (1 << 1)) != 0; 
    bool b3 = (i & (1 << 2)) != 0; 
    bool b4 = (i & (1 << 3)) != 0; 
    ... 

    if (MyMethod(b1, b2, b3, b4, ...)) 
    { 
     // Found a combination for which MyMethod returns true 
    } 
} 

당신은 물론, 사용할 수 LINQ를 :

class Bint 
{ 
    int num; 
    public bool this[int num] 
    { 
    get {return num << n & 0x1 == 1;} 
    } 
    public int Num 
    { 
    get {return num;} 
    set {num = value;} 
    } 
} 

및 숫자를 반복 :

var result = from b1 in new[] { false, true } 
      from b2 in new[] { false, true } 
      from b3 in new[] { false, true } 
      from b4 in new[] { false, true } 
      ... 
      where MyMethod(b1, b2, b3, b4, ...) 
      select new { b1, b2, b3, b4, ... }; 
+0

나는 자러 갈거야, 거의 새벽 3시에 일찍 일어나야 해. 내일 알게 될거야.하지만 내가 볼 수있는 것에서는 효과가있을 거라고 생각해! :) thanks – waclock

+0

이것이 적용될 수있는 방법은 없지만 많은 X 변수 (내가 얼마나 많은 부울을 가지는지 알지 못한다는 것은 사용자가 선택하는 것에 달려 있음을 의미합니다). 저는 syntaxys에 익숙하지 않아서 묻습니다. :) – waclock

0

이 같은 클래스를 정의 :

Bint n = new Bint(); 
for (int i = 0; i < Math.pow(2,10); i++) 
{ 
n.Num = i; 
f(n[0],n[1]...); 
} 
0

저는 이것이 오래된 질문이지만 waclock의 대답은 컴파일되지 않습니다 (C#에는 지수 연산자가 없음). DTB의 응답이 방법의 99 %를 얻을 수 있지만,이 대답이 제공하는 것입니다 논리 값의 알 수없는 번호를 처리하지 않습니다

var props = typeof(TypeWithBooleans).GetProperties().Where(prop => prop.PropertyType == typeof(bool)).ToArray(); 

for (var i = 0; i < (1 << props.Length); ++i) 
{ 
    var combination = Enumerable.Range(0, props.Length).Select(j => (i & (1 << j)) != 0).ToArray(); 
    if (MyMethod(combination)) { 
     // handle match 
    }; 
} 

이 가정을 당신이 하나의 클래스에 국한되어 관심있는 모든 논리 값/struct이고, MyMethod은 params 배열을 사용합니다.

관련 문제