我在Python中的图形收缩算法表现得很奇怪
我已经为这个问题写了一些代码。(蟒蛇27) 图形表示为具有冻结集键和冻结集集的字典:我在Python中的图形收缩算法表现得很奇怪,python,algorithm,graph,Python,Algorithm,Graph,我已经为这个问题写了一些代码。(蟒蛇27) 图形表示为具有冻结集键和冻结集集的字典: sample_graph = {frozenset([7]): set([frozenset([4]), frozenset([5]), frozenset([3])]), frozenset([5]): set([frozenset([7]), frozenset([2]), frozenset([1])]), frozenset([3]): set([frozenset([7]), frozenset([4
sample_graph = {frozenset([7]): set([frozenset([4]), frozenset([5]), frozenset([3])]), frozenset([5]): set([frozenset([7]), frozenset([2]), frozenset([1])]), frozenset([3]): set([frozenset([7]), frozenset([4]), frozenset([2]), frozenset([1])]), frozenset([6]): set([frozenset([4]), frozenset([2]), frozenset([1])]), frozenset([4]): set([frozenset([6]), frozenset([7]), frozenset([3]), frozenset([1])]), frozenset([1]): set([frozenset([6]), frozenset([4]), frozenset([5]), frozenset([2]), frozenset([3])]), frozenset([2]): set([frozenset([6]), frozenset([5]), frozenset([3]), frozenset([1])])}
输出应该是只有两个节点的图,这两个节点是图中所有节点的冻结集。在这一点上,它遇到了KeyError
def kargerMinCut(graph):
if len(graph) == 2:
return graph
u = random.choice(graph.keys()) # u and v are frozensets, idea is that they form
v = random.choice(list(graph[u])) # a clique in a single frozenset
for node in graph:
if node != u and node != v:
links = graph[node]
if u in links or v in links:
links.add(frozenset(tuple(u | v))) # combine u and v to form one link
links.discard(u) # delete old links to u and v
links.discard(v)
graph[node] = links
graph[u | v] = graph[u] | graph[v] # new key for u and v
del graph[u], graph[v] # u and v are no longer needed
return kargerMinCut(graph)
我认为问题可能是使用了
is
关键字。注意,在Python中,不是
,不如试试!=
我曾经在python中遍历图形中的元素时遇到过同样的问题。:)
PS——另外,如果,我会把下面这行写成完整的:
links.add(frozenset(tuple(u | v))) if u in links or v in links else None
Thnx!我尝试了您建议的方法,但不幸的是,循环仍然没有改变一分钱。问题最终是什么?if node!=u和节点!=v
阻止从u
节点中的u
到v
的链接被删除,反之亦然,这最终导致了一个关键错误。此条件应仅在此处links.add(frozenset(tuple(u | v))
请修正缩进以匹配正在运行的代码。此外,如果您提供了输入、预期返回值和实际返回值,这也会有所帮助。缩进仅在def所在的第一行发生冲突。我将添加示例图形输入,但它是随机算法,因此我无法准确地判断输出结果。@AndrewSokolowski在这种情况下,我将制作一个小演示图形,并选择specificu
和v
。最好从一个您知道应该发生什么的示例开始,以帮助您确定代码是否按预期工作:一天,爱丽丝来到一个岔路口,看见一只柴郡猫在树上。我该走哪条路?她问。你想去哪里?这是他的回答。我不知道,爱丽丝回答。那么,猫说,没关系。“:)你完全正确。由于我的不耐烦,我花了一整天的时间试图解决200个顶点图的实际问题,这已经对我隐藏了很多错误。在仔细研究了更小图形的输出后,在几分钟内发现了错误。艰苦的学习:)thnx为了获得帮助和引用,它充分描述了我在做什么:)