(Powerpoint形式)7月4日配布資料のダウンロード - 高橋研究室

Download Report

Transcript (Powerpoint形式)7月4日配布資料のダウンロード - 高橋研究室

2014年度数理工学プログラムコンテスト
2014年7月4日
京都大学 情報学研究科
修士2回 加藤 将隆
駅改札方向制御アルゴリズム
改札の通過方向を制御し,
客をなるべく待たせずに
通過させることを目指す
2014/7/4
2
駅改札モデル
6台の自動改札機
各改札にentryエリアとexitエリアが隣接
駅構外
entry
gate
exit
ホーム
2014/7/4
3
駅改札モデル
エリアの各マスには1人しか入れない
各サイドで客は到着するとキューに並ぶ
exitサイドは一定期間毎(列車の到着毎)
に客の到着率が増加
時間はタイムスロット化されている
1タイムスロットは1秒
2014/7/4
4
イメージ
(アニメーション)
entry
gate
exit
2014/7/4
5
タイムスロット
1秒
…
…
時間
通過客
客の通過 客の移動 方向転換する 客の到着 選んだ改札の 客の到着
の離脱
改札の選択 (エリア)
方向転換
(キュー)
2014/7/4
6
1タイムスロット中の挙動
通過客の離脱
前スロットで通過に成功した客が離脱する
entry
gate
exit
2014/7/4
7
1タイムスロット中の挙動
客の通過
目の前の改札が進行方向通りであれば,
通過して対岸エリアに移動
entry
gate
exit
2014/7/4
8
1タイムスロット中の挙動
客の通過 (例えば…)
対岸マスに客がいる場合でも通過可能,
対岸にいた客はキューに戻される
entry
gate
exit
2014/7/4
9
1タイムスロット中の挙動
客の移動
目の前の改札が進行方向と逆であれば,
左右のマスに移動, 無理ならば留まる
entry
gate
exit
2014/7/4
Stay!
10
1タイムスロット中の挙動
客の移動 (例えば…)
左右どちらにも移動できる場合は両マスの
進行方向を確認し, 進めそうな方に移動する
(方向が同じ場合はランダム)
entry
gate
exit
2014/7/4
11
1タイムスロット中の挙動
客の移動 (例えば…)
移動先がかぶった場合, 一方が移動に成功,
他方はキューに戻る (客の区別はなし)
entry
gate
exit
2014/7/4
12
1タイムスロット中の挙動
方向転換する改札の選択
0~6個選択可能
entry
gate
exit
2014/7/4
13
1タイムスロット中の挙動
キューから各エリアに到着
現時点での進行方向に合ったマスに移動
選択肢が複数ある場合はランダム選択
entry
gate
exit
2014/7/4
14
1タイムスロット中の挙動
キューから各エリアに到着 (例えば…)
進行方向が合っていても他の客がいる場合は
移動できない
entry
gate
exit
2014/7/4
15
1タイムスロット中の挙動
選択した改札の方向を反転
entry
gate
exit
2014/7/4
16
1タイムスロット中の挙動
客のキューへの到着
人数はポアソン分布に従う
entry
gate
exit
2014/7/4
17
次スロットでは…
方向転換による影響
entry
gate
exit
通れると思って来たのに
反転してて通れない…
2014/7/4
移動先が通れるように
なっている!
18
駅環境
 3600スロットを観測 (1時間)
 nスロット(ex. n=300: 5分)毎に列車が到着,
その後mスロット (ex. m=60: 1分)間到着率UP
 列車の到着, 各キューの人数は把握可能
 総延べ待ち時間を計測
 スロット毎に (系内客数)×1 をカウント
 平均待ち時間 = 総延べ待ち時間 / 総到着客数
2014/7/4
19
コンテスト課題
1. 通過客の離脱
2. 客の通過
3. 客の移動
4. 方向転換する改札の選択
5. 客がキューから各エリアに到着
6. 選択した改札の方向転換
7. 客のキューへの到着
2014/7/4
20
コンテスト課題
効果的な方向制御アルゴリズムを
考案してください
平均待ち時間が最小となるように
entry
gate
exit
exitサイドの待ち人数が多いから
出場方向の改札を増やそう
2014/7/4
反転させて次スロットで
通れるようにしよう
21
ルール
 各参加者のプログラムを実行
 異なる5種類の到着流についてそれぞれ
平均待ち時間を計測し、それらの合計が
最も小さい者の勝ち
 方向転換する改札の選択アルゴリズム
以外の部分のプログラムはこちらで用意
 計算機室のPCでコンパイル・実行
2014/7/4
22
サンプルと演習問題
準備
 ファイルのダウンロード


ページ名:第13回数理工学プログラムコンテスト
URL: http://infosys.sys.i.kyoto-u.ac.jp/~contest/2014/
プラットフォームとサンプルのダウンロードをクリック.
→カレントディレクトリに保存する.
 ファイルの解答
$ tar zxvf contest2014.tar.gz
 ディレクトリの移動
$ cd contest2014
2014/7/4
24
準備
 ソースファイル一覧



2014/7/4
platform.c:プラットフォーム
sample.c:サンプルアルゴリズム
gate.h:共通ヘッダファイル (関数の定義等)
25
準備
 プラットフォーム, サンプルを個別にコンパイル
$ gcc –o gate platform.c -lm
$ gcc –o sample sample.c
 実行
$ ./gate man (手動で改札選択)
$ ./gate sample (サンプルプログラムによる改札選択)
2014/7/4
26
操作方法 (手動選択の場合)
 向きを反転させる改札の数を決定
 メッセージ “How many gates do you shift?”
に対して, 整数値0~6を入力→Enterキー
 向きを反転させる改札を選択
 メッセージ “Which gate do you shift?”
に対して, 整数値0~5を入力→Enterキー
上で選んだ個数分, 入力を繰り返す
2014/7/4
27
シミュレーションの流れ(1)
 初期化 [関数: InitStatus]
 各キューの客数を0に.
 各エリアの客数を0に.
 ゲートは, No.0から順に↓↑↓↑↓↑と配置.
 状態を出力する関数: PrintStatus
 タイムスロット中, 各アクション後に実行.
 すなわち, 客の離脱後, 通過後, 移動後,…,の各状態が
毎回出力される.
2014/7/4
28
シミュレーションの流れ(2)
 通過客の離脱 [関数: Departure]
 エリアにいる通過客は”-1”(端末上は”P”)で表現される.
 通過前の客”1”と区別するため
 “-1”のエリアの値をすべて0に.
 客の通過 [関数: Passage]
 値が”1”であるエリアに対して, 改札の向きが進行方向
と一致していれば, 元エリアの値を”0”に, 到達先エリ
アの値を”-1”にする.
2014/7/4
29
シミュレーションの流れ(3)
 客の移動 [関数: Move]
 値が”1”であるエリアに対して, 改札の向きが進行方向
と一致していなければ, 隣エリアへの移動を試みる.
 両隣の改札の向きを確認し, 片方のみが進行方向と一
致していればそちらに移動する. 改札の向きが両方と
も同じであれば, ½ずつの確率でエリアを選択し, 移
動する.
 2人の客が移動を試みる先が同じエリアになった場合,
1人が移動に成功し, 1人はキューに戻る.
(客の区別はつかないので, シミュレーション上問題は
ない.)
2014/7/4
30
シミュレーションの流れ(4)
 方向転換する改札の選択 [関数: DecideShift]
 配列choice_gate[]を用いる.
(選択されていれば1, 選択されていなければ0をとる)
 手動選択の場合, 入力された番号に応じて
choice_gate[]の値を1にする.
 プログラムによる選択の場合, プログラムの実行結果
に応じてchoice_gate[]の値を1にする.
2014/7/4
31
シミュレーションの流れ(5)
 方向転換する改札の選択 [関数: DecideShift]
 プログラムによる選択の場合
3. スロット数, 各キューの客数,
エリア・改札の情報を取得
1. スロット数, 各キューの客数,
エリア・改札の情報を書き込み
gate.tmp
platform.c
sample.c
6. 改札の選択
情報を取得
5. 改札の選択
情報を書き込み
4. 反転させる
改札の選択
2. プログラムの呼び出し
2014/7/4
32
シミュレーションの流れ(6)
 キューからエリアへ到着 [関数: ArrivalToArea]
 まず到達可能なエリアの数を調べる.
 到達可能エリア数よりもキューの客数の方が多ければ,
すべての到達可能エリアの値を”1”にし, キューの客数
を到達エリア数分減じる.
 到達可能エリア数よりもキューの客数の方が少なけれ
ば, 等確率で到達エリアを選択して客を到着させる.
2014/7/4
33
シミュレーションの流れ(7)
 改札の向き反転の実行 [関数: DoShift]
 Choice_gate[]の値が1である改札の向きを反転.
(gate[]の値が1であれば0に, 0であれば1にする)
 キューへの到着 [関数: ArrivalToQueue]
 ポアソン分布に従い客がキューに到着する.
 このとき, 総到着客数を更新しておく.
2014/7/4
34
設計パラメータの設定
 列車到着パラメータ (“gate.h”内に記述)
 inter_train: 列車の到着間隔
 burst_period: 列車到着後, 出場客の到着率が増加
している期間(バースト期間)の長さ
 客の到着率 (“platform.c”内に記述)
 lambda_entry: 入場客のキューへの到着率
 lambda_exit_off: 出場客の到着率(非バースト期間)
 lambda_exit_burst: 出場客の到着率(バースト期間)
列車の到着の情報はアルゴリズムに組み込めるが,
客の到着率の値の情報は組み込めない!
2014/7/4
35
サンプルプログラム
 sample.c
 1タイムスロット毎に, ランダムに1つの改札を選んで
反転させるプログラム
 エリア・改札の情報やキューの客数の情報は何も考慮
していない, 「何の工夫もない」アルゴリズム.
2014/7/4
36
演習問題
 演習問題1
 1タイムスロット毎に, ランダムに複数の改札を選んで
反転させるプログラム
 サンプルの拡張だが, 相変わらず工夫はない.
 同時に大量の改札の向きが反転し得るため, サンプル
より性能が悪くなる場合も….
 choice_gate[]の役割を確認してください.
2014/7/4
37
演習問題
 演習問題2
 列車が到着したら全改札を出場方向に変更し, バース
ト期間の間その状態を保ち続けるプログラム
 タイムスロットの値によって, 列車が到着したのか,
バースト期間中なのかを判断するのに工夫が必要.
2014/7/4
38
演習問題
 演習問題3
 タイムスロット毎に各キューの客数を比較し, より多
く並んでいる側の進行方向の改札を1つ増やすような
プログラム
 まずはキューの客数を比較し, どちらの方向の改札を
反転させるのかを決める.
 「候補の改札の中から」ランダムに1つ選択するのに
工夫が必要.
2014/7/4
39
コンテスト参加に際して
 方針
 まずはサンプル等で色々動かしてみて, 客がどのよう
な挙動をとるか観察してください.
 サンプルや演習問題のアルゴリズムでは使っていない
情報もあります. どの情報をアルゴリズムに組み込む
ことができるか, 考えてみてください.
 コンテストの評価は, 様々な客の到着率や列車の到着
パターンについて行います. 自分で値を変えて, どんな
パラメータの組み合わせに対しても強いアルゴリズム
を目指してください.
2014/7/4
40
コンテスト参加に際して
 制限事項
 entryかexit, どちらかのキューの客数が1000を超え
るとプログラムは途中で停止するようになっています.
停止した場合, 他の到着流でのシミュレーション結果
にかかわらず失格とするので注意してください.
 1タイムスロットあたりの思考時間は1秒とします.
1秒を超過すると, アルゴリズムにかかわらずその
タイムスロットではどの改札も選択しなかったもの
としてプログラムが続行されます.
2014/7/4
41
出題者からのコメント
 “最適な”解は(おそらく)ありません
 工夫の余地は沢山あります
 高度なプログラミングスキルは不要
 アイデアをいかにプログラムで表現するか
 楽しんでください
 身近な題材をプログラミングで環境改善
コンテスト担当TA連絡先: [email protected] (加藤)
2014/7/4
42