Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 缺少一个约束的约束满足问题_Python_Algorithm_Python Constraint - Fatal编程技术网

Python 缺少一个约束的约束满足问题

Python 缺少一个约束的约束满足问题,python,algorithm,python-constraint,Python,Algorithm,Python Constraint,我是这所大学的一名实验室实习导师,根据去年学生的评论,我们想让我的老板和我解决这些问题。我的老板选择编写一个C脚本,我选择python(python约束)来解决我们的问题 信息 共有6节课 有4个角色 有6种做法 有32名学生 每个队有4名学生 问题: 将每个学生分配到4个角色,在4个不同的课程中进行4次练习 限制条件: 学生应该扮演一个角色 学生应在6个练习中进行4个不同的练习 学生每节课只能做一次练习 学生只能与同一配偶见面一次 模板: 这是我对学生的感觉,每个团队由4名学生组成,职位[

我是这所大学的一名实验室实习导师,根据去年学生的评论,我们想让我的老板和我解决这些问题。我的老板选择编写一个C脚本,我选择python(python约束)来解决我们的问题

信息
  • 共有6节课
  • 有4个角色
  • 有6种做法
  • 有32名学生
  • 每个队有4名学生
问题: 将每个学生分配到4个角色,在4个不同的课程中进行4次练习

限制条件:
  • 学生应该扮演一个角色
  • 学生应在6个练习中进行4个不同的练习
  • 学生每节课只能做一次练习
  • 学生只能与同一配偶见面一次
  • 模板: 这是我对学生的感觉,每个团队由4名学生组成,职位[0、1、2或3]是分配给他们的角色。每个可用位置的编号范围为1到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]],
    [[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