我需要创建一个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时间表数组代码的数组,但我仍然坚持这一部分。
抱歉我的英文。
答案 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
我认为这样可行......(虽然如果你有任何不合适的物品,它会破坏......)