稳定婚姻算法变体的Python代码修改求助:多候选匹配优化
稳定婚姻算法(Stable Marriage Algorithm)Python实现修改求助
现有实现说明
1. 变量定义
wanteds:长度为N的数字列表,示例:
wanteds = [35, 76, 88, 76, 27, 98, 29, 88, 88, 71, 88, 93, 26, 26, 8]
preferences:包含N个唯一键的字典,每个键对应一个数字列表(元素顺序代表优先级),示例:
preferences = {'A': [34, 76, 59], 'B': [22, 27], 'C': [27, 22], 'D': [23], 'E': [24], 'F': [25], 'G': [26], 'H': [27], 'I': [28], 'J': [29], 'K': [30], 'L': [31], 'M': [32], 'N': [33], 'O': [34]}
2. 算法规则
返回一个字典,键为preferences的所有键,值为唯一数字:
- 若数字存在于
wanteds且在对应偏好列表中则分配,否则为-1 wanteds中数字仅可使用一次,需遵循优先级规则
3. 现有代码
def stable_matching(wanteds: list, preferences: dict): result = {} for preference_name, preference_numbers in preferences.items(): for preference_number in preference_numbers: if preference_number in wanteds: wanteds.remove(preference_number) result[preference_name] = (preference_number, preference_numbers.index(preference_number)) break current_preference_name_preference_number_index = preference_numbers.index(preference_number) for old_result_name, old_result_made in result.items(): if old_result_made[0] == preference_number and old_result_made[1] > current_preference_name_preference_number_index: result[preference_name] = (preference_number, preference_numbers.index(preference_number)) result.pop(old_result_name) break for preference_name, preference_numbers in preferences.items(): if preference_name not in result: result[preference_name] = -1 else: result[preference_name] = result[preference_name][0] return dict(sorted(result.items())) wanteds = [35, 76, 88, 76, 27, 98, 29, 88, 88, 71, 88, 93, 26, 26, 8] # wanteds = [[35, 28], [76], [88], [76], [27], [98], [29], [88], [88], [71], [88], [93], [26], [26], [8]] preferences = {'A': [34, 76, 59], 'B': [22, 27], 'C': [27, 22], 'D': [23], 'E': [24], 'F': [25], 'G': [26], 'H': [27], 'I': [28], 'J': [29], 'K': [30], 'L': [31], 'M': [32], 'N': [33], 'O': [34]} result = stable_matching(wanteds, preferences) print(result)
修改需求
1. 数据结构变更
将wanteds改为嵌套列表结构,示例:
[[35, 28], [76], [88], [76], [27], [98], [29], [88], [88], [71], [88], [93], [26], [26], [8]]
2. 匹配规则更新
- 对于
wanteds中的子列表,若前一个数字未被分配,则尝试分配下一个数字 - 分配需遵循原优先级规则,且可能需要重新评估已形成的匹配对
3. 预期结果
{'A': 76, 'B': -1, 'C': 27, 'D': -1, 'E': -1, 'F': -1, 'G': 26, 'H': -1, 'I': 28, 'J': 29, 'K': -1, 'L': -1, 'M': -1, 'N': -1, 'O': -1}
请求修改上述Python代码,以支持新的wanteds结构及匹配规则。
内容的提问来源于stack exchange,提问作者RamboSushi
相关产品推荐
相关产品推荐

