情報学部 菅沼ホーム 時間割作成目次

C++ 版時間割作成プログラムの使用方法

  このプログラムは,原則的に以下のような手順に従って動作しています.

  1. 開講曜日及び時限が指定された科目を配置する.

  2. 開講時限が指定された科目を配置する.この段階までは,教員の衝突,講義室の不足など,実現不可能な時間割にはならないように配置される.もしそれが不可能である場合は,エラーメッセージが出力される.ただし,必ずしもエラーとは限らない.プログラムの能力の点から配置できない場合も存在するが,データを修正して再度試みてもらいたい.

  3. 残りの科目をランダムに配置する.特定のコマを空けたいような場合は,ダミーの科目(ダミーの教員,講義室も必要)を用意し,その科目の開講日時を指定することによって実現可能である.

  4. 「科目を入れ替えることによってペナルティが減る場合は,それらの科目を入れ替える」という作業を試行回数だけ繰り返す.ペナルティを減らす入れ替え方法が存在しない場合であっても,ペナルティの値が同じである入れ替えが存在する場合は,それを試行回数だけ繰り返す(この段階になると,プログラムの実行が非常に遅くなる).

  5. 与えられた試行回数に達するか,または,それ以上の改善が不可能になった場合は実行を停止し,その時点における時間割を出力する.結果の出力は,画面,または,ファイルのいずれかを選択可能である.

  「時間割作成目次」のページから,プログラムやデータをダウンロードし(全体のダウンロード,C++ 関連だけのダウンロード,いずれも可能),それを展開した後,ディレクトリ cpp に移動し,プログラムをコンパイルすれば実行可能になります.例えば,コンパイラとして g++ を使用する場合は,コマンドプロンプトから,
g++ schedule.cpp split.cpp -Wall -O2 -lm -o schedule
		
のように入力すれば,実行可能プログラム schedule.exe が生成されるはずです.なお,上の命令は,バッチファイル cpp.bat に登録されていますので,それを実行しても構いません.入力データ例は,ディレクトリ cpp/data に存在しますが,プログラムは,データ例と同じ名前のファイルから常にデータを入力します.データを変更したい場合は,これらのファイル内容を変更するか,または,プログラムを修正してください.

  コンパイル終了後,
schedule 0 result.csv   // 大学用
schedule 1 result.csv   // 高校用
		
と入力すれば実行できるはずです.result.csv は,最終結果を出力するためのファイル名です(中間結果は,画面に出力).任意の名前で可能ですが,カンマ区切りの csv 形式の形で出力されますので,拡張子は,csv にしておいた方が良いと思います.なお,ファイル名を省略すると,最終結果も画面に出力されます.以下,入力データについて説明していきます.

  1. 講義室データ (univ_room.csv: 大学,high_room.csv: 高校)

      講義室に関するデータです.以下に示すように,講義室の一般名とその講義室に属する具体的な講義室名を記述します.以下において説明する,入力データに関しても同様ですが,全てのデータは,カンマ区切りの csv ファイルとして作成されています.入力データを作成するには,Excel で作成した後,csv 形式で保存する方法が簡単だと思います.

      ある時間帯に,ある講義室を利用できる科目は一つだけです.例えば,グランドを2つ以上の学科で同時に使用するようなことを許す場合は,下の例(2つの場合)に示すように,必要な数だけグランドを定義してください.また,後に述べる科目データによって,グランドを利用する複数の学科を同じ科目の対象として記述することによっても可能です.必ず同じ時間に開講する場合は,後に述べる科目データによって記述する方が簡単です.

    大講義室 301講義室    
    中講義室 101講義室 102講義室 103講義室
    小講義室 201講義室 202講義室  
    実験室 100実験室    
    屋外体育施設1 グランド1    
    屋外体育施設2 グランド2    

       この例において,1列目が講義室の一般名,2列目以降がその一般名が示す講義室に属する具体的な講義室です.なお,これらの名称は,すべて一意である必要があります.

  2. 教員データ (univ_teacher.csv: 大学,high_teacher.csv: 高校)

      教員に関するデータです.

    山田太郎              
      所属 機械          
      不可能 3 4 5
    山田次郎              
      所属 機械          
      不可能 3 4 5
    山田三郎              
      所属 電子          
      不可能 3 4 5
    鈴木花子              
      所属 非常勤          
      可能 1 2    

    • 1列目に教員名が入ります.この例のように,一人の教員に対して3行のデータが必要です.2行目の所属に関するデータは,現在のプログラムでは使用していませんが,2つの文字列は必ず入力して下さい.

    • 各教員の3行2列目には,「不可能」,「可能」のいずれかの文字列を入力します.「不可能」を入力した場合は,同じ行の次の列以降に講義できない曜日と時限を必要な数だけ入力します.講義できない日が存在しない場合(いつでも可能な場合)においても,「不可能」という文字列は必ず入力しておいてください.

    • 「可能」を入力した場合は,講義を行える曜日と時限を必要な数だけ入力してください.後に述べる科目データファイルに出現するこの教員担当の科目の順に,その科目がここで指定した曜日・時限に配置されます.なお,担当科目数の数を超えて講義を行える曜日と時限を入力しても,それらのデータは無視されます.

    • 曜日は,「月」「火」「水」「木」「金」「土」「日」のいずれかを記述してください.

  3. 科目データ (univ_lecture.csv: 大学,high_lecture.csv: 高校)

      科目に関するデータです.

    実験            
      開講時期等 1 前期 必修 3 3
      担当教員 山田太郎 山田三郎      
      学科 機械 電子      
      講義室 100実験室        
      代替          
      同時          
    化学            
      開講時期等 1 前期 選択 2
      担当教員 鈴木花子        
      学科 機械        
      講義室 大講義室        
      代替          
      同時 理科 0 0    
    物理            
      開講時期等 1 前期 選択 1
      担当教員 山田次郎        
      学科 機械        
      講義室 大講義室        
      代替 中講義室 小講義室      
      同時 理科 1 1    
    数学            
      開講時期等 1 前期 選択 1
      担当教員 山田太郎        
      学科 機械        
      講義室 中講義室        
      代替 小講義室        
      同時          
    数学            
      開講時期等 1 前期 選択 1
      担当教員 山田太郎        
      学科 機械        
      講義室 中講義室        
      代替 小講義室        
      同時          
    数学            
      開講時期等 1 前期 選択 1
      担当教員 山田三郎        
      学科 電子        
      講義室 中講義室        
      代替 小講義室        
      同時          

    • 1列目に科目名が入ります.この例のように,一つの科目に対して7行のデータが必要です(なお,2行目以降における各行の2列目の文字列は必ず入力してください).また,同じ科目が週に複数回開講される場合は,その数だけ科目データが必要になります.

    • 2行目では,開講時期等に関する情報を記述します.

      • 2行3列目: 対象学年(必須)

      • 2行4列目: 開講時期(必須).1学期,2学期などの表現でも構いません.ただし,現在のプログラムでは,この情報を利用していません.同じデータ内に記述された科目は,すべて同時期に開講されるものとみなされます.

      • 2行5列目: 選択/必修(必須)

      • 2行6列目: コマ数(必須)

      • 2行7列目: 配置したい時限.上の例では,「実験」に対して「3」という値が入力されているため,「実験」はいずれかの曜日の3時限目に配置され,その日の3,4,5時限目が「実験」になります(コマ数が3であるため).ここに負の値(たとえば,「-3」)を入力すると,3時限目に配置されることは「3」を入力した場合と同様ですが,初期配置された曜日を以後変更しません.(任意)

    • 3行目では,担当教員を入力します(必須,複数可能).もしこの担当教員の中に,教員データ内で「可能」を指定した教員がいた場合は,そこで指定された曜日・時限にその講義が配置されます.たとえば,先の教員データで示したように、「鈴木花子」の講義可能な曜日・時限が水曜日の1,2時限目であれば,初期設定の段階で「化学」はそこに配置されます.

    • 4行目では,対象学科を入力します(必須,複数可能).複数入力した場合は,それらの学科すべてを同時に対象として開講されます.

    • 5行目では,講義室を入力します(必須,複数可能).「実験」の場合のように具体的な講義室名を記述した場合は,必ずその講義室を使用します.また,講義室の一般名を記述した場合は,その一般名で表された講義室に含まれる具体的な講義室の内,空いている講義室が選択されます.

    • 6行目では,代替講義室を入力します(任意,複数可能).上で指定した講義室が空いていない場合は,この中から選択されます.

    • 7行目では,同時開講科目を指定します(任意).この行の3列目に入力された名称(任意の名称で良い)が同じ講義は,すべて同じ曜日・時限に開講されます.一般的には,開講される曜日・時限はプログラムが実行されるまで未定ですが,先の教員データの例に示されているように,「鈴木花子」の講義可能日は,水曜の 1,2 限目だけです.従って,2 コマ科目である化学の講義日は水曜の 1,2 限目に決まってしまいます.そのため,同時開講される他の科目の曜日・時限も決まってしまいます.

        同じ行の4,5列目では,同時開講される科目の相対位置を指定します.位置は,コマを単位とした以下のような座標系で指定します.同じ位置に複数の科目を配置しないようにしてください.

      (0, 0) (0, 1) (0, 2) ・・・
      (1, 0) (1, 1) (1, 2) ・・・
      (2, 0) (2, 1) (2, 2) ・・・
      ・・・ ・・・ ・・・ ・・・

        この例では,「化学」が(0, 0),(0, 1)に配置され(2コマ科目であるため),「物理」が,(1, 1)の位置に配置されることになります.具体的には,「化学」が水曜日の1,2時限目,「物理」が水曜日の2限目に配置されます.

    • ここで示した科目データの場合は,先に与えた教員データに基づくと,初期設定の段階で物理と化学が指定された曜日・時限に配置され,実験は,いずれかの曜日の3限目に配置されることになります.また,数学は初期設定の段階で配置位置がランダムに選択され,その後修正されていくことになります.

  4. 実行制御データ (univ_general.csv: 大学,high_general.csv: 高校)

      実行を制御する一般データです.各行における最初の文字列は絶対に削除しないでください.

    最大試行回数 100
    出力レベル 5
    乱数初期値 1234
    午前中コマ数 2
    講義開講日/週 5
    コマ数/日 5
    講義時間 10
    講義室 10
    教員 10
    教員都合 10
    連続 7
    実験(中間) 5
    実験(午前中) 3
    空き 2
    必修 1

    1. 最大試行回数: 科目を入れ替える回数.この回数に達しなくても,科目を入れ替えても改善できない状態になると停止します.

    2. 出力レベル: 正の値を入力すると,その回数毎に中間結果を出力します.中間結果において,「現在の状況」の右側には,試行回数,評価値,及び,「実行可」,または,「実行不可」という文字列が出力され,その下には,後に述べる各ペナルティの付加状況が出力されます.「実行可」とは,評価値の問題は除き,実際の時間割として利用できる状態であることを意味します.「実行不可」とは,教員や講義室の衝突のため,実際の時間割として利用できないことを意味しています.

        負の値は,プログラムのデバッグ又はデータの適正さをチェックするために使用します.-1 を入力すると,初期配置における講義室の使用状況(講義室の使用コマ数)と各学年・学科毎の空きコマ数が出力されます.さらに,-1 より小さい値を入力すると,講義室の使用状況,空きコマ数に関する情報に加え,各時間に対する設定状況が出力されます.以下に示す例は,-1 より小さい値を入力したときの出力例の一部を示しています.ここでは,各時間に対する設定状況の内,水曜日 3,4,5 限目に対する情報だけを表示しています.具体的には,コンピュータシステム学科・人間情報デザイン学科に対する以下に示すような科目が設定された場合を表しています.

      3 限目 4 限目 5 限目
      特別プログラム1(山田太郎 杉山花子,509第3WS室右)
      プログラミング基礎(鈴木二郎,201第2情報演習室) 国際コミュニケーション論(佐藤三郎,101講義室) 経営工学概論(加藤四郎,101講義室)
      オペレーションズ・リサーチ(田中五郎,101講義室) オペレーションズ・リサーチ(田中五郎,101講義室) ハイパーメディアコンテンツ(菅沼六郎,504第1情報演習室)
         ・・・・・
        水曜日 3時限目 3コマ
          特別プログラム1(0,3)( 山田太郎 杉山花子 )
          学科: コンピュータシステム学科 人間情報デザイン学科
          プログラミング基礎(0,1)( 鈴木二郎 )
          学科: コンピュータシステム学科 人間情報デザイン学科
          国際コミュニケーション論(1,1)( 佐藤三郎 )
          学科: 人間情報デザイン学科
          経営工学概論(2,1)( 加藤四郎 )
          学科: 人間情報デザイン学科
          オペレーションズ・リサーチ(0,1)( 田中五郎 )
          学科: コンピュータシステム学科
          オペレーションズ・リサーチ(1,1)( 田中五郎 )
          学科: 人間情報デザイン学科
          ハイパーメディアコンテンツ(2,1)( 菅沼六郎 )
          学科: 人間情報デザイン学科
          要求: 509第3WS室右 情報演習室2 中講義室 中講義室 中講義室 中講義室 504第1情報演習室( LL教室 情報演習室1 情報演習室2 情報演習室2 情報演習室2 情報演習室2 情報演習室2 )
          設定: 509第3WS室右(3) 509第3WS室右(4) 509第3WS室右(5) 201第2情報演習室(3) 101講義室(4) 101講義室(5) 101講義室(3) 102講義室(4) 504第1情報演習室(5)
         ・・・・・
      講義室使用状況
        501第1WS室  6
        508第2WS室  6
        509第3WS室右  6
        509第3WS室左  0
         ・・・・・
      空きコマ数
        1年 機械工学科 1 コマ
        1年 電気電子工学科 3 コマ
        1年 物質生命科学科 1 コマ
        1年 コンピュータシステム学科 0 コマ
        1年 人間情報デザイン学科 0 コマ
         ・・・・・
      				
    3. 乱数初期値: 乱数の初期値.

    4. 午前中コマ数: 午前中に開講されるコマ数.

    5. 講義開講日/週: 1週間の講義日

    6. コマ数/日: 1日当たりのコマ数

    7. 講義時間: 同じ時間に講義が重複した場合に対するペナルティ(現在のプログラムでは,このようなケースは発生しない)

    8. 講義室: 講義室が確保できなかった場合に対するペナルティ

    9. 教員: 教員が重複した場合に対するペナルティ

    10. 教員都合: 教員が講義できない曜日・時限(教員データの「不可能」の部分)に講義が配置された場合に対するペナルティ

    11. 連続: 2コマ以上の講義が,昼休みなどによって中断された場合に対するペナルティ

    12. 実験(中間): 実験科目が,午後の最後ではなく,その前の時限に配置された場合に対するペナルティ

    13. 実験(午前中): 実験科目が午前中に配置された場合に対するペナルティ

    14. 空き/同日同講義: 講義間に空いた時間(コマ)があることに対するペナルティ.高校の場合は,同じ日に同じ科目が2回以上開講される場合のペナルティ

    15. 必修: 必修科目間に選択科目が配置されている場合に対するペナルティ.高校の場合は,この項目は無視される.

  5. 実行の制御

      指定された実行回数だけ実行された場合,入力データに誤りがあった場合,または,改善が不可能になった場合は,実行を終了します.入力データに誤りがあった場合(科目数が多すぎる場合も含む),及び,改善が不可能であるというメッセージが出力された場合には,データを修正した後,再実行してみてください.入力データに誤りがある場合はそれを修正すればよいわけですが,それ以外の場合は,どのようにデータを修正すべきかは,状況によってかなり異なります.たとえば以下のようなことを試みてください.

    1. 乱数の初期値を変える
    2. ペナルティを変える
    3. 使用講義室を変更する
    4. 移動すると大きな影響が出るような講義は,固定した位置に配置する.

  6. 出力

      出力された結果をそのまま利用することも可能ですが,多少変更を加えたい,教員毎の講義曜日・時限を出力したい,講義室の使用状況を見たいなどの要求がある場合もあります.そのような場合は,出力結果における「学年,学科,曜日,1限目,2限目,3限目,・・・」と表示された行以降をコピーし,その内容をディレクトリ cpp/result にある白紙時間割「white.xsl」に貼り付けてください.「white.xsl」には,「check」というマクロが定義されており,そのマクロを実行することによって,講義室や教員の重複をチェックすると共に,教員毎の講義曜日・時限や各講義室の使用状況を出力することができます.

      Excel 上で,時間割データを修正することが可能ですが,タイトル行(「学年,学科,曜日,1限目,2限目,3限目,・・・」)の内容を変更したり(タイトル行の前に行を挿入することは可能です),時間割内に行や列を追加したり,または,行や列を削除したりすると,check マクロが正しく動作しなくなる可能性があります.また,Excel 上では,複数学科を対象とした講義であるか否かのチェックは行っていませんので,複数学科を対象とした講義を移動,修正する場合は十分注意してください.

      なお出力された結果には,科目名の後に「:10」などの番号が付加されています.これは,教員や講義室の重なりをチェックする際に必要なため(複数学科に対して開講する科目と,同じ教員が複数の学科に対して同じ講義を行う場合を区別するため)に付加したものです.最終的に必要がなくなった際は,「delete」マクロを実行することによって削除できます.

情報学部 菅沼ホーム 時間割作成目次