14

私は現在、大学の学生が受講したいコースに基づいて有効なスケジュールを自動的に生成できるようにする Web サイトに取り組んでいます。

サイト自体に取り組む前に、コースを効率的にスケジュールする方法の問題に取り組むことにしました。

いくつかの説明:

  1. 私たちの大学の各コース (他のすべての大学もそうだと思います) は、1 つまたは複数のセクションで構成されています。たとえば、微積分 I には現在 4 つのセクションがあります。これは、セクションの量、およびコースにラボがあるかどうかに応じて、スケジュール プロセスに大きな影響を与えることを意味します。

  2. 本学の科目は、科目略称と科目コードの組み合わせで表されます。微積分 I の場合: MATH 1110.

  3. CRN はセクション固有のコードです。

  4. 私が勉強している大学は混合ではありません。つまり、男性と女性は (ほぼ) 別々のキャンパスで勉強しています。ほとんどというのは、キャンパスが二つに分かれているということです。

  5. datetimes および timeranges dict は、実際のボトルネックであった datetime.datetime.strptime() の呼び出しを減らすことを目的としています。

私の最初の試みは、30 個のスケジュールが見つかるまで継続的にループするアルゴリズムで構成されていました。スケジュールは、入力されたコースの 1 つからランダムにセクションを選択し、残りのコースからセクションを配置して有効なスケジュールを構築しようとすることによって作成されました。すべてのコースがスケジュールに収まらない場合、つまり競合があった場合、スケジュールは破棄され、ループが続きました。

明らかに、上記の解決策には欠陥があります。アルゴリズムの実行に時間がかかりすぎ、ランダム性に依存しすぎていました。

2 番目のアルゴリズムは、古いアルゴリズムとは正反対のことを行います。まず、itertools.product() を使用して、可能なすべてのスケジュールの組み合わせのコレクションを生成します。次に、スケジュールを繰り返し処理し、無効なスケジュールを除外します。さまざまなセクションを確保するために、スケジュールの組み合わせは検証前にシャッフル (random.shuffle()) されます。ここでも、多少のランダム性が含まれます。

少し最適化した後、5 つのコースで構成される平均的なスケジュールでスケジューラを 1 秒未満で実行することができました。それは素晴らしいことですが、コースを追加し始めると問題が始まります。

参考までに、特定の入力セットを提供すると、可能な組み合わせの量が非常に多くなり、 itertools.product()が妥当な時間内に終了せず、その過程で 1GB の RAM を消費します。

明らかに、これをサービスにするには、より高速で効率的なアルゴリズムが必要になります。オンラインと IRC で登場した 2 つは、動的プログラミングと遺伝的アルゴリズムです。

概念を正しく理解していれば、動的計画法をこの問題に適用することはできません。なぜなら、問題をより小さな部分に分割し、これらの部分を個別に解決し、これらの部分の解決策をまとめて完全な解決策を形成する必要があるからです。私が見る限り、これはここには当てはまりません。

遺伝的アルゴリズムに関しては、私はそれらをあまり理解しておらず、そのような状況でどのように適用するかを理解することさえできません. また、非常に大きな問題空間では GA の方が効率的であることも理解していますが、これはそれほど大きくはありません。

どのような代替手段がありますか? この問題を解決するために私が取ることができる比較的わかりやすいアプローチはありますか? それとも、今持っているものに固執して、多くの人が次の学期に 8 つのコースを受講することを決定しないことを願うべきですか?

私は優れたライターではないので、質問が曖昧で申し訳ありません。ご不明な点がございましたら、お気軽にお問い合わせください。できる限りお手伝いさせていただきます。

これがコード全体です。

http://bpaste.net/show/ZY36uvAgcb1ujjUGKA1d/

注:誤解を招くタグ(スケジュール)を使用して申し訳ありません。

4

5 に答える 5

18

スケジューリングは、一般にNP-Completeである非常に有名な制約充足問題です。あなたと同じコンテキストでも、この主題について多くの作業が行われてきました: Solving the University Class Scheduling Problem Using Advanced ILP Techniques . テーマに関する教科書さえあります。

人々は、次のような多くのアプローチをとってきました。

問題空間と複雑さを減らす必要があります。できるだけ多くの仮定を立てます (クラスの最大数、ブロックベースのタイミングなど)。この問題に対する特効薬はありませんが、ほぼ最適な解決策を見つけることができるはずです。

最近のいくつかの出版物:

于 2012-11-06T19:35:20.447 に答える
4

遺伝的プログラミングについて何か読んだことがありますか? その背後にある考え方は、解決したい「もの」が可能な限り最良の解決策に成長するまで、それ自体で進化させるということです。

1,000 のスケジュールを生成しますが、通常、有効な方向に進んでいるスケジュールはゼロです。次に、「一部」のコースをランダムに変更します。これらの新しいスケジュールから、スケジュールの「良さ」に従って与える評価に基づいて、いくつかの最高のものを選択します。次に、両方のスケジュールの一部のコースを組み合わせて、それらを再現させます。最終的に何千もの新しいスケジュールが作成されますが、それらはすべて、以前のスケジュールよりもわずかに優れています。満足するまで繰り返し、最後に生成した 1000 件のスケジュールから最も評価の高いスケジュールを選択します。

ランダム性が含まれていることは認めますが、アルゴリズムをどれだけ長く実行しても、スケジュールは改善され続けます. 現実の生命や有機体と同じように、適者生存があり、同じ種類のスケジュールのさまざまな一般的な「スレッド」を見ることができます。これは、生成された別のスレッドとほぼ同じです。2つの非常に異なるスケジュールは、最終的に交雑育種によって「戦う」ことができます.

学校のスケジュールと遺伝的プログラミングを含むプロジェクト: http://www.codeproject.com/Articles/23111/Making-a-Class-Schedule-Using-a-Genetic-Algorithm

必要なものをよく説明してくれていると思います。

最後に、これは非常に興味深いプロジェクトだと思います。作成するのは非常に難しいですが、作成したら、実際の生活のようにソリューションが進化するのを見るのは素晴らしいことです. 幸運を!

于 2012-11-06T19:32:18.527 に答える
3

現在セクションの組み合わせを生成している方法は、おそらく、複数のコース間の競合によって除外される膨大な数の組み合わせを投げかけています。最初に 2 つのコースのセクションの積を生成することで、対処する必要がある組み合わせの数を減らすことができると思います。そのセットから競合を取り除き、3 番目のコースのセクションを紹介します。もう一度削除してから、4 番目を導入します。これにより、選択したコースの数が増えるにつれて、必要な処理時間がより直線的に増加するはずです。

于 2012-11-06T20:13:52.903 に答える
2

これは難しい問題です。「コーススケジューリング問題用紙」のようなものをグーグルで検索すると、多くの参考文献が見つかります。遺伝的アルゴリズム - いいえ、動的計画法 - はい。GA は、標準の DP アルゴリズムよりも理解と実装がはるかに困難です。通常、GA をすぐに使用する人は、標準的な手法を理解していません。いくつかの調査を行うと、さまざまなアルゴリズムが見つかります。いくつかの実装を見つけることができるかもしれません。独自のアルゴリズムを考え出すことは、DP を理解するために努力するよりもはるかに困難です。

于 2012-11-06T19:32:43.933 に答える