2338 AIで時間割を作る(4)

 pythonのインストールの話をしようかと思いましたが、先に時間割プログラムのだいたいの処理内容を見ておきたいと思います。
 …と思ったら入力データの説明だけで膨大な量になってしまいました。…えっ、3624字?

先生マスタ

 時間割の条件の中でも基本中の基本、先生と場所のご都合を入力しておきます。

 A列は教科名ですが実は「国語」とか「英語」とかのデータとしては不要です。またよく見ると下2行は「グラ」(グランドのこと)、「LL」(LL教室のこと)と場所のデータもあります。
 B列は教員名と言いながら、最初はブログに載せることもあり個人情報保護のつもりでT01のようにしましたが、並べ替えの便も考えて教員IDとして使うことにしました。
 部屋はRoomということでRで始まる90番台のIDにしました。
 先生別時間割のことを考えると教員IDの他に教員名も入れた方がよいのかもしれません。

 このマスタは次に示す「授業マスタ」で使うデータに反映させるためのもので、実際にプログラムに読み込ませるデータはあくまでも「授業マスタ」で、先生マスタそのものはプログラムには必要ありません。

授業マスタ(入力データ)

 めんどくさい(ほぼ同じ処理をする)ので、以降は対象学級のある授業だけでなく、生徒の学級には関係なく当該の先生だけが集まる会議も含めて「授業」と呼びます。
 で、プログラムに入力するデータは以下のような授業の情報です(授業マスタ)と呼んでいます。

A列:授業ID 

 授業1コマごとに一つのIDを割り当てます。なので、「◎年◎組の国語がA先生一人で3時間担当する」という場合、授業IDだけ違って、あとは同じデータが3つあります。
 また、今回のテストケースでは、学校全体で307個の授業がありましたが、1から307とふるのではなく、国語科は101からの100番台、社会科は201から、数学は301から、理科は401から、音楽と美術は週によってクラスにより音楽と美術が入れ替わる授業があるため、セットで501から、保健体育は601から、技術・家庭は701から、英語は801から、そして会議は901から番号をふっていきます。
 こうすることで各教科の希望を聞く段階で、各教科でデータを作ってもらっても、授業IDでかち合うことの内容にしていきます。

B列:科目名

 クラス別の時間割を示すときに授業IDで示してもわかりづらいですから、この科目名で表示させます。表示されるときの都合のよさを考えて、全角2文字で統一しておくとよいでしょう。
 また、1つのクラスで同じ「科目名」の授業は同じ曜日に2時間以上入れない(2時間連続で授業をやる「家庭」を除く)という設定もしています。
 本来なら同じ教科、例えば同じクラスで4時間の理科の授業を、A先生の担当する物理・化学領域の授業「理①」が2時間、B先生の担当する生物・地学領域を2時間を別の先生が担当している「理②」と分けている場合、「理①」と「理②」なども同じ曜日に入れることはなるべく避けたいところですが、それを全クラス全教科で完全に禁止すると、すべての条件を満たす時間割が成立しない可能性が高くなるのが時間割作成の難しいところの一つです。
 この禁止でもOKでもない、「なるべく避けたい」という扱いがプログラム上難しく、いったんOKにしていくつかのパターンを作らせ、その中で「なるべく避けたい」という条件を満たしている数が多いものを採用する、というアルゴリズムを考えていますが、そもそも選べるほど条件を満たしたパターンの数があるのかという根本的な疑問があります。
 なので、会議の場合は空欄になりますが、わかりやすさのため会議名を書いても差し支えありません。

C,D列:クラス名

 授業対象のクラス名です。2クラス合同の授業もあるので2列とっています。
 会議の場合は空欄になります。

E列:教員別時間割表用表示名(教員別表示)

 教員別時間割を作る際に授業をどう表示させるか示したものです。対象クラスまたは会議名を入れます。
 ただし、例えば保健体育の先生で同じクラスで保健と体育を教えている場合だと、クラス名だけではどちらの授業か区別がつきません。そんなときはここの列で「2K保」のようにクラス名+追加情報を入れておくと便利です。

F列:同一曜日指定

 特に音楽や美術などの実技教科では、実習道具の準備などがあるため、月曜日に1年生だけ全クラス、火曜日は2年生だけ全クラス、水曜日に3年生だけ全クラス…というふうに、同じ学年の授業は同じ曜日に固めておきたいという希望もあるでしょう。
 また、非常勤講師の先生で、授業時数が4時間から週1日だけの来校にはなるけど、その曜日は月火水だったらいいよ、ということもあります。ところが、この先生は月火水が可能!と入力してプログラムを走らせると、これ幸いと月曜日に1時間、火曜日に2時間、水曜日に1時間というふうにバラけた時間割をつくってしまいかねません。
 こういうことの対策のために、同一曜日指定という機能も必要です。同じ曜日にしてほしい授業、例えば1年の音楽の授業の4コマのところにすべて51と入れ、2年生の音楽の授業の4コマのところにすべて52、3年生の音楽の授業の4コマのところにすべて53といれると、それぞれ同じ曜日に(結果的にそれぞれ別の曜日に)入るというわけです。
 なお、1学年3クラス以下で6時間授業がある曜日があると、同じ曜日に1年生3時間、2年生3時間と詰め込み、さらに1年生の授業の後に2年生をやってさらにまた1年生に戻るような不親切な時間割を作ってしまう可能性はあります。ただ、1学年4クラスという前提(うちの学校がそうなのです)でつくったので、この点については放置します。

G列:場所指定

 例えば、体育などでグランドを使う授業の場合、仮に先生が被らなくてもグランドが被るから2年生の体育と3年生の体育の授業が同時にできない、ということもあります。また、グランド自体が何らかの理由で授業に使えないということもあるかもしれません。
 そんなときはこの列に先生マスタにあるグランドの先生IDを入れておきます。先生のかぶり同様、場所がかぶっても授業ができないようになります。
 本当は理科室も2つしかないので同時に理科で3つ以上の授業がないようにしたいところもあるのですが、これも厳密にやると時間割が成立しないこと、また第1、第2と2つある理科室のうち「こちらの理科室じゃないとダメ!」ということはめったにないので、第1理科室、第2理科室とやって別の部屋IDを与えると、第1理科室に2クラス、第2理科室が空き、となると実際は成立しているのに成立せずとなってしまうので、ひとまず今回は対応していません。私が教室で授業すればいいだけです…。

H~O列:先生

担当する先生の先生IDを入力します。最大で8人の先生が参加する会議があるので、8列作っています。

P~AO列:時間ごとの授業可否

 その授業が月曜日の1時間目から金曜日の4時間目までのそれぞれの時間に入れることが可能か否かを示しています。1が可、0が不可です。
 これは、G列で指定した場所、H~O列で指定した先生それぞれについて、先生マスタから各時間の1または0を問い合わせて、掛け算処理し、場所を含む全員が1だった時間は1、場所でもいずれかの先生でも0が一つでもあったときは0となるように返します。こうすることで、すべての場所・先生の条件がそろった時だけ1になるので、この中の時間から割り当てることになります。

 なお、場所・先生の条件とは別に、「このクラスのこの授業はこの曜日(この時間)!」と固定したいときは、自動計算の上に上書きすることもできます。授業を入れたい時間(曜日だったらその曜日の全時間)だけ1にして、あとはすべて0とすればよいわけです。

各教科にお願いしよう!

 さて、この入力データ、金曜だけの2331 AIで時間割を作る(2)から比べてもかなりの拡張版となりました。
 で、これらの先生マスタと授業マスタの作成は、時間割担当者一人でやると膨大な量になることは想像がつくと思います。今回私が時間割プログラムを開発した正味約15時間(4日間)のうち、半分近くはこの入力データの作成でした。(いろいろ項目やプログラム全体を考えながらというところもありましたが)
 なので、先生(場所)マスタ、授業マスタで保体の先生のデータやグランドのこと、保体の授業のデータは保体の先生に入力していただくなど、各教科に依頼してもよいと思います。(正しく条件を入力していあるかの点検は必要ですが)
 それができるように授業IDも、先生IDも数字のところは、国語は1から、社会は2から…と、始まっています。(9から始まる数字は仕方ないので時間割担当が管理しましょう)

コメント

タイトルとURLをコピーしました