生成随机块时间表python

时间:2014-06-12 15:35:04

标签: python timetable

我需要创建一个Timetables的自动生成器。

我的想法是生成" n"时间表,然后根据我的条件给它分数。获得高分的时间表,胜利。

我有这些变量:

  • 学科
  • 教授
  • 列表项
  • 教室

每个学科都有一个代码和每周需要的小时数。 让我们拨打小时数"阻止"。

所以我有一个块数组。

array = [5,4,3,2,1];

此数组表示我们拥有的学科数量(在本例中为5)以及每周所需的小时数。第一个学科需要5个小时,第二个4个小时,第三个3个小时,第四个2个小时和第五个1个小时。

我的时间表是一个5x5的二维数组(星期一到星期五),我需要将学科数组分配到5x5数组中。所以我需要它可以生成的所有解决方案。

示例:

array = [5,4,3,2,1];

我可以把星期一的第一个纪律(5个小时),星期二的第二个(4个小时),星期三的第三个和第四个(3个小时和2个小时)以及星期二的最后一个纪律(1个小时)。像这样:

discipline = {A,B,C,D,E};
array = {5,4,3,2,1};

ABC
ABC
ABC
ABD
AED

这只是一种可能的解决方案,但我需要所有组合并将这些组合保存在数组中。

我已经将5x5时间表数组转换为我理解的代码,反之亦然。因此,每次生成解决方案时,我都会将该代码保存到数组中。

基本上我想要一个充满5x5时间表数组代码的数组,但我仍然坚持这一部分。

抱歉我的英文。

1 个答案:

答案 0 :(得分:0)

我想也许是这样的

def greedy_bag(items,limit):
    weighted_items = sorted(items,key=lambda x:x["cost"],reverse = True)
    items_in_bag =  []
    for item in weighted_items:
         if item["cost"] < limit:
            items_in_bag.append(item)
            limit -= item["cost"]
    return items_in_bag
disiplines = "ABCDE"
costs = [5,4,3,2,1]
items = [{"item":d,"cost":c} for d,c in zip(disiplines,costs)]
schedule = []
while items:
    bagged_items = greedy_bag(items,5)
    if not bagged_items:
        break
    for item in bagged_items:
          items.remove(item)
    schedule.append(bagged_items)

print schedule

我认为这样可行......(虽然如果你有任何不合适的物品,它会破坏......)