找到最佳时间表的算法

时间:2015-11-09 18:54:14

标签: java algorithm permutation

我正在搜索算法或一般方法来解决以下问题:

学生A,......,M被列入各种模块的书面考试。铭文在下表中给出。如果每个学生每天可以参加一次考试,那么至少需要多少天才能组织会议?

          |A|B|C|D|E|F|G|H|I|J|K|L|M|
Module 1  | | | |X| |X|X| |X|X| | | |
Module 2  |X| | | | |X| | | |X|X| | |
Module 3  | |X| | | | | |X| | |X| |X|
Module 4  |X| | |X| | | | | | | | | |
Module 5  | | |X| |X| | | | |X| | |X|
Module 6  | | |X| | | | |X| | | | | |
Module 7  |X|X| | | | | | |X| |X| | |
Module 8  | | |X| | | |X| | | | |X| |

我如何解决问题?

2 个答案:

答案 0 :(得分:1)

使用图形着色。

为每个模块创建一个节点,每当学生有模块i和j时,节点i和j之间就有一条边。为图表着色,颜色代表天。只要模块不能在同一天,节点之间就会有边缘,因此着色会给出有效的时间表。最小着色时间最短。

作为实际解决实例的建议(即图形着色的算法),对于这个尺寸,我会采用一种简单相当强力的方法,有点像这样:

for k in 1 ..
    tryColour(k, 1)

tryColour(k, i):
    if i > numnodes:
        found it
    for c in 1 .. k:
        if node i can have colour c:
            colours[i] = c
            tryColour(k, i+1)

我没有注意那里的细节,它仅仅是为了这个想法:选择一个节点,给它一个不是立即不可能的颜色,然后递归地给其余颜色着色。如果递归着色为空,请使用下一种颜色再次尝试。在找到解决方案之前,用越来越多的颜色完成这一切。

答案 1 :(得分:0)

一旦你有一个不兼容的表,它应该是这样的:

a[1] = [2,4,5,7,8]
a[2] = [1,3,4,5,7]
a[3] = [2,3,5,6,7]
a[4] = [1,2,7,8]
a[5] = [1,2,3,6,8]
a[6] = [3,5,8]
a[7] = [1,2,3,4]
a[8] = [1,5,6]

我认为这是一个想法:

  • 创建一个日节点,使用其不兼容的模块将模块放入其中。
  • 然后,只要任何给定节点仍然具有未解析的不兼容模块:
    • 从该节点弹出不兼容的模块
    • 将其放置在兼容的节点中,或者创建新的日节点
    • 然后从其中仍存在的任何其他日节点中删除该模块

每个日节点都有一个当天发生的模块列表,以及当天不可能发生的模块列表。但我并不完全确定如何证明它是最佳的。它似乎是因为它认为与首先看到的模块不兼容。

快速而肮脏的python实现示例:https://repl.it/BY2B