我在Python中的图形收缩算法表现得很奇怪

我在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

我已经为这个问题写了一些代码。(蟒蛇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]), 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中, > 只有当两个参数引用完全相同的对象时才返回true(在C++中等效于<代码> char *= char */COD> >。如果代码内容相同(等于C++中的代码> String=String < /Cord>>),则返回true。 因此,与其说
不是
,不如试试
!=

我曾经在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在这种情况下,我将制作一个小演示图形,并选择specific
u
v
。最好从一个您知道应该发生什么的示例开始,以帮助您确定代码是否按预期工作:一天,爱丽丝来到一个岔路口,看见一只柴郡猫在树上。我该走哪条路?她问。你想去哪里?这是他的回答。我不知道,爱丽丝回答。那么,猫说,没关系。“:)你完全正确。由于我的不耐烦,我花了一整天的时间试图解决200个顶点图的实际问题,这已经对我隐藏了很多错误。在仔细研究了更小图形的输出后,在几分钟内发现了错误。艰苦的学习:)thnx为了获得帮助和引用,它充分描述了我在做什么:)