2016-09-14 10 views
0

楽しいので、私は学校のためにpythonでタイムテーブル作成者を書いています。私。学校が自分の部屋、教師、クラス、科目、いくつかの嗜好を入力し、各クラス/教師/部屋の時間割を出力するプログラム。私はこれの背後にあるロジックに問題はありません(これは私が最も関心を寄せている部分です)。しかし、デザインには問題があります。タイムテーブル作成者のプログラム設計

私は部屋のリスト(101,102、...)、教師のリスト(Mr A、Mrs B ...)、科目のリスト(数学、英語、... )とクラス(5,6、...)のリストが含まれています。

いくつかの部屋は異なる科目に適しています(例えば、101は数学には良いですが、&英語ですが、可能ならば地理学は102でなければなりません)。もちろん、すべての教師は、彼が教える科目の特定のセットを持っています。

また、クラスは異なるグループに分かれています。私。スポーツを除くすべての被験者(5群Xおよび5群Yでもよい)および別の被験者(5群1、5群2および5群3)で5年生および5年生に分けられます。

このデータを効率的に保存する方法やクラスをデザインする方法についてアドバイスをいただけるといいですが、いいコードを書くことができます。

私の最初の推測では(pseudeコード)のようになります。

class Room: 
    string name  # e.g. r102.name = "102" 
    int id   # that should be unique? 

class Subject: 
    string name  
    int id   
    map RoomPref # like geography.Roompref[r102.id] = 1.0 
        # or math.Roompref[r101.id] = 0.75 

class Teacher: 
    list Subjects # like MrsB.Subjects = {geography.id, math.id} 

など、など、このアプローチが良いですし、素敵なコードにつながるかどうかはわかりません。特に、すべての異なる相互接続は私に問題を引き起こす。 (別のIDを割り当てるのは良い解決策ですか?)

アドバイスや読書は大歓迎です。

+0

これは基本的には正しく答えることができません。あなたはNP完全コンビナトリアル問題を見ているようです。おそらく、これを解決するために使用するヒューリスティックにあなたの懸念があるはずです。暫定的な解決策を査定/採点し、その状態を保存することははるかに複雑です。提案されたヒューリスティックを知らなくても、データ構造は推奨するのが難しいでしょう。確かにそれらの3つの項目のプールが必要なので、クラスを使用することは、あなたの問題の個々の単位を定義する悪い方法ではありません...あなたのコスト関数に従うならば。 – roganjosh

+0

小さなものを書く。それに追加してください。もう少し追加してください。あなたが愚かなことをしたことを実感してください。コードをリファクタリングして、それほど愚かではありません。泡立ち、すすぎ、繰り返します。 – dbugger

答えて

1

この問題の難しい部分の1つは、スケジュールを構成する関係が数多くあることです。私は先生Tがどのようにクラスを教えているかについて非常に慎重に考えると、午後1時30分に部屋Xでそれを教えます。

たとえば、プログラムで部屋Xがいつ利用可能かを知りたい場合があります。これを行うには、データ構造をチェックして部屋Xを見つけて、部屋Xが空いているか占有している時間のリストを検索したいと思うでしょう。しかし、別のケースでは、教師Jが数学を教えるかどうかを知りたいかもしれません。だから、似たようなルックアップをして、Teacher Jが教えるすべてのクラスを検索します。

これは私がアドバイスしたものです。タイムスロットの編成を作成し、それらの時間に教師とクラスを割り当てるデータ構造を作成するのが最も簡単な選択肢のように思われるかもしれません。最初はすばやく進んでいきますが、Classオブジェクトの構造を使用して一連の関係を表現することがどれほど難しいかを理解すると、最終的に問題に陥ります。

代わりに、mysqlのようなリレーショナルデータベースを試してみてください。自分ですべてのコードを書くのではなく、あるテーブルのデータを別のテーブルにリンクするために、他のテーブルへの参照を使用します。ここでホイールを再開発し、本質的にシンプルな(おそらく高度に相互接続されている)関係を表現する複雑なクラス構造を書く必要はありません。

+0

私はデータベース側で同意しません。メモリ内のすべて。これは単なる関係上の問題ではなく、古典的なタイムテーブル問題のようです。したがって、ヒューリスティックのみを使用してソリューションにアプローチすることができます。絶対的な関係は避ける必要があります。言い換えれば、何らかの種類の不可能性が受け入れられるが罰せられる暫定的な解決策を生成しなければならない。これはI/Oバウンドであってはならない。 - 「ダム」なアプローチは1000年代の回答が多く、選択的である。 – roganjosh

+0

私はあなたが思っている以上にあなたの考え方に同意すると思います。私は作業負荷を減らすためのデータベースを提案するだけです。私は絶対的で永続的な関係を全く主張しません。代わりに、ほとんどのテーブルでは時間のフィールドが必要です。だから教師がクラスを持っていると、それは時間Tに部屋xにあると言うことができます。 ここで重要な質問は規模の問題だと思います。他の人があなたのアプリケーションを使用できるようにしたい場合は、これをすべてメモリに保持することはかなり面倒なことになります。 – CM0491

+1

私は他の点で同意しているので、私たちは同じページにいる可能性があります。このタイプの現実的な問題はメモリサイズを超えるとは考えていません。毎日メモリ内の車両ルーティング問題に取り組んでいます。しかし、まともなサイズの問題のために何百万ものクエリが必要になると想像できますか...リソースのプールを得るためにDBをクエリする必要があります。私はむしろ何とかメモリにユニットをプールしようと思います。 – roganjosh

関連する問題