【发布时间】:2018-11-04 20:30:26
【问题描述】:
ra_position_preferences = {"yoder3":["J","E","T","S","M","R","B","SS"],
"yoder4":["J","E","S","T","M","R","SS","B"],
"kratz3":["M","J","S","E","T","R","B","SS"],
"miller3":["S","M","J","E","T","R","B","SS"],
"nofloor":["SS","B","R","T","S","M","E","J"]}
applicants_floor_prefernce ={"J":["yoder3","yoder4","kratz3","miller3","nofloor"],
"E":["yoder3","yoder4","kratz3","miller3","nofloor"],
"S":["kratz3","miller3","yoder3","yoder4","nofloor"],
"M":["kratz3","miller3","nofloor","yoder3","yoder4"],
"T":["nofloor","yoder4","yoder3","kratz3","miller3",],
'SS':["yoder3","yoder4","kratz3","miller3","nofloor"],
'R':["kratz3","miller3","yoder3","yoder4","nofloor"],
'B':["yoder4","yoder3","kratz3","miller3","nofloor"]}
在上述字典中,所有值都是键的首选项。就像匹配问题https://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/01StableMatching.pdf 一样。我试图在这里获得所有可能的偏好组合,而不会出现内存错误。此外,我将我得到的每一个组合都放入大风沙普利算法中,以获得所有可能的匹配。我的代码如下:
def sensitivity_analysis(dic1,dic2): #gives all the possible combinations of the preferences
a=copy.deepcopy(dic1)
b=copy.deepcopy(dic2)
length_a=len(a.keys())
length_b=len(b.keys())
items_a=list(a.keys())
items_b=list(b.keys())
a_variants = [dict(zip(items_a, values))
for values in product(permutations(items_b), repeat=length_a)]
b_variants = [dict(zip(items_b, values))
for values in product(permutations(items_a), repeat=length_b)]
all_variants = product(a_variants, b_variants)
contains_a=[]
contains_b=[]
for i,j in all_variants:
contains_a.append(i)
contains_b.append(j)
return contains_a,contains_b
从上面的代码中我得到了内存错误。还有其他方法吗?我的建议是一次获得一个组合并将其插入 gale-shapley 函数并获得匹配。然后将匹配项附加到字典中。如果新匹配与上一个相同,我们可以删除新匹配以节省数组中的内存。但仍将是 2.78 亿次计算。你们有什么有效的方法让我可以在我有 16 GB RAM 的电脑上运行它吗?
【问题讨论】:
-
抱歉,每个组合应该包括什么?似乎每个键都包含所有可用选项,因此不清楚这里应该提供哪些组合。我不确定你想要达到什么目的......
-
@duhaime 上面的字典是按特定顺序排列的,因为这里的所有值都是首选项。所以在第一本字典中 Yoder 3 有 8 个偏好。 Yoder 3 的第一偏好是 J,比 E,比 T 等等。我正在尝试获得具有不同偏好的所有组合。例如,在下一个组合中,Yoder 3 的第一个和第二个首选项可以滑动位置,其余的将保持不变,并且所有其他首选项在两个字典的所有其他键中都将保持不变。因此对于上述情况,将有 8^5 * 5^8 种不同的组合。
-
举一个预期的“偏好组合”的例子。请在您的问题中说明作为代码的输出(而不是作为评论)。
标签: python list dictionary combinations itertools