Microsoft PowerPoint - DA1_2018.pptx

Similar documents
Microsoft PowerPoint - ゲーム理論2018.pptx

PowerPoint Presentation

PowerPoint Presentation

Microsoft PowerPoint - 計算機科学入門2014.pptx

プログラム言語及び演習Ⅲ

Microsoft PowerPoint - ゲーム理論2016.pptx

Microsoft PowerPoint - ca ppt [互換モード]

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

Taro-再帰関数Ⅲ(公開版).jtd

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

論理と計算(2)

データ構造と  アルゴリズムⅠ

Microsoft PowerPoint - 05.pptx

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

Microsoft PowerPoint - 13approx.pptx

Microsoft PowerPoint - algo ppt [互換モード]

Taro-最大値探索法の開発(公開版

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

Microsoft PowerPoint - DA2_2018.pptx

論理と計算(2)

Microsoft PowerPoint - ppt-7.pptx

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - IntroAlgDs pptx

AI 三目並べ

Microsoft PowerPoint - DA2_2017.pptx

アルゴリズムとデータ構造

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

模擬試験問題(第1章~第3章)

program7app.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

戦略的行動と経済取引 (ゲーム理論入門)

メソッドのまとめ

情報 システム工学概論 コンピュータゲームプレイヤ 鶴岡慶雅 工学部電子情報工学科 情報理工学系研究科電子情報学専攻

Microsoft PowerPoint - mp11-06.pptx

2

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

PowerPoint プレゼンテーション

PG13-6S

Taro-再帰関数Ⅱ(公開版).jtd

memo

PowerPoint Presentation

情報処理Ⅰ

memo

memo

Microsoft PowerPoint - 10.ppt [互換モード]

Microsoft Word - lec_student-chp3_1-representative

Microsoft PowerPoint - lec10.ppt

kiso2-09.key

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

発展プログラミング (5) 例題 5-03( 応用プログラム 3 目並べ その 2) 勝敗判定機能をそなえた 3 目並べ のゲーム盤を作りましょう 必要な変数を考えましょう 1 マス目の状態を保持する配列 整数型 :mas[] 2 何手目かを数える変数 整数型 :nante 3 ゲームが終了したかど

PowerPoint Presentation

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

Information Theory

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Microsoft PowerPoint - 09re.ppt [互換モード]

Microsoft PowerPoint - DA2_2019.pptx

PowerPoint Presentation

cp-7. 配列

2

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

Microsoft PowerPoint - kougi10.ppt

混沌系工学特論 #5

DA13

人工知能入門

An Automated Proof of Equivalence on Quantum Cryptographic Protocols

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft PowerPoint - prog08.ppt

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - ad11-09.pptx

問題1 以下に示すプログラムは、次の処理をするプログラムである

CプログラミングI

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

簡単な検索と整列(ソート)

離散数学

gengo1-11

PowerPoint Presentation

プログラミングI第10回

Microsoft PowerPoint P演習 第10回 関数.ppt [互換モード]

データ構造

Microsoft PowerPoint - 2.ppt [互換モード]

æœ•å¤§å–¬ç´—æŁ°,æœ•å°‘å–¬å•“æŁ°,ã…¦ã…¼ã‡¯ã…ªã……ã…›ã†®äº™éŽ¤æ³Ł

ex04_2012.ppt

構造化プログラミングと データ抽象

プログラミング入門1

Microsoft PowerPoint - prog07.ppt

gengo1-8

進捗状況の確認 1. gj も gjp も動いた 2. gj は動いた 3. gj も動かない 2

明治大模擬2

構造化プログラミングと データ抽象

Microsoft Word - no11.docx

母平均 母分散 母標準偏差は, が連続的な場合も含めて, すべての個体の特性値 のすべての実現値 の平均 分散 標準偏差であると考えてよい 有限母集団で が離散的な場合, まさにその意味になるが, そうでない場合も, このように理解してよい 5 母数 母集団から定まる定数のこと 母平均, 母分散,

オートマトン 形式言語及び演習 1. 有限オートマトンとは 酒井正彦 形式言語 言語とは : 文字列の集合例 : 偶数個の 1 の後に 0 を持つ列からなる集合 {0, 110, 11110,

Microsoft PowerPoint - program.ppt [互換モード]

INTRODUCTION TO ALGORITHMS

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

Microsoft PowerPoint - OS12.pptx

Transcription:

木の利用例 ( ゲーム木 ) データ構造とアルゴリズム ⅠB 第 回 自分の手番 / 相手の手番で分岐していく 77 例題 二人で交代に,1 から順に までの数を言う. 言う数の個数は,1 個, 個,3 個のいずれか好きなのを選んでよい 最後に を言った方が負け 必勝法 を言って, 相手に順番を回せば絶対勝ち 一方,0 を言って, 相手に順番を回せば, 相手が何個を選んでも, 次に を言える --- 絶対勝ち 同様に,16 を言って, 相手に回せば次に 0 を言える --- 絶対勝ち 同様に,1,, を言って回せば勝ち 先手が何を言おうと, 後手は を言って回せる 結局, 後手が必勝 7 79 このゲームの性質 二人で交代に順番が回ってくる 自分の前の相手の行動 / 手は完全に観測できる 偶然の入る余地がない 多くのゲームは同様な性質を持つ チェス, 将棋, オセロ, 囲碁, 五目並べ,etc. 上記の性質を満たさないもの バックギャモン : さいころ ポーカー : 相手の手は見えない ブリッジ : プレイヤの協調 必勝法 二人, 完全情報, 決定的なゲームは, 原理的には必勝法が存在する 先手必勝 / 後手必勝 / 引き分け 先手 / 後手を決めた時点で勝負はついている ( ゲームをするまでもない )! 0 1 1

必勝法 ( 続き ) 簡単なゲームなら必勝法が分かる ( 三目並べ ) 引き分け 五目並べ先手必勝 6x6 オセロ後手必勝 複雑なゲームでは分かっていない 分かってしまえばゲームは終り? ゲームの木 状態 / ノード : ゲームの可能な状態 状態の遷移 / リンク : 正しい手により遷移可能な状態間を結ぶ ( 一方向 ). 先手を MAX プレイヤ, 後手を MIN プレイヤ, 先手の順番 ( 手番 ) に対応する状態を MAX ノード, 後手の手番の状態を MIN ノードと呼ぶ. 勝ち負けが決まったノードを端点と呼ぶ 3 例 : を言ったら負け ノードのラベル付け ( 考え方 ) 3 wi wi 3 wi 1 3 wi wi 3 wi お互いに自分が勝つようにベストを尽くす wi/ のラベルは先手 (MAX プレイヤ ) の立場 MAX プレイヤは, 絶対勝てる手があればそれを選び, 後手 (MIN プレイヤ ) は,MAX プレイヤを絶対負かすことができる手があれば, それを選ぶ ノードのラベル付け ノードのラベル付け 以下のように再帰的に定義 端点に関して, そのまま wi/ MAX ノードに関しては, 子ノードに少なくとも一つ wi があれば wi, すべて なら MIN ノードに関して, 子ノードに少なくとも一つ があれば, すべて wi なら wi wi を 100, を -100 とすると, 上記の処理は MAX ノードでは子ノードの最大値,MIN ノードでは最小値を取ることに対応 3 wi wi 3 wi 1 3 wi wi 3 wi 6 7

例題 : ニム ( コイン取り ) コインが 1 個と 6 個の列 交互に,1 個もしくは隣り合う 個を取る 最後に 1 個もしくは隣り合う 個を取った方が勝ち 先手必勝 / 必負?, 木を書いて確かめよう 状態 / ノード 各列の個数の ( 小さい順に並べた ) リストで表現 : 初期状態は (1, 6) 初期状態から遷移可能な状態 : (6), (1, ), (1, ), (1, 1, ), (1,, 3) すべての木を展開するのは大変なので, とりあえず (1, ) から木を展開してみよう 9 ゲーム木の展開 必勝法を見つけるためには 必ずしも木を完全に展開する必要はない ある MAX ノードに関して, 子ノードに少なくとも一つの WIN があれば, その MAX ノードは WIN 他の子ノードは展開しなくても良い ある MIN ノードに関して, 子ノードに少なくとも一つ LOST があれば, その MIN ノードは LOST 他の子ノードは展開しなくて良い 90 ゲーム木のサイズ チェッカー 10の30 乗 世界チャンピオン オセロ 10の60 乗 世界チャンピオン チェス 10の10 乗 世界チャンピオン 将棋 10013 の0 年 A 乗級プロ棋士に勝利アマ 段! 囲碁 10の360 乗モンテカルロ碁が強い 016 年アルファ碁がアマ 級 チェッカーでも必勝法はトッププロに勝利まだ見つかっていない! 007 年に引き分けであることが証明された 91 クイックソート 個の数に対して最悪実行時間 ( ) のソーティングアルゴリズム 平均実行時間は ( log ) 記法に隠された定数も小さい i-place ( 一時的な配列が必要ない ) 9 7.1 クイックソートの記述 分割統治法に基づく 部分配列 A[p..r] のソーティング 1. 部分問題への分割 : 配列 A[p..r] を つの部分配列 A[p..q] と A[q+1..r] に再配置する. A[p..q] のどの要素も A[q+1..r] の要素以下にする. 添字 q はこの分割手続きの中で計算する.. 部分問題の解決 ( 統治 ): 部分配列 A[p..q] と A[q+1..r] を再帰的にソート 3. 部分問題の統合 A[p..r] はすでにソートされているので何もしない 93 3

クイックソートのコード ( 章末問題 7.1 の Hoare バージョン, ) void QUICKSORT(data A[], it p, it r) { it q; if (p < r) { q = PARTITION(A,p,r); QUICKSORT(A,p,q); QUICKSORT(A,q+1,r); mai(){ 配列 D の初期化 QUICKSORT(D,1,); 9 配列の分割 it PARTITION(data A[], it p, it r) // O() 時間 { it i, j; data x, tmp; x = A[p]; i = p-1; j = r+1; while (1) { do {j = j-1; while (A[j] > x); do {i = i+1; while (A[i] < x); if (i < j) { tmp = A[i]; A[i] = A[j]; A[j] = tmp; else { retur j; 9 i A[p..r] 3 6 1 3 7 j 初期状態 : i と j は配列の範囲外 x = A[p] = によって分割 x: 枢軸 (pivot) と呼ぶ 3 3 6 1 7 i j A[i] x A[j] x となる最初の i, j 3 6 1 3 7 i j 3 3 6 1 7 i j A[i] x A[j] x となる最初の i, j 7 は正しい分割位置にある A[i] と A[j] を交換正しい分割位置になる 96 3 3 1 6 7 i j 3 3 1 6 7 j i A[i] と A[j] を交換 i j となったので q = j を返す A[p..q] は x 以下 A[q+1..r] は x 以上 97 課題 A=<,, 6,, 1, 3> に対して, PARTITION(A,1, 6) を実行した結果を求めよ 上記の配列 A に対して QUICKSORT を実行した場合, 手続き PARTITION は何回呼び出されるか? クイックソートの正しさ クイックソートの基本的なアイデアはきわめてシンプル 細かなプログラミングは結構微妙 自分で考えて作ろうとすると幾つかの落とし穴がある 無限ループ! qが配列から外れる! 9 99

課題枢軸 (pivot) を最初の値 A[p] でなく, 最後の値 A[r] にしたらどうなる? A=<,, 6,, 1, 3> なら? 他の値では? it PARTITION(data A[], it p, it r) // O() 時間 { it i, j; data x, tmp; x = A[r]; i = p-1; j = r+1; while (1) { do {j = j-1; while (A[j] > x); do {i = i+1; while (A[i] < x); if (i < j) { tmp = A[i]; A[i] = A[j]; A[j] = tmp; 300 else {retur j; 課題の解答 入力がすでにソートされている場合, 例えば A=<1,> の場合,PARTITION(A, 1, ) が呼ばれる pivot の x=, j=,i= で止まり,i<j ではないので,j= が PARTITION の返り値となる よって,q= なので,PARTITION(A, 1, ) で無限ループ pivot に A[r] を使いたければ, どこを変更すべき? void QUICKSORT(data A[], it p, it r) { it q; if (p < r) { q = PARTITION(A,p,r); QUICKSORT(A,p,q); QUICKSORT(A,q+1,r); 301 PARTITION の正当性 PARTITION の返り値を q とする A[p..r] の分割後に満たされるべき条件 A[p..q] はある pivot x 以下 A[q+1..r] は x 以上 p q < r q = r となると,QUICKSORT は停止しない ( 再帰呼び出しの引数が変わらない ). どんな A に対しても q < r となることを保証する必要がある 30 PARTITION の正当性 ( 続き ) q < r が成立する理由 : 枢軸を最初の要素 A[p] にすることが重要, 最後の要素 A[r] にしてしまうとダメ! 枢軸との比較で,i と j の両方で等号も含んで止まることもポイント i は必ず最初の要素 A[p] で止まる j が最後の要素で止まらなければ OK, 止まったとしても i=p との交換で先に進む 303 PARTITION の正当性 ( 続き ) p q が成立する理由 : 終了条件が i j であることがポイント 枢軸よりも小さい要素があれば, その先には j は進めない 枢軸が最小の要素であれば, 外側のループで j=pまで進む i=p なので終了条件が成立して,j=pで終了 7. クイックソートの性能 クイックソートの実行時間は分割が平均化されているかどうかに依存 これはpivotの選択に依存 分割が平均化されていれば実行時間は漸近的にマージソートと同じ (( log )) 最悪時は ( ) 30 30

最悪の分割 最悪の場合は,PARTITION によって領域が 1 要素と -1 要素に分けられる場合 分割には () 時間かかる 実行時間に対する漸化式は T() = T(1) + (), T(1) = (1) T() = ( ) 最悪実行時間は挿入ソートと同じ 入力が完全にソートされているときに起こる ( 挿入ソートなら O() 時間 ) 306 1 1 1 1 1 3 3 1 1 再帰木 307 Total : 最良の分割 クイックソートが最も速く動作するのは, PARTITION によってサイズ / の つの領域に分割されるとき. T() = T(/) + () T() = ( lg ) ちょうど半分に分割される場合が最速 30 lg Total : lg 309 均等分割 課題 PARTITIONで常に 9 対 1 の比で分割されると仮定する T() = T(9/10) + T(/10) + () 再帰木の各レベルのコストは O() 再帰の深さは log 10 lg 9 漸近的には中央で分割するのと同じ 分割の比が 99 対 1 でも同じ ( 定数比なら良い ) 310 A=<, 1,, 6,, 3> に対して, PARTITION(A,1, 6) を実行した結果を求めよ 上記の配列 A に対して QUICKSORT を実行した場合, 手続き PARTITION は何回呼び出されるか? 311 6

乱択の強さ ランダム / 行き当たりばったりは悪いこと? 敵 / 意地の悪い自然の選択に対抗するには有効 最悪の場合 ( 相手に読まれてしまう場合 ) を回避 例 : ジャンケンで絶対に負けない方法 確率 1/3でグー, チョキ, パーを混ぜる 7.3 乱択版クイックソート クイックソートの平均的な場合の実行時間を解析する場合, 入力の頻度を仮定する必要がある. 通常は, すべての順列が等確率で現れると仮定 しかし実際にはこの仮定は必ずしも期待できない 最悪の場合がほとんど生じないとは断言できない 最悪の場合が頻繁に生じるかもしれない この仮定が成り立たなくてもうまく動作するクイックソートの乱択版アルゴリズムを示す 31 313 乱択 (radomized) アルゴリズム 動作が入力だけでなく乱数発生器 (radomumber geerator) に依存するアルゴリズム 関数 RANDOM(a,b): a 以上 b 以下の整数を等確率で返すとする. プログラミング言語は擬似乱数発生器 (pseudoradom-umber geerator) を備える 擬似乱数 : 統計的にはランダムに見えるが, 決定的に作られる数 ( の列 ) 乱択アルゴリズム 1 クイックソートを行う前に入力配列の要素をランダムに並び替える 実行時間は入力順序に依存しなくなる アルゴリズムがうまく動作しないのは, 乱数発生器によって運の悪い順列を作る場合のみ 最悪の実行時間は改善されない (( )) 最悪の場合はほとんど起きない --- 入力に依存しない一定の小さい確率で生じる 31 31 乱択アルゴリズム 配列を A[p..r] を分割する前に, A[p] と A[p..r] からランダムに選んだ要素を交換 pivotがrp+1 個の要素から等確率で選ばれることを保障する 分割が平均的にはバランスのとれたものになることが期待できる 316 it RANDOMIZED_PARTITION(data A[], it p, it r) { it i; data tmp; i = RANDOM(p,r); tmp = A[i]; A[i] = A[p]; A[p] = tmp; // 値の交換 retur PARTITION(A,p,r); void RANDOMIZED_QUICKSORT(data A[], it p, it r) { it q; if (p < r) { q = RANDOMIZED_PARTITION(A,p,r); RANDOMIZED_QUICKSORT(A,p,q); RANDOMIZED_QUICKSORT(A,q+1,r); 317 7

7. 平均的な場合の解析 T(): サイズ の入力に対するRANDOMIZED QUICKSORTの平均実行時間を考える すべての値は異なることを仮定 小さい方から数えてi 番目の要素と,i+k 番目の要素が比較される確率は/(k+1) 未満 比較は必ずpivotとの間.i 番目とi+k 番目の間の要素が先にpivotに選ばれると決して比較されない. どちらかがk+1の要素中で最初にpivotに選ばれた時にのみ比較が行われる 1 i 1 O(lg ) O( lg ) i1 k 1 k 1 i1 31