具有重叠值的列表排列

Permutation of lists with overlapping values

我哥哥是学医的,他带着问题来找我。他和他的3个同学必须在两家医院之间轮换,比如说H1H2

问题:

我试图通过将其视为以下事件的排列来解决此问题:

这些活动有以下限制:

问题是如何创建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,p2p3p4.

我要给班次编号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一定不能工作shift 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 将无法工作 shift 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   |
+-------+-------+----------+--------+--------+--------+--------+

table中的空白其实很容易填

双班不能在work之后或进行,否则将是三班。

+--------------+------------------------------+
| single-shift |      snooze-work-snooze      |
+--------------+------------------------------+
| double-shift | snooze-work-work-snooze      |
+--------------+------------------------------+
| triple-shift | snooze-work-work-work-snooze |
+--------------+------------------------------+

在 table 中看到 work-work 的任何地方,在它前面插入一个 snooze,在它后面插入一个 snooze

下面是完全填充的table:

╔═══════╦═══════╦══════════╦════════╦════════╦════════╦════════╗
║ 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       ║      ║      ║      ║      ║
╚═══════╩═══════╩═════════╩══════╩══════╩══════╩══════╝

假设没有人必须在上夜班后立即上白班。然后,我们可以填写剩下的 table:

╔═══════╦═══════╦═════════╦════════╦════════╦════════╦════════╗
║ 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 ║
╚═══════╩═══════╩═════════╩════════╩════════╩════════╩════════╝

人满为患TABLE:

╔═══════╦═══════╦═════════╦════════╦════════╦════════╦════════╗
║ 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 ║
╚═══════╩═══════╩═════════╩════════╩════════╩════════╩════════╝