2

我正在尝试找到一种允许我执行以下操作的算法:假设我有 10 个布尔变量,并且我想尝试每个组合,因为我的目标是找到任何组合作为结果给我的一个methods true (这种方法有很多限制,这就是为什么我要测试所有可能的组合,如果没有可以解决问题的组合,那么我想通知用户)。我希望这是可以理解的!

4

4 回答 4

8

试试这个:

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:

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, ... };
于 2012-09-19T05:08:11.863 回答
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 变为 11111111,其中每个数字取值 0 或 1,可以表示为布尔值。在此示例中,如果未找到组合,则该方法将返回 null。

于 2012-10-26T14:42:11.347 回答
1

我知道这是一个老问题,但 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
    };
}

这假设您关心的所有布尔值都局限于单个类/结构,并且MyMethod使用 params 数组。

于 2017-04-29T03:52:31.520 回答
0

定义一个这样的类:

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

并遍历数字:

Bint n = new Bint();
for (int i = 0; i < Math.pow(2,10); i++)
{
 n.Num = i;
 f(n[0],n[1]...);
}
于 2012-09-19T05:13:07.583 回答