如何根据喜好安排每个人?

时间:2013-12-30 03:40:45

标签: python algorithm recursion

此问题来自CodeEval problem 118

  

您的团队正在搬到新办公室。为了让他们在新的地方感觉舒适,你决定让他们选择他们想要的座位。每个团队成员都会向您提供他/她认为可以接受的席位列表。您的目标是确定是否可以满足使用这些列表的每个人。

     

新办公室的座位数从1到N.每个团队成员给你的座位偏好列表未分类。

     

输入和输出示例:

1:[1, 3, 2], 2:[1], 3:[4, 3], 4:[4, 3] --> Yes # possible
1:[1, 3, 2], 2:[1], 3:[1] --> No # not possible

如何解决?


我尝试了什么?我认为解决方案是递归的,这是我到目前为止所提出的,但我认为我没有正确地将问题分解为较小的子问题。

def seat_team(num_seats, preferences, assigned):
    if len(preferences) == 1:
        for seat in range(len(preferences)):
            print preferences
            seat_wanted = preferences[0][1][seat]
            if not assigned[seat_wanted-1]:
                assigned[seat_wanted-1] = True
                return True, assigned
        return False, assigned
    else:
        for i in range(len(preferences)):
            current = preferences[i]
            for seat in current[1]:
                    found, assigned = seat_team(num_seats, [preferences[i]], assigned)
                    if not found:
                        return False
                    found, assigned = seat_team(num_seats, preferences[i+1:], assigned)
                    if not found:
                        return False
        return True

num_seats = 4
preferences = [(1,[1,3,2]), (2,[1]), (3,[4,3]), (4,[4,3])]
assigned = [False] * num_seats

print seat_team(4, preferences, assigned)

有什么想法吗?我确信这种问题有一个通用的名称,以及解决它的算法,但我无法在线找到类似的问题(或解决方案)。如果您知道,请分享示例,我真的很感激。

2 个答案:

答案 0 :(得分:5)

这是标准的最高Bipartite Matching问题。

集合S代表M个顶点,每个顶点属于一个成员,集合T代表N个顶点,每个顶点用于一个座位。如果i th 成员想要j th 席位,则从S i 到T j 存在边缘。这是二分图。如果maximum matching出现为M,那么我们就不会有解决方案。

答案 1 :(得分:3)

做吧。编写一个回溯算法,将人们分配到座位,如果每个人都可以坐下,则返回真/假。在小输入上测试它以检查它是否正确。然后在大输入上尝试它。根据需要进行优化。

优化的想法:

  1. 首先分配挑剔的人(拥有少量偏好)。
  2. 霍尔的婚姻定理为从人到座位的二分匹配提供了必要和充分的条件。所有人群之间必须有一些大于或等于他们自己号码的席位。显然,足够的条件太慢而无法检查(有2个n个子集),但是你可以通过定期测试剩下的人和坐着的人的必要条件来改进回溯算法。这减少了搜索空间通过先解雇分支机构。

  3. 在网站上试过。回溯算法得分为80.在进行第二次优化(定期检查霍尔条件)后得分为100

    我的代码。 https://github.com/hickford/codeeval-solutions/blob/master/seat-your-team-members/seat-your-team-members.py