解决匹配游戏的包。
matching的Python项目详细描述
用于解决匹配游戏的软件包。
一个匹配博弈是由两组博弈者定义的。一组中的每个玩家都有一个 排名偏好列表中的那些,目的是找到一些 两盘之间的映射使得没有一对选手不高兴。这个 术语“映射”和“不快乐”的上下文依赖于 正在进行的特定游戏,但主要与 配对
在matching中,我们处理三种类型的匹配游戏:
- 稳定婚姻问题
- 住院医师分配问题(HR);
- 学生分配问题。
使用播放器
对于所有这些游戏,matching使用一个Player类来表示 “申请”党成员,即居民和学生。对于HR和SA, 有特定的类来表示Hospital,^{tt5}的角色$ 和Supervisor。
对于SM实例,我们需要两个Playerinstances列表–一个用于 每一方详细说明他们的偏好。
考虑以下在二部图上表示的问题。
我们在这个游戏中按照以下方式构建玩家:
>>> from matching import Player
>>> suitors = [Player(name="A"), Player(name="B"), Player(name="C")] >>> reviewers = [Player(name="D"), Player(name="E"), Player(name="F")] >>> (A, B, C), (D, E, F) = suitors, reviewers
>>> A.set_prefs([D, E, F]) >>> B.set_prefs([D, F, E]) >>> C.set_prefs([F, D, E])
>>> D.set_prefs([B, C, A]) >>> E.set_prefs([A, C, B]) >>> F.set_prefs([C, B, A])
然后为了解决这个匹配游戏,我们使用StableMarriage类, 喜欢这样:
>>> from matching.games import StableMarriage >>> game = StableMarriage(suitors, reviewers) >>> game.solve() {A: E, B: D, C: F}
注
这种匹配并不是一个标准的python字典,尽管它在很大程度上看起来 表现得像一个它实际上是Matching类的一个实例:
>>> matching = game.matching >>> type(matching) matching.matching.Matching
这个类似字典的对象主要用作一个教学设备,它可以简化 在找到解决方案后处理匹配的过程
使用词典
对于更大的游戏实例,直接创建玩家(如上所述)可以是 不合理的乏味另一种方法是创建一个游戏实例 来自python字典。例如,考虑以下HR实例:
有五个居民——艾达、山姆、乔、吕克、丹尼——申请在三点工作 医院:慈悲,城市,将军。每家医院都有两个职位 玩家之间的偏好如下:
这些信息可以通过一些字典来表达,例如:
>>> resident_prefs = { ... "A": ["C"], ... "S": ["C", "M"], ... "D": ["C", "M", "G"], ... "J": ["C", "G", "M"], ... "L": ["M", "C", "G"], ... } >>> hospital_prefs = { ... "M": ["D", "J"], ... "C": ["D", "A", "S", "L", "J"], ... "G": ["D", "A", "J", "L"], ... } >>> capacities = {hosp: 2 for hosp in hospital_prefs}
然后,类似地,使用HospitalResident类来解决这个游戏,但是 实例是使用create_from_dictionaries类方法创建的:
>>> game = HospitalResident.create_from_dictionaries( ... resident_prefs, hospital_prefs, capacities ... ) >>> game.solve() {M: [L, S], C: [D, A], G[J]}
注
尽管在这里传递了字符串字典,但匹配显示了 matching玩家:
>>> matching = game.matching >>> for hospital in matching: ... print(type(hospital)) <class 'matching.players.hospital.Hospital'> <class 'matching.players.hospital.Hospital'> <class 'matching.players.hospital.Hospital'>
这是因为create_from_dictionaries创建了 玩家先上课,然后把他们传给游戏班。使用字典,比如 这是一种创建大型游戏的有效方法,但它确实需要 每队球员的名字必须是唯一的
联系一下!
我希望这个软件包有用,可以在这里联系我(或者在twitter上: @daffidwilde)有任何问题或 建议。欢迎光临