Pet*_*erB 5 python prolog constraint-programming scipy clpfd
我每年都会帮助一个青年营.将参加者分配到卧室是一项艰巨的任务 - 有92间卧室,活动持续一周,与会者可以待上不同的时间,床需要重复使用.
目前需要一名志愿者〜一周时间将人员分配到房间.有很多规则可供遵循,因为并非所有与会者都会在整个一周内完成任务,而是在夜间进行.
我想自动完成任务.编程语言和计算成本是实现细节,我可以根据需要格式化输入数据/规则(包括代码生成).任何可以节省繁琐时间的东西......
我没有领域专业知识,所以首先我必须了解可能的方法.
约束编程似乎是明显的方法,因为有规则要遵循.但是规则不是二进制的,前一个线程向我介绍了软约束和成本函数.
当我阅读成本函数时,它指出了机器学习和神经网络.这些都很受欢迎,但我相信需要一组数据来训练它们,这是我没有的东西 - 我可以创建,但这需要花费更多的时间而不是手动分配.我已经知道了这些限制因素:我不必从数据中推断它们.
我找不到在网上,期刊等讨论的房间分配问题; 它必须是常见的,因此我缺少一些特定于域的术语.对于需要它的医院和酒店,我确信它已经得到很好的研究.
我也有一个概念性的问题.我可以看到我如何解决一个晚上,但我怎么想多个夜晚建模?
约束求解器(或其他技术)不知道时间(并且2016-09-05
之前不会知道2016-09-06
),但我需要输入人们住的夜晚并且每晚看到作业.
第二个是:系统如何输出分配给哪些卧室的人?在Prolog数独求解器(例如)中,可以有多个解决方案,但这有很多约束.对于模糊约束,我最终会得到人X在房间Y中的概率,以及他们也在房间Z中的概率(如果你愿意的话,量子叠加)?
必须手动调整的首次通过分配将节省时间.就像手动分配"复杂"的参与者(如夜间安全,谁在特定房间睡觉)并让计算机完成其余工作一样.
最初我想过从13年前复活我一个学期的Prolog知识,并为所有标准设置约束.这适用于一个非常简单的案例,但是一旦我超越了"必须"标准,我就失败了灰色规则和妥协.
所有规则都有不同的优先级 为了简化我的分组must
,should
和nice
.
must
同房性别
must
需要残障人士客房的人可以获得must
如果与会者需要一个带婴儿床的房间,他们必须得到它must
指定"必须与X共享"或"必须与Y&Z共享"的与会者必须被分配到同一个会议室
must/should
如果与会者需要一个房间,他们必须得到它,除非没有可能的解决方案should
按角色分组参加会议的与会者,例如"青年","青年领袖","厨师","领导者".有些角色比其他角色更适合混合.should
尽量减少跳房:一旦你有一张床,整晚都待在这里.除非没有可能的解决方案should
情侣优先客房配有双人床
nice
他们参加的大学会议室的参加者(如适用)nice
优先考虑带有卫浴设施的房间,以及非青年角色有更多的规则(例如,有饮食要求的人必须留在特定的建筑物中),但这提供了足够的例子.
每个房间的场地收费不是每个房间,所以尽量减少使用的房间数量并不重要 - 至少今年.
对餐厅和洗碗机的参加者必须进行类似的任务,但两者都要简单得多.
rooms:
room1:
building: Building1
capacity: 2
is_ensuite: yes
has_cot: yes
room2:
building: Building2
capacity: 4
is_ensuite: no
has_cot: yes
room3:
building: Building1
capacity: 2
is_ensuite: no
has_cot: yes
room4:
building: Building1
capacity: 4
is_ensuite: no
has_cot: no
room5:
building: Building1
capacity: 4
is_ensuite: no
has_cot: no
---
people:
albert:
must_share_with: @brenda
needs_cot: yes
role: leader
gender: m
arrive: 2016-09-05
depart: 2016-09-10
brenda:
role: no role
gender: f
arrive: 2016-09-06
depart: 2016-09-09
steve:
role: student
university: Cambridge
gender: m
arrive: 2016-09-07
depart: 2016-09-09
jason:
role: student
university: Bristol
gender: m
arrive: 2016-09-07
depart: 2016-09-09
brian:
role: tech
gender: m
arrive: 2016-09-05
depart: 2016-09-10
clare:
role: speaker
gender: f
arrive: 2016-09-08
depart: 2016-09-09
george:
role: band/after hours
gender: m
arrive: 2016-09-07
depart: 2016-09-08
sarah:
role: band/after hours
gender: f
arrive: 2016-09-07
depart: 2016-09-08
john:
role: band/after hours
gender: m
arrive: 2016-09-08
depart: 2016-09-09
janet:
role: band/after hours
gender: f
arrive: 2016-09-08
depart: 2016-09-09
Run Code Online (Sandbox Code Playgroud)
| Room | Capacity | 2016-09-05 | 2016-09-06 | 2016-09-07 | 2016-09-08 | 2016-09-09 | 2016-09-10 |
|-------|----------|------------|----------------|----------------|----------------|----------------|------------|
| room1 | 2 | albert | albert, brenda | albert, brenda | albert, brenda | albert, brenda | albert |
| room2 | 4 | | | jason, steve | jason, steve | jason, steve | |
| room3 | 2 | brian | brian | brian | brian | brian | brian |
| room4 | 4 | | | george | john | | |
| room5 | 4 | | | sarah | janet | | |
Run Code Online (Sandbox Code Playgroud)
或者(这是否可以接受取决于哪些角色可以共享房间,例如乐队成员在凌晨3点睡觉,技术人员早上6点起床):
| Room | Capacity | 2016-09-05 | 2016-09-06 | 2016-09-07 | 2016-09-08 | 2016-09-09 | 2016-09-10 |
|-------|----------|------------|----------------|----------------|----------------|----------------|------------|
| room1 | 2 | albert | albert, brenda | albert, brenda | albert, brenda | albert, brenda | albert |
| room2 | 4 | | | jason, steve | jason, steve | jason, steve | |
| room3 | 2 | brian | brian | brian, george | brian, john | brian | brian |
| room4 | 4 | | | sarah | janet | | |
| room5 | 4 | | | | | | |
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
411 次 |
最近记录: |