Python 缺少一个约束的约束满足问题
我是这所大学的一名实验室实习导师,根据去年学生的评论,我们想让我的老板和我解决这些问题。我的老板选择编写一个C脚本,我选择python(python约束)来解决我们的问题 信息Python 缺少一个约束的约束满足问题,python,algorithm,python-constraint,Python,Algorithm,Python Constraint,我是这所大学的一名实验室实习导师,根据去年学生的评论,我们想让我的老板和我解决这些问题。我的老板选择编写一个C脚本,我选择python(python约束)来解决我们的问题 信息 共有6节课 有4个角色 有6种做法 有32名学生 每个队有4名学生 问题: 将每个学生分配到4个角色,在4个不同的课程中进行4次练习 限制条件: 学生应该扮演一个角色 学生应在6个练习中进行4个不同的练习 学生每节课只能做一次练习 学生只能与同一配偶见面一次 模板: 这是我对学生的感觉,每个团队由4名学生组成,职位[
- 共有6节课
- 有4个角色
- 有6种做法
- 有32名学生
- 每个队有4名学生
[#学期
[#会议
[#实践/团队
1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]],
[[25, 26, 27, 28],
[29, 30, 31, 32],
[33, 34, 35, 36],
[37, 38, 39, 40],
[41, 42, 43, 44],
[45, 46, 47, 48]],
[[49, 50, 51, 52],
[53, 54, 55, 56],
[57, 58, 59, 60],
[61, 62, 63, 64],
[65, 66, 67, 68],
[69, 70, 71, 72]],
[[73, 74, 75, 76],
[77, 78, 79, 80],
[81, 82, 83, 84],
[85, 86, 87, 88],
[89, 90, 91, 92],
[93, 94, 95, 96]],
[[97, 98, 99, 100],
[101, 102, 103, 104],
[105, 106, 107, 108],
[109, 110, 111, 112]],
[[113, 114, 115, 116],
[117, 118, 119, 120],
[121, 122, 123, 124],
[125, 126, 127, 128]]]
换言之:
这是一次会议:
[[1,2,3,4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]],
这些团队采用相同的做法:
[
[1, 2, 3, 4],
[25, 26, 27, 28],
[49, 50, 51, 52],
[73, 74, 75, 76],
[97, 98, 99, 100],
[113, 114, 115, 116]
]
这些职位的作用相同:
[
1.
5.
9,
13,
17,
21,
25,
...
]
到目前为止,我所拥有的:
使用我能够验证前三个约束:
有效解决方案:False
-会话:[真的,真的,真的,真的,真的,真的]
-练习:[真的,真的,真的,真的,真的,真的]
-角色:[真的,真的,真的,真的]
-团队:[假,假,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假]
对于那些可能感兴趣的人,我只是这样做:
对于我使用的每个条件。例如,对于一个会话,我会:
problem.addConstraint(AllDifferentConstraint(),[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24])
我无法找到约束团队的方法,我在整个学期中的最后一次尝试是:
def团队约束(自我,*学期):
学生=defaultdict(列表)
#根据[#学期[#课时[#练习/团队]的形式返回每个团队。。。
团队=[列表(学期[i:i+4]),范围为(0,len(学期),4)]
#更新学生与所有同事的口述
对于团队中的团队:
对于团队中的学生:
学生[student]+=[s代表团队中的s,如果s!=student]
#如果每个学生与某人见面不止一次,则计算每个学生的人数
杜普利=[]
对于学生,在学生中配对。项()
附加(len(mate)-len(set(mate)))
#疯狂的约束,如果一个学生遇到某个0或某一次,他就会被发现
如果最大值(dupli)>=2:
打印(“配偶多次相遇”,dupli,最小(dupli),最大(dupli))
返回错误
警察公共关系科(学生)
返回真值
问题:
我的意思是,我不知道是否有可能给每个学生分配12名队友,每个人只与同一名队友见面一次
对于团队约束,我是否错过了一个性能更好的算法
有什么我能听懂的吗
只是一个排列算法的想法,因为每次迭代可以集中在每个学生或每个课程中的一个学生身上:
Session 1:
Roles
1,2,3,4
Students
1,2,3,4
(Note is 1st permutation 1234)
Sess 2 for student 1
Roles 1234
Students 5,1,7,6
在这里,第1课时,学生2代替了学生1,继续这样做
Roles 1234
St 2,5,6,7
继续学生1
S3
R 1234
St 10,9,1,8
S4
R 1234
St 11,12,13,1
最后,您删除了student 1的交互,就像在下一次迭代的置换中删除了current
它就像一个rubiks立方体
如果你能用这个算法编码或者知道一些代码,请告诉我
也许用itertools
我认为,会话>多于实践与其数量无关。
当你用完的时候,只需要一些游泳池,或者更多的旋转空间。
也许可以先简化问题,针对4个课时=练习?主要问题的答案如下。。。
添加编辑
team: a gathering of 4 persons during a session
person (32): a participant of a team
session (6): time: eg, 8am -10am
role (4): what responsibility a person has in an action
task (6): type of action
A person does:
0..1 action per session-group
1 role per action
1 task per action
0..1 of each task
1 of each role in an action
4 persons in an action
A person meets each other person 0..1 times
An action requires exactly 4 people
我昨天又看了一眼你的问题(承认时间不长,因为我现在有很多工作要做),然后
首先,我看到你的“团队”实体,几乎就是我所说的“行动”实体,回想起来,我认为“团队”(或“团队”)是一个更好的词
如果您仍然觉得约束很难解决,我建议您将其分解,并单独处理—特别是团队/个人/会话约束,然后是角色/任务约束
/添加编辑
team: a gathering of 4 persons during a session
person (32): a participant of a team
session (6): time: eg, 8am -10am
role (4): what responsibility a person has in an action
task (6): type of action
A person does:
0..1 action per session-group
1 role per action
1 task per action
0..1 of each task
1 of each role in an action
4 persons in an action
A person meets each other person 0..1 times
An action requires exactly 4 people
我最近也遇到了类似的问题,最后转向了工具
特别是,看看护士排班问题:
无论如何,问题不在于
for p in all_persons:
for t in all_teams:
stuff = [b_vars[k] for k in filter(lambda i: i[2] == p and i[0] == t, b_vars)]
model.Add(sum(stuff) == 4) # persons per team == 4