平成27年度 情報工学演習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ファイルを作成し,期日までに提出すること.

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

レポート作成上の注意

最終レポート提出期限

  • レポートの最終締切
    • 日時
      • 2015年8月3日(月) 18:30まで受付
    • 提出先
      • R棟一階レポートボックス

出欠席表等

演習スケジュール

  • 開講
    • 月 3,4限(18:40-20:10)
    • 火 3,4限(18:40-20:10)
回数演習日内容資料演習課題
16/9(火)ガイダンス 3.1:コマンド・入力・結果・考察を記述すること
6/15(月)1のレポート提出期限
26/15(月)基礎文法 4.4:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
36/16(火)条件分岐 2.6.2:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
6/22(月)2,3のレポート提出期限
46/22(月)反復 2.6.2:作成したプログラム・実行コマンド・入力・結果・考察を記述すること.試行回数は10回で.
56/23(火)配列 2.6.1:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
6/29(月)4,5のレポート提出期限
66/29(月)ポインタ 3.5:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
76/30(火)関数 4.5.2:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
7/6(月)6,7のレポート提出期限
87/6(月)構造体 2.6.1:作成したプログラム・実行コマンド・入力・結果・考察を記述すること.
97/7(火)文字列処理 2.4:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
7/13(月)8,9のレポート提出期限
総合課題の目的:バンディットを解く(高い報酬を得られる)プログラムの作成
総合課題1の目的:個々のバンディットを解くプログラムの作成
10-前半7/13(月)総合演習1 2.2:他人が聞いて理解できるように手順を言葉にする.3.4:作成したプログラム・実行コマンド・入力・結果・考察を記述すること
10-後半7/14(火)総合演習1演習対象のbanditはbandit00と他3つ好きなものを選ぶこと.レポートはbandit00以外で1つ好きなものを選んで,上記課題を行うこと.「2.2 bandit00.oを解く」となっているがbandit00.o以外を選ぶこと.また2.2で選んだbanditに対して3.4を解くこと.ただし、bandit00に対して、日本語の説明・プログラム作成はやっておいてほしい.
7/23(木)10のレポート提出期限
総合課題2の目的:雛形(スコア計算部分)と自作プログラムを分けて分割コンパイル
11-前半7/23(木)総合演習2 2.6:どのように考えてplayer.cを作ったかの説明・作成したプログラム・実行コマンド・入力・結果・考察を記述すること
11-後半7/23(木)総合演習2演習対象のbanditはbandit00と他3つ好きなものを選ぶこと.レポートはbandit00以外で1つ好きなものを選んで,上記課題を行うこと.
7/27(月)11のレポート提出期限
総合課題1の目的:ひとつのプログラムで全てのバンディットを解くプログラムの作成
12-前半7/27(月)総合演習3教員に指示を仰ぐ(公式スコア登録・汎用player・all bandit...)
12-後半7/28(火)総合演習3演習課題:作成したplayer.cのソースコード、どのように考えて作ったかの説明、実行結果(wikiに出ているスコア)、考察
8/3(月)12のレポート提出期限
  • 注意
    • どのバンディットをプレイしているか分かるように,コンパイル時のコマンドもレポートに記述しておくこと
      • 例: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
TA2012のTAの学生さん9443.003197.0019907.005821.0020902.501143.002315.005390.007496.0074647.50
110340202013年度学生さん10000.007144.0022968.007170.0022986.001111.002317.0010000.0010000.0093292.00
110340162013年度学生さん10000.007146.0023013.007145.0022935.001124.002318.0010000.0010000.0093260.00
120340082014年度学生さん10000.007177.0021565.007149.0023040.001132.001094.0010000.0010000.0073620.00
120340092014年度学生さん10000.007102.0021532.007173.0022950.001102.001119.0010000.0010000.0090015.50
120340162014年度学生さん10000.007198.0022902.007134.0022990.001122.001108.0010000.0010000.0091414.00
120340232014年度学生さん10000.007148.0023028.007162.0022917.001130.001136.005817.009077.0081623.00
100000010000.005241.0017306.007186.0022971.001127.001142.005853.006146.0076279.00
TA201510000.007116.0022698.007132.0022824.001139.001124.0010000.006195.0087322.50
120340060000000000
130340010000000000
1303400207170.0021572.507135.0022938.000009107.0065091.50
130340030000000000
1303400407175.0021677.507154.0022995.000009105.0066211.00
1303400510000.005167.0017280.007109.0022944.001105.001110.005787.006102.0068749.00
130340060000000000
1303400707172.0021602.507146.0022881.000009116.0066416.00
1303400807175.0021617.507138.0022845.000009103.0066271.50
1303400910000.007149.0023016.007177.0022962.001130.001120.0010000.009114.0091139.00
130340100000000000
1303401110000.005176.0020340.507141.0022884.001139.001119.0010000.006155.0071619.50
130340125000.006163.0021285.006133.0022253.001061.001071.005786.0010000.0071952.00
1303401410000.007156.0023007.007152.0022812.001111.001117.005796.009098.0074201.00
130340160000000000
1303401710000.007157.0021607.507142.0022848.001104.001116.0010000.0010000.0089892.00
1303401907164.0021527.507154.0022866.000009101.0066126.50
1303402010000.007166.0021517.507158.0022863.001.001.003.009105.0065547.50
130340210000000000

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

推奨

  • コンピュータで扱える日本語はいくつかあるが,ターミナルは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用メモ