List 使用约束遍历0和1的列表

List 使用约束遍历0和1的列表,list,algorithm,maximization,List,Algorithm,Maximization,我的道歉如果这是在某处回答,我尝试搜索,但我不知道这类问题是否有一个特定的名称,所以在我的搜索中没有出现任何问题 我有一个对象列表,每个对象都可以被接受或拒绝。每个组合都指定了一个值,而某些组合无效。(例如,我们有4个对象,对象1和2不在一起,那么接受对象1和2的每个组合都是无效的。)事先不知道哪些对象不在一起,也不可能通过查看对象对来找到无效的对象。(例如,对象1、2可能同时有效,对象2、3可能有效,对象1、3可能有效,但1、2、3可能无效。)我将其建模为0和1的列表,因此现在我想遍历这些列表

我的道歉如果这是在某处回答,我尝试搜索,但我不知道这类问题是否有一个特定的名称,所以在我的搜索中没有出现任何问题

我有一个对象列表,每个对象都可以被接受或拒绝。每个组合都指定了一个值,而某些组合无效。(例如,我们有4个对象,对象1和2不在一起,那么接受对象1和2的每个组合都是无效的。)事先不知道哪些对象不在一起,也不可能通过查看对象对来找到无效的对象。(例如,对象1、2可能同时有效,对象2、3可能有效,对象1、3可能有效,但1、2、3可能无效。)我将其建模为0和1的列表,因此现在我想遍历这些列表,以高效地找到具有最大值的列表

我的想法是像一棵树一样遍历列表,从所有的零开始,然后在每一步中将一个零翻转为一,例如,对于3个对象,这将生成一棵树

                000
            /    |    \
        100     010     001
        / \     / \     / \
      110 101 110 011 101 011
        \  \   \   /   /   /
                111
这实际上比只列出所有2^n选项更糟糕,因为存在重复项,但在每个节点上,如果发现无效,我可以停止。保存无效的节点组合并保留所有已访问节点的列表,我可以确保不重新访问已检查的节点。(但如果已经访问过,我仍然需要检查)


有更好的方法吗?

您可以尝试构建变体树(正如您所注意到的,最多2^n个选项),但要尽早删除不合适的分支

在下面的示例中,我设置了两个二进制掩码-1,2,3和2,4

def buildtree(x, maxsize, level, masks):
    if level == maxsize:
        print("{0:b}".format(x).zfill(maxsize))
    else:
        buildtree(x, maxsize, level + 1, masks)
        t = x | (1 << level)
        good = True
        for m in masks:
            if (t & m) == m:
                good = False
                break
        if good:
            buildtree(t, maxsize, level + 1, masks)

buildtree(0, 4, 0, [7, 10])

0000
1000
0100
1100
0010
0110
0001
1001
0101
1101
0011
def构建树(x、maxsize、级别、掩码):
如果级别==最大大小:
打印(“{0:b}”.format(x).zfill(maxsize))
其他:
构建树(x,maxsize,级别+1,掩码)

t=x |(1您可以尝试构建变体树(正如您所注意到的,最多2^n个选项),但要尽早切断不合适的分支

在下面的示例中,我设置了两个二进制掩码-1,2,3和2,4

def buildtree(x, maxsize, level, masks):
    if level == maxsize:
        print("{0:b}".format(x).zfill(maxsize))
    else:
        buildtree(x, maxsize, level + 1, masks)
        t = x | (1 << level)
        good = True
        for m in masks:
            if (t & m) == m:
                good = False
                break
        if good:
            buildtree(t, maxsize, level + 1, masks)

buildtree(0, 4, 0, [7, 10])

0000
1000
0100
1100
0010
0110
0001
1001
0101
1101
0011
def构建树(x、maxsize、级别、掩码):
如果级别==最大大小:
打印(“{0:b}”.format(x).zfill(maxsize))
其他:
构建树(x,maxsize,级别+1,掩码)
t=x |(1)