gpt4 book ai didi

python - 具有重叠值的列表的排列

转载 作者:行者123 更新时间:2023-12-03 16:47:12 27 4
gpt4 key购买 nike

我哥哥是一名医学生,他带着问题来找我。他和他的 3 个同学不得不在两家医院之间轮换,比如 H1H2 .

  • H1有早类和夜类。早类是要求最高的一类,所以必须有两个人在那里。夜类可以由一个人负责,这个人将在第二天休息。
  • H2只有一个早类,一个人可以覆盖

  • 问题:
    我试图通过将其视为以下事件的排列来解决此问题:
  • H1 早类 ( H1_M )
  • H1 夜类 ( H1_N )
  • H2 类次 ( H2 )
  • 休息日 ( R )

  • 这些事件将具有以下限制:
  • 没有 24 小时轮类,所以 H1_N无法关注 H1_M
  • 休息日总是在夜类之后,所以 R永远追求H1_N
  • 1 名学生总是在休息日 除了 第一天,否则无解

  • 问题是如何创建 4 个时间表,每个学生一个,满足上述两个要求。
    尝试的解决方案:
    我已经创建了遵循上述规则的事件序列,
    import itertools

    # Possible sequences from the 4 events
    seq1 = ['H1_M', 'H1', 'H1_N', 'R']
    seq2 = ['H1_N', 'R', 'H1_M', 'H2']
    seq3 = ['H1_N', 'R', 'H2', 'H1_M']
    seq4 = ['H2', 'H1_N', 'R', 'H1_M']

    # All possible iterations
    it = list(itertools.permutations([seq1, seq2, seq3, seq4]))
    问题在于我不知道如何生成 4 个列表,其中 2 个在早类期间重叠 H1_M每天。如果有人可以给我任何指点我和我的兄弟将不胜感激,谢谢

    最佳答案

    让我们为人命名 p1 , p2 , p3 , 和 p4 .
    我要给类次编号 s1 , s2 , s3 , s4 , s5 , ...
    类次编号是按时间顺序排列的。
    偶数类次是夜类。
    奇数类是白类。

    +----+-------+
    | s1 | DAY |
    +----+-------+
    | s2 | NIGHT |
    +----+-------+
    | s3 | DAY |
    +----+-------+
    | s4 | NIGHT |
    +----+-------+
    | s5 | DAY |
    +----+-------+
    | s6 | NIGHT |
    +----+-------+
    这听起来像:
  • 每个夜类,我们需要 1 名医学生
  • 每个白类必须有 3 名医学生。
  • 人们不能连续轮类工作。从数学上讲,这意味着对于任何整数 a和任何整数 b如果有必要那个人p(a)工作类次s(b)那么就要那个人p(a)不轮类 s(b+1) (即人 p(a) 不可能轮类 s(b+1) )。

  • 一开始,我们不在乎每个人在什么医院工作。在我们弄清楚每个类次谁来上类之后,我们就可以决定将每个人送到哪家医院。
    第一个夜类有人要上类。谁是谁都无所谓。挑人 p1随意。
    +-------+-------+--------+
    | SHIFT | DAY | PEOPLE |
    | | OR | |
    | | NIGHT | |
    +-------+-------+--------+
    | s1 | DAY | ??? |
    +-------+-------+--------+
    | s2 | NIGHT | p1 |
    +-------+-------+--------+
    | s3 | DAY | |
    +-------+-------+--------+
    | s4 | NIGHT | |
    +-------+-------+--------+
    | s5 | DAY | |
    +-------+-------+--------+
    | s6 | NIGHT | |
    +-------+-------+--------+
    据推测,您不希望医学生连续轮类工作。所以, p1一定不能倒类 s1 .
    白类需要3人 s1 .白类只有3个人可以选择 s1
    +-------+-------+------------+
    | SHIFT | DAY | PEOPLE |
    | | OR | |
    | | NIGHT | |
    +-------+-------+------------+
    | s1 | DAY | p2, p3, p4 |
    +-------+-------+------------+
    | s2 | NIGHT | p1 |
    +-------+-------+------------+
    | s3 | DAY | |
    +-------+-------+------------+
    | s4 | NIGHT | |
    +-------+-------+------------+
    | s5 | DAY | |
    +-------+-------+------------+
    | s6 | NIGHT | |
    +-------+-------+------------+
    规则是如果 p1 轮类 s2 ,然后 p1 不轮类 s3
    +-------+-------+------------+
    | SHIFT | DAY | PEOPLE |
    | | OR | |
    | | NIGHT | |
    +-------+-------+------------+
    | s1 | DAY | p2, p3, p4 |
    +-------+-------+------------+
    | s2 | NIGHT | p1 |
    +-------+-------+------------+
    | s3 | DAY | not(p1) |
    +-------+-------+------------+
    | s4 | NIGHT | |
    +-------+-------+------------+
    这是一个问题。如 p1 不能轮类 s3 ,那么我们只有一种选择:
    +-------+-------+----------+------------+
    | SHIFT | DAY | QUANTITY | PEOPLE |
    | | OR | OF | |
    | | NIGHT | PEOPLE | |
    +-------+-------+----------+------------+
    | s1 | DAY | 3 | p2, p3, p4 |
    +-------+-------+----------+------------+
    | s2 | NIGHT | 1 | p1 |
    +-------+-------+----------+------------+
    | s3 | DAY | 3 | p2, p3, p4 |
    +-------+-------+----------+------------+
    | s4 | NIGHT | 1 | p1 |
    +-------+-------+----------+------------+
    我认为医学生应该改变他们工作的医院。人 p1 不应该每晚在 1 号医院上夜类。
    他们多久需要关闭一次?
    假设每个医学生都写下他们在每家医院工作了多少类次。是不是他们在所有其他医院至少完成了一个类次之后才能在一家医院进行第二个类次?
    如果医学生不能一直呆在同一家医院,那么拉双类制是不可避免的。
    我制定了一个看起来不错的时间表。
    每当您连续两个类次时,您都可以在接下来的两个连续类次中休息以恢复。
    +-------+-------+----------+--------+--------+--------+--------+
    | SHIFT | DAY | QUANTITY | p1 | p2 | p3 | p4 |
    | | OR | OF | | | | |
    | | NIGHT | PEOPLE | | | | |
    +-------+-------+----------+--------+--------+--------+--------+
    | s1 | DAY | 3 | work | | | snooze |
    +-------+-------+----------+--------+--------+--------+--------+
    | s2 | NIGHT | 1 | work | | | snooze |
    +-------+-------+----------+--------+--------+--------+--------+
    | s3 | DAY | 3 | snooze | work | | |
    +-------+-------+----------+--------+--------+--------+--------+
    | s4 | NIGHT | 1 | snooze | work | | |
    +-------+-------+----------+--------+--------+--------+--------+
    | s5 | DAY | 3 | | snooze | work | |
    +-------+-------+----------+--------+--------+--------+--------+
    | s6 | NIGHT | 1 | | snooze | work | |
    +-------+-------+----------+--------+--------+--------+--------+
    | s7 | DAY | 3 | | | snooze | work |
    +-------+-------+----------+--------+--------+--------+--------+
    | S8 | NIGHT | 1 | | | snooze | work |
    +-------+-------+----------+--------+--------+--------+--------+
    表格中的空白点实际上很容易填写。 work 不能跟随或进行双类制否则将是三类倒。
    +--------------+------------------------------+
    | single-shift | snooze-work-snooze |
    +--------------+------------------------------+
    | double-shift | snooze-work-work-snooze |
    +--------------+------------------------------+
    | triple-shift | snooze-work-work-work-snooze |
    +--------------+------------------------------+
    随处可见 work-work在表中,插入一个 snooze在它之前还有一个 snooze之后。
    以下是完全填充的表:
    ╔═══════╦═══════╦══════════╦════════╦════════╦════════╦════════╗
    ║ SHIFT ║ DAY ║ QUANTITY ║ p1 ║ p2 ║ p3 ║ p4 ║
    ║ ║ OR ║ OF ║ ║ ║ ║ ║
    ║ ║ NIGHT ║ PEOPLE ║ ║ ║ ║ ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ s1 ║ DAY ║ 3 ║ work ║ work ║ work ║ snooze ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ s2 ║ NIGHT ║ 1 ║ work ║ snooze ║ snooze ║ snooze ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ s3 ║ DAY ║ 3 ║ snooze ║ work ║ work ║ work ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ s4 ║ NIGHT ║ 1 ║ snooze ║ work ║ snooze ║ snooze ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ s5 ║ DAY ║ 3 ║ work ║ snooze ║ work ║ work ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ s6 ║ NIGHT ║ 1 ║ snooze ║ snooze ║ work ║ snooze ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ s7 ║ DAY ║ 3 ║ work ║ work ║ snooze ║ work ║
    ╠═══════╬═══════╬══════════╬════════╬════════╬════════╬════════╣
    ║ S8 ║ NIGHT ║ 1 ║ snooze ║ snooze ║ snooze ║ work ║
    ╚═══════╩═══════╩══════════╩════════╩════════╩════════╩════════╝
    您可以轮换上夜类的人:
    ╔═══════╦═══════╦═════════╦══════╦══════╦══════╦══════╗
    ║ SHIFT ║ DAY ║ NUMBER ║ p1 ║ p2 ║ p3 ║ p4 ║
    ║ ║ OR ║ OF ║ ║ ║ ║ ║
    ║ ║ NIGHT ║ PEOPLE ║ ║ ║ ║ ║
    ║ ║ ║ WORKING ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s1 ║ DAY ║ 3 ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s2 ║ NIGHT ║ 1 ║ work ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s3 ║ DAY ║ 3 ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s4 ║ NIGHT ║ 1 ║ ║ work ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s5 ║ DAY ║ 3 ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s6 ║ NIGHT ║ 1 ║ ║ ║ work ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s7 ║ DAY ║ 3 ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ S8 ║ NIGHT ║ 1 ║ ║ ║ ║ work ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s9 ║ DAY ║ 3 ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬══════╬══════╬══════╬══════╣
    ║ s10 ║ NIGHT ║ 1 ║ ║ ║ ║ ║
    ╚═══════╩═══════╩═════════╩══════╩══════╩══════╩══════╝
    假设没有人在上完夜类后必须立即上白类。然后,我们可以填写表格的其余部分:
    ╔═══════╦═══════╦═════════╦════════╦════════╦════════╦════════╗
    ║ SHIFT ║ DAY ║ NUMBER ║ p1 ║ p2 ║ p3 ║ p4 ║
    ║ ║ OR ║ OF ║ ║ ║ ║ ║
    ║ ║ NIGHT ║ PEOPLE ║ ║ ║ ║ ║
    ║ ║ ║ WORKING ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s1 ║ DAY ║ 3 ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s2 ║ NIGHT ║ 1 ║ work ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s3 ║ DAY ║ 3 ║ snooze ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s4 ║ NIGHT ║ 1 ║ ║ work ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s5 ║ DAY ║ 3 ║ ║ snooze ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s6 ║ NIGHT ║ 1 ║ ║ ║ work ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s7 ║ DAY ║ 3 ║ ║ ║ snooze ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ S8 ║ NIGHT ║ 1 ║ ║ ║ ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s9 ║ DAY ║ 3 ║ ║ ║ ║ snooze ║
    ╚═══════╩═══════╩═════════╩════════╩════════╩════════╩════════╝
    不幸的是,如果有 1 或 4 人在夜类后暂停轮类,那么您需要 3 人参加白类,而只有 3 人可用。当天上白类的人没有多少选择。
    ╔═══════╦═══════╦═════════╦════════╦════════╦════════╦════════╗
    ║ SHIFT ║ DAY ║ NUMBER ║ p1 ║ p2 ║ p3 ║ p4 ║
    ║ ║ OR ║ OF ║ ║ ║ ║ ║
    ║ ║ NIGHT ║ PEOPLE ║ ║ ║ ║ ║
    ║ ║ ║ WORKING ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s1 ║ DAY ║ 3 ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s2 ║ NIGHT ║ 1 ║ work ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s3 ║ DAY ║ 3 ║ snooze ║ work ║ work ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s4 ║ NIGHT ║ 1 ║ ║ work ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s5 ║ DAY ║ 3 ║ work ║ snooze ║ work ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s6 ║ NIGHT ║ 1 ║ ║ ║ work ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s7 ║ DAY ║ 3 ║ work ║ work ║ snooze ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ S8 ║ NIGHT ║ 1 ║ ║ ║ ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s9 ║ DAY ║ 3 ║ work ║ work ║ work ║ snooze ║
    ╚═══════╩═══════╩═════════╩════════╩════════╩════════╩════════╝
    完全填充的表:
    ╔═══════╦═══════╦═════════╦════════╦════════╦════════╦════════╗
    ║ SHIFT ║ DAY ║ NUMBER ║ p1 ║ p2 ║ p3 ║ p4 ║
    ║ ║ OR ║ OF ║ ║ ║ ║ ║
    ║ ║ NIGHT ║ PEOPLE ║ ║ ║ ║ ║
    ║ ║ ║ WORKING ║ ║ ║ ║ ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s1 ║ DAY ║ 3 ║ work ║ work ║ work ║ snooze ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s2 ║ NIGHT ║ 1 ║ work ║ snooze ║ snooze ║ snooze ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s3 ║ DAY ║ 3 ║ snooze ║ work ║ work ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s4 ║ NIGHT ║ 1 ║ snooze ║ work ║ snooze ║ snooze ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s5 ║ DAY ║ 3 ║ work ║ snooze ║ work ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s6 ║ NIGHT ║ 1 ║ snooze ║ snooze ║ work ║ snooze ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s7 ║ DAY ║ 3 ║ work ║ work ║ snooze ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ S8 ║ NIGHT ║ 1 ║ snooze ║ snooze ║ snooze ║ work ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s9 ║ DAY ║ 3 ║ work ║ work ║ work ║ snooze ║
    ╠═══════╬═══════╬═════════╬════════╬════════╬════════╬════════╣
    ║ s10 ║ NIGHT ║ 1 ║ work ║ snooze ║ snooze ║ snooze ║
    ╚═══════╩═══════╩═════════╩════════╩════════╩════════╩════════╝

    关于python - 具有重叠值的列表的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65300169/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com