0

タイムテーブルの自動ジェネレーターを作成する必要があります。

私の考えは、「n」個のタイムテーブルを生成し、条件に従ってスコアを付けることです。得点の高い時刻表が勝ちです。

私はこれらの変数を持っています:

  • 規律
  • 教授
  • リスト項目
  • クラスルーム

各分野には、コードと週に必要な時間数があります。時間数を「ブロック」と呼びましょう。

だから私はブロックの配列を持っています。

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

この配列は、私たちが持っている分野の数 (この場合は 5) と、1 週間に必要な時間数を意味します。最初の訓練は 5 時間、2 番目は 4 時間、3 番目は 3 時間、4 番目は 2 時間、5 番目は 1 時間必要です。

私のタイムテーブルは 5x5 の 2 次元配列 (月曜日から金曜日) で、5x5 配列に分野の配列を割り当てる必要があります。だから私はそれが生成できるすべてのソリューションが必要です.

例:

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

月曜日に最初の訓練 (5 時間)、火曜日に 2 番目 (4 時間)、水曜日に 3 時間と 4 時間 (3 時間と 2 時間)、火曜日に最後の訓練 (1 時間) を置くことができます。このようなもの:

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

ABC
ABC
ABC
ABD
AED

これは可能な解決策の 1 つにすぎませんが、すべての組み合わせが必要であり、その組み合わせを配列内に保存します。

5x5 の timetable 配列を理解できるコードに変換する関数を作成しました。その逆も同様です。したがって、ソリューションが生成されるたびに、そのコードを配列に保存します。

基本的に、5x5 の時刻表配列コードで満たされた配列が必要ですが、この部分で立ち往生しています。

私の英語でごめんなさい。

4

1 に答える 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

それはうまくいくと思います...(ただし、まったく収まらないアイテムがあると壊れます...)

于 2014-06-12T15:49:59.983 に答える