前回は金曜日の4時間だけでやってみて、とりあえず成功したものの、ここは手作業でやっても比較的簡単だったところ。木金の2日でやってみようかと思ったのですが、一気に月火水木金でやってみることにしました。
そうすると、授業コマの設定が大変。授業ID、授業名(国語とか生物とか)、クラス(最大2クラス)、先生(最大3人)、そして月1から金4までの可否を01で入力。ただし01については先生マスタから例のxlookupの掛け算で行ける。
とはいえ、学校全体で290個の駒がありました。
そうそう、体育はグランドの条件もある。他で使うので、グランドが使えない時間があったり、また、2年生の体育と3年生の体育はどちらもグランドを使うので同時にやることはできない、みたいな制約もあった。
ただこれは、場所を先生と同じように扱えばよいわけで、「グランド」先生としてグランドを使え得る時間を1、使えない時間を0として先生マスタに入れればよいので比較的容易にクリアできる。
ということで、コマシートがあるエクセルを添付して、Geminiのthinkモードで次のようにお願い。
時間割を作ります。
エクセルの「授業マスタ」のシートの行ごとに一つの授業が入っています。
D,E列は対象のクラス、F列は場所、G~I列は先生の名前です。
Q~AP列は順に月曜の1,2,3,4,5,6時間目,火曜の1,2,3,4,5時間目,水曜の1,2,3,4,5時間目,木曜の1,2,3,4,5,6時間目,金曜の1,2,3,4,5時間目にその授業が入れられれば1、入れられなければ0となっています。
それぞれの授業を何曜日の何時間目にすればよいでしょうか。割り振ってください。
もちろん同じクラス、あるいは同じ先生が、また同じ場所では、同じ時間に2つの授業をすることはできません。
考えてる考えてる。何分かしてようやく出てきた答えは…
添付ファイルの直接解析機能が制限されているため、ファイルを直接読み込んで時間割を完成させることができません。
お使いのパソコンでこのExcelファイルを読み込み、制約(クラス・教員・場所の重複不可、割り当て可能コマのフラグ)を満たす時間割を自動生成・割り振るPythonスクリプトを作成しました。数理最適化ライブラリ pulp を使用して制約を満たす解を導出します。
時間割自動割り振りスクリプト
事前に端末で pip install pandas openpyxl pulp を実行してライブラリをインストールした上で、以下のコードを実行してください。
(以下、pythonのプログラム)
スクリプトの処理内容
可否フラグの読み込み: Q~AP列の値が 1 の時間帯のみを割り当て候補として抽出します。
重複防止条件の設定:
クラス: D列・E列のクラスが指定コマで被らないよう制御。
場所: F列の教室・実験室が重複しないよう制御。
教員: G列〜I列に記載された教員が同時に複数授業を持たないよう制御。
結果の保存: 計算成功時、元のデータに「割り当てコマ(例: 月1、水3)」という列を追加し、時間割割り当て結果.xlsx として出力します。
もし件数が少なく(20件程度)、該当データをテキスト形式(CSV形式など)でここに直接貼り付けていただける場合は、こちらで直接計算して結果を回答することも可能です。
すげー。
ちなみによく見ると、金曜のときも結果を示してはいたけれど コードを表示 <> に気づかなかっただけで、pythonのプログラムを作って走らせていたようです。金曜だけならデータが少ないからGemini上で処理できたんでしょうね。でもここまでいくとそうはいかない。
それでもしつこく、エクセルの入力データを変えていって、そのたびにpythonを作っていくのですが、あるときこんな回答がありました。
クラス・先生・場所の重複を防ぎつつ、Q〜AP列の希望フラグ(1の項目)を満たす時間割割り振りは、数理最適化(整数計画問題)を利用して自動計算するのが確実です。
Pythonの最適化ライブラリ PuLP を使用して、指定されたExcel/CSV条件通りに一括割り振るプログラムを作成しました。
事前準備
コマンドプロンプトやターミナルで必要なライブラリをインストールします。
時間割自動割り振りスクリプト
以下のコードを allocate_timetable.py などの名前で保存し、CSVファイルと同じフォルダで実行してください。
処理の仕様と注意点
可否フラグ参照: Q〜AP列の中で 1 が入っているコマのみを対象候補にして選定します。
多重チェック: 同一時間帯に「同じクラス(D, E列)」「同じ場所(F列)」「同じ先生(G, H, I列のいずれか)」が被らないよう排他制御を行います。
解が出ない場合: もし「解が見つかりません」と表示された場合は、特定の先生や教室の希望時間枠(1の数)が少なく物理的に重複を回避できていない状態です。該当する授業の希望枠(1の領域)を広げて再実行してください。
数理最適化(整数計画問題)という知らない言葉が。つまり、今までカンと経験でやっていたこの時間割づくりには、職人技はいらず、一定の機械的なやり方があったということか。
ということで数理最適化とか整数計画問題でググって入門的な説明を見ましたが、なるほど、わからん。とりあえず時間割づくりのセオリーは簡単ではなさそうなことはわかった。…いや、それなら東京都の新採でありながら時間割担当をやっていた30年以上前に身をもってわかってたよな。
そしてもう一つ、Windows機に、pythonが使えるようにインストールしないと。
その前に、pythonってどう読むの?ピチョン?


コメント