交叉发布此from CS Theory,因为它更像是一个软件问题。
我需要一个用于计算精确MIN-DOM-SET的代码。目前,建议的最佳选择是将其作为SMT问题制定并将其投放到SMT求解器。
如果有任何好的MIN-DOM-SET特定代码或良好的SMT-LIB配方,那就很好奇。
答案 0 :(得分:1)
我使用新的Optimize功能在Z3的Python绑定中coded one up。
def min_dom_set(graph):
"""Try to dominate the graph with the least number of verticies possible"""
s = Optimize()
nodes_colors = dict((node_name, Int('k%r' % node_name)) for node_name in graph.nodes())
for node in graph.nodes():
s.add(And(nodes_colors[node] >= 0, nodes_colors[node] <= 1)) # dominator or not
dom_neighbor = Sum ([ (nodes_colors[j]) for j in graph.neighbors(node) ])
s.add(Sum(nodes_colors[node], dom_neighbor ) >= 1 )
s.minimize( Sum([ nodes_colors[y] for y in graph.nodes() ]) )
if s.check() == sat:
m = s.model()
return dict((name, m[color].as_long()) for name, color in nodes_colors.iteritems())
raise Exception('Could not find a solution.')