平成25年度 情報工学演習B(夜間主)

担当者

  • 担当:倉重(V407),松本,三林
  • 担当TA:三浦(V407)

演習について

  • 演習の場所
    • R106
  • 演習の進め方
    • 詳しくはガイダンス資料を見てください.
    • 演習ですので欠席はしないでください.毎回出欠を取ります.もし,欠席せざるを得ない場合,その理由と関係書類を提出してください.
  • 質問等
    • 演習やレポート課題の内容,プログラミング方法についての疑問は,倉重まで質問に来て下さい.

レポートについて

レポート作成方法

  • レポートの書き方の説明および雛形として次のtexファイルを用いること.
  • 上記texファイルをダウンロードし,解凍する.
    • tar xvf report_sample.tar
  • 解凍してできたファイルを用いて以下のコマンドでpdfファイルを作成する.作成したpdfファイルを開くことで,レポートの書き方等を書いた資料を読むことができる.
    • platex sample.tex
    • platex sample.tex
      • 二回行うこと
      • エラーなく,sample.dviが作成されていることを確認
    • dvipdfmx sample.dvi
    • evince sample.pdf
  • レポートの作成は,上記ファイルを改変し,作成すること.このとき,同じようにpdfファイルを作成し,期日までに提出すること.

レポート作成時のデータとり

レポート作成上の注意

最終レポート提出期限

  • レポートの最終締切
    • 日時
      • 2013年7月30日(火) 18:30まで受付

出欠席表等

演習スケジュール

  • 開講
    • 月 3,4限(18:40-20:10)
    • 火 3,4限(18:40-20:10)
回数演習日内容資料演習課題
16/3(月)ガイダンス 3.1:コマンド・入力・結果・考察を記述すること
26/4(火)基礎文法 4.4:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
6/10(月)1,2のレポート提出期限
36/10(月)条件分岐 2.6.2:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
46/11(火)反復 2.6.2:作成したプログラム・実行コマンド・入力・結果・考察を記述すること.試行回数は10回で.
6/17(月)3,4のレポート提出期限
56/17(月)配列(1) 2.4:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
66/18(火)配列(2)2.6.1:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
6/24(月)5,6のレポート提出期限
76/24(月)ポインタ(1) 3.3:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
86/25(火)ポインタ(2)3.5:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
7/1(月)7,8のレポート提出期限
97/1(月)関数(1) 4.4:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
107/2(火)関数(2)4.5.2:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
7/8(月)9,10のレポート提出期限
117/8(月)構造体 2.6.1:作成したプログラム・実行コマンド・入力・結果・考察を記述すること.
127/9(火)文字列処理 2.4:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
7/16(火)11,12のレポート提出期限
137/16(火)総合演習N本腕バンディットを解くプログラムの作成(ガイダンス資料参考・教員/TAに教えてもらう)
147/22(月)総合演習N本腕バンディットを解くプログラムの作成(ガイダンス資料参考・教員/TAに教えてもらう)
157/23(火)総合演習レポート:作成したplayer.c・どのように作成したか・実行結果・考察を記述
7/30(火)総合演習のレポート提出期限
  • 注意
    • どのバンディットをプレイしているか分かるように,コンパイル時のコマンドもレポートに記述しておくこと
      • 例:gcc -o game player.c bandit03.o であるなら,バンディット03を実行してることがわかる

N本腕バンディット

N本腕バンディットとは

本演習で用意するN本腕バンディットの一覧

識別番号ファイル難しさ内容テストプレイ
.hfilebandit.h---ヘッダファイルfileplayer.c
00filebandit00.o腕の数3本のバンディットfilegameplay00
01filebandit01.o☆☆腕の数7本のバンディットfilegameplay01
02filebandit02.o☆☆☆腕の数7本のバンディットfilegameplay02
03filebandit03.o☆☆☆腕の数7本のバンディットfilegameplay03
04filebandit04.o☆☆☆☆腕の数7本のバンディットfilegameplay04
05filebandit05.o☆☆☆☆☆腕の数3本のバンディットfilegameplay05
06filebandit06.o☆☆☆☆☆腕の数3本のバンディットfilegameplay06
07filebandit07.o☆☆☆☆腕の数3本のバンディットfilegameplay07
08filebandit08.o☆☆☆☆☆腕の数5本のバンディットfilegameplay08
  • 注意
    • テストプレイは,該当ファイルをダウンロード後に「chmod +x ファイル名」が必要
      • 例: chmod +x gameplay00

N本腕バンディット・オブジェクトファイルの使用方法

N本腕バンディットプレーヤー創作(総合演習)

  • 全ての演習終了まで関係なし.

目的

  • バンディットを自動的にプレイし,解く(高い報酬を得る)プログラムを作成する.

アプローチ

  • 対象のバンディットを決める
    • bandit00とあと二つ程度選択
  • 自分でバンディットをプレイし,高い報酬を得るためにはどのように腕を選択すべきか考える.
  • 考えた選択の方法をプログラムで実装する

作成したプログラムの出来の評価方法

  • 作成したプログラムがどれだけ良いのか,その評価はどれだけ報酬をもらえたかで為される.
  • ここでは,10万回プレイをし,その中で連続した1万回のプレイで得た報酬の合計としている.これを「 スコア」とする.
  • 他の人が作成したプログラムよりも高い「スコア」を得ていれば,他の人が作成したプログラムよりも優れていることを示す.

まずやること・バンディットを解くプログラムの作成

  • このページを参考に,
    • select_arm=
  • の値を決めるプログラムを作成する.

N本腕バンディットを解くプレーヤーを作成したときに,他と比較・競うために

スコア(演習の成績とは関係なし)

学生番号氏名000102030405060708Total Max
1000000ランダム?10000521620040718722959113623165836729774810.5
TA2011の学生さん9431679322729.5675922758112510795838885284658
TA2012の学生さん9443319719907582120902.5114323155390749674647.5
100340212012年の学生さん10000716222986715322902112423165812912886151
TA201310000.004049.0020282.504016.0020346.001124.002316.005853.007413.0073635.50
1103400110000.007141.0022929.007121.0022863.001121.002315.0010000.009108.0092143.00
1103400210000.007116.0022827.007126.0022893.001103.002315.005804.009077.0074264.50
1103400310000.001069.0022827.007124.0021450.001083.00914.005792.006087.0072007.50
1103400410000.002646.0020352.507115.0021465.001116.00915.005805.005187.0073116.00
1103400810000.007118.0022687.507075.0022794.001136.00915.005804.009040.0086252.50
1103400910000.002656.0020362.507142.0022761.001115.001673.005799.006196.0075891.00
1103401210000.007126.0022920.007123.0022926.001132.002311.0010000.009073.0091851.00
1103401310000.007126.0022992.007114.0022833.001130.002316.0010000.0010000.0091857.00
1103401410000.007116.0022921.007103.0022825.001111.002315.0010000.0010000.0092710.00
1103401610000.007146.0023013.007145.0022935.001124.002318.0010000.0010000.0093260.00
1103401810000.003939.0019807.503973.0019803.501091.002314.005796.007193.0073686.00
1103401910000.007121.0021515.007132.0023031.001095.001001.006443.009094.0073546.00
1103402010000.007144.0022968.007170.0022986.001111.002317.0010000.0010000.0093292.00

日本語が出なくなったときの対応

推奨

  • コンピュータで扱える日本語はいくつかあるが,ターミナルはEucという文字しか表示できない.プログラムの中でEuc以外の日本語を使用すると表示されなかったり読めない文字が出てきたりする.その場合,以下の方法でプログラム中の日本語をEucにする.
    • Emacsで以下のコマンドを打つ
      • ctrl-x (Controlキーを押しながらxを打つ)
      • return
      • f
    • すると以下のメッセージ
      • Coding system for saving file (default nil):
    • が出るので,続いて以下の文字を打ってreturnキーを押す
      • euc-jp
    • プログラムを保存して完了

最終手段

  • ファイルに対して,使用している日本語の種類を強制的にかえる方法.ただし,バックアップをきちんと取っておかないとファイル自体が消えてしまったり使えないものになったりするので推奨はしない&使用する場合は非常に気をつけること
      • sample.tex中の日本語を強制的にEUC-JPに変える
      • コマンドライン(ターミナル)で作業
    • 元となるファイルをバックアップ
      • cp sample.tex sample.tex.bk
    • 日本語の変換
      • nkf --overwrite -e sample.tex
    • emacでsample.texを開いてEUC-JPにかわっていることを確認

乱数の使い方

  • 乱数の使い方
    • banditの中で簡単に使う方法.ちゃんとした使い方は各自調べた方がよい
  • 0.3の確率で何か(ランダム)をして、0.7の確率で何か(ちゃんと)をする、のような使い方
 double r = (double) rand() / (double)RAND_MAX;
 
 if( r <= 0.3){
   なにか(ランダム)
 }else{
   なにか(ちゃんと)
 }
  • rand()は0からRAND_MAX(と定義されている整数)の間のランダムな数を出力する。なので、
    • rand() / RAND_MAX
  • で、0から1の間のランダムな数となる。よって、これが(上記の例だと)0.3より小さい数である、と考えるのは0.3の確率で生じる、というのと同じことである。
  • 0から4の間の選択しをランダムに選ぶ
 int r = rand() % 5;
 
 switch(r){
 case 0:
   break;
 case 1:
 ...
 }
  • rand() % 5 とやると5で割ったあまりの数(0から4)が得られる。ここで、rand()はランダムな整数なので、ランダムな0から4までの値を得ることができる。

教員用メモ

TA用メモ