生成随机块时间表 Python

0 投票
1 回答
1929 浏览
提问于 2025-04-18 09:34

我需要创建一个自动生成课表的程序。

我的想法是生成“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

我觉得可以试试这样做

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

我觉得这样应该可以用...(不过如果你有一些完全不合适的东西,那就会出问题...)

撰写回答