生成随机块时间表 Python
我需要创建一个自动生成课表的程序。
我的想法是生成“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
我觉得这样应该可以用...(不过如果你有一些完全不合适的东西,那就会出问题...)