python - 从偏好列表中找到可行的组合
问题描述
我有一个看起来像这样的对象:
a - ['A', 'B', 'C']
b - ['A', 'B', 'C']
c - ['A', 'B', 'C', 'D']
d - ['A', 'B', 'C', 'D']
每个键都有许多可用的选项,如列表所示(例如a
,可以选择A, B, C
等等)。我想找到一个能让每个人都满意的组合。这可能是:
# Chosen Remaining Available Options
------------------------------------------
a - B - ['A', 'B', 'C'] - ['A', 'B', 'C']
b - A - ['A', 'C'] - ['A', 'B', 'C']
c - D - ['C', 'D'] - ['A', 'B', 'C', 'D']
d - C - ['C'] - ['A', 'B', 'C', 'D']
所以在上面的例子中a
选择了 item B
,减少了剩余参与者的可用选项池。b
然后选择 item A
,依此类推。
我通过根据所有参与者的可用选择池的大小循环访问所有参与者来做到这一点,其想法是,如果我有一个参与者只想要一个项目,那么别无选择,只能给他那个项目,将其从游泳池。
import random
team_choices = {'a': ['A', 'B', 'C'],
'b': ['A', 'B', 'C'],
'c': ['A', 'B', 'C', 'D'],
'd': ['A', 'B', 'C', 'D']}
teams_already_created = []
for team_b in sorted(team_choices, key=team_choices.__getitem__, reverse=False):
available_opponents = [opponent for opponent in team_choices[team_b] if opponent not in teams_already_created]
chosen_opponent = random.choice(available_opponents)
teams_already_created.append(chosen_opponent)
我这样做的方式并不总是很好,因为不能保证在某个时候它会做出一个稍后会扼杀其他玩家的选择,让他没有可用的选择。如果chosen_opponent
是空的,那么显然这将失败。
有没有更好的方法可以每次都有效?
解决方案
这就是寻找最大匹配的问题。有多项式时间算法(例如,Hopcroft–Karp)。
推荐阅读
- azure - 未强制执行 Azure 策略
- python - 线性回归图真的很糟糕
- excel - 两张纸之间的vba代码中的Vlookup没有返回任何值?
- angular - 在 html Angular 中重复使用相同的组件实例两次
- python-3.x - 我如何解码字节字符串以存储在没有空字节和人类可读的字符串变量中?
- vue.js - 如何在 vuejs 中使用 Electron webview?
- python - 列出来自 s3 的所有目录和子目录路径
- c# - Dotnet 3.0.103 - JsonConvert.DeserializeObject 期望很好的转义字符串,而不是普通的 Json
- c++ - 为什么导出的 dll 类在客户端程序中给我内存访问冲突?[解决了]
- node.js - 如何使用 NodeJS 在 POST 上接收文本