求解python中最大布尔可满足性问题的算法

时间:2014-01-29 20:54:18

标签: python recursion boolean

我在编写解决python中最大布尔可满足性问题的算法时遇到了一些麻烦。我应该实现一个求解函数,该函数接受一个参数f(对应于公式的python函数),该函数返回满足f且具有尽可能最大True值的值的列表。 我得到了以下帮助函数:

def count(values):
    return len([v for v in values if v == True])

可以这样使用:

count([True, False, True, False])
    2

这是给出的确切问题:

实现一个递归函数solve(f),它将第一个参数作为单个函数f(即对应于公式的Python函数)。函数f可以采用任何非零数量的参数。函数solve(f)应该返回一个满足f的值列表,并且具有尽可能多的True值(与满足f的任何其他值列表一样多)。

这是我到目前为止所拥有的:

def solve(f, values = []):
    if (len(values) == len(variables(f))):
        if(f(*values) == True):
            return values

这基本上是基本情况。但现在我完全卡住了。

如果有人可以为我完成这个,并解释他们做了什么,我将永远感激不尽!

非常感谢!

编辑1: 这是函数变量(f)

def variables(f):
    return list(f.__code__.co_varnames)

1 个答案:

答案 0 :(得分:0)

我不知道这是否是最优的,但这是一个简单的递归解决方案,可以测试所有可能的输入:

def solve(f, values=[]):
    if len(variables(f)) == len(values):
        if f(*values):
            return values
        else:
            return None

    true_results = solve(f, values+[True])
    false_results = solve(f, values+[False])
    if false_result is None:
        return true_result
    if true_result is None or count(false_result) > count(true_result):
        return false_result
    return true_result