我在编写解决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)
答案 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