在 Python 中使用 TWIST 在二分图中查找周期的代码

Code for finding cycles in a bipartite graph with a TWIST in Python

提问人:George 提问时间:9/15/2023 最后编辑:George 更新时间:9/15/2023 访问量:38

问:

我正在努力寻找一个工作代码来查找二分图中的循环,其中每行代表一个人偏好的列表,所有偏好都包含在一个大列表中。列表代表一个人的偏好。这里的转折点是,在第一次迭代中,我们只首先查看所有人的首选。当找到一个循环时,循环中的玩家将被移除。在第二次迭代中,每个人都指向他们的首选人选,因此,例如,如果人 2 的首选是人 1,但人 1 出现在一个循环中,我们应该查看第二人称、第三人称、第四人称或第二人称的任何偏好。当找不到循环时,代码应该完成,并应列出找到的循环。

我编写了以下代码:

def find_and_remove_cycles(preferences_dict):
    def find_match(preferences_dict, person):
        for choice in preferences_dict[person]:
            if choice not in matched:
                matched.add(choice)
                return choice
        return None

    cycles = []
    while True:
        matched = set()
        cycle = None
        for person in preferences_dict:
            if person not in matched:
                while True:
                    choice = find_match(preferences_dict, person)
                    if choice is None:
                        break
                    if choice in matched:
                        cycle = [person, choice]
                        break
                    matched.add(person)
        if not cycle:
            break
        cycles.append(cycle)
        for person in cycle:
            del preferences_dict[person]

    return cycles

# Example preferences as a dictionary
preferences_dict = {
    1: [2, 3, 4],
    2: [3, 1, 4],
    3: [2, 1, 4],
    4: [1, 2, 3]
}

cycles = find_and_remove_cycles(preferences_dict)
print("Cycles found:", cycles)

输出给出了周期 [1,2] 和 [3,4],但周期应该是 [2,3] 和 [1,4]。

有人可以帮我吗,因为我现在已经被困了 2 天......

注意:我在这里使用了字典,正如其他人在 StackOverflow 上建议的那样,但列表中的列表是我更喜欢的。

谢谢!

python 算法 图论 匹配 二分法

评论

0赞 MrSmith42 9/15/2023
你有一个很好的失败小示例,所以开始调试以找出你的代码行为与预期不同的位置。
0赞 George 9/15/2023
就是这样。我整天都在调试,但似乎找不到错误。我认为循环的定义出了点问题,因为在第一次迭代中 1 与 2 匹配,这是不可能的,因为弧线不会回到 1......@MrSmith42
0赞 George 9/15/2023
你说得对@ravenspoint,谢谢!我会改变它。
1赞 ravenspoint 9/15/2023
“一个列表代表一个人的偏好”是多余的。你没有澄清这些偏好是针对其他人的。
0赞 George 9/15/2023
那你能帮我改变它吗,因为你可以编辑它?英语不是我的第一语言,所以澄清它不是那么简单。尽管如此,我希望你能明白我的意思。

答: 暂无答案