Lispとは ゲーム理論 minimaxアルゴリズム αβアルゴリズム ソースコードの一部

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
東京工科大学 コンピュータサイエンス学部 亀田弘之
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
プログラミング入門 (教科書1~3章) 2005/04/14(Thu.).
Ex8. Search for Vacuum Problem(2)
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
VBA H106077 寺沢友宏.
オブジェクト指向言語論 知能情報学部 新田直也.
2009/10/9 良いアルゴリズムとは 第2講: 平成21年10月9日 (金) 4限 E252教室 コンピュータアルゴリズム.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
アルゴリズムとデータ構造 2011年6月13日
単位 おねだり ☆オセロ おねだり隊☆D班.
オブジェクト指向 プログラミング 第一回 知能情報学部 新田直也.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
二分探索木によるサーチ.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
L3. Search for Decisions in Games
第10回関数 Ⅱ (ローカル変数とスコープ).
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
アルゴリズムとデータ構造1 2006年6月16日
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
アルゴリズムとデータ構造 2010年7月26日
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
再帰的手続き.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
アルゴリズムとデータ構造1 2006年7月11日
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
アルゴリズムとデータ構造 2012年6月11日
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造 2013年7月1日
執筆者:難波和明 授業者:寺尾 敦 atsushi [at] si.aoyama.ac.jp
さまざまなプログラミング言語, オンライン開発環境
情報論理工学 研究室 第8回: ミニマックス法.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
第10回 関数と再帰.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
Presentation transcript:

Lispとは ゲーム理論 minimaxアルゴリズム αβアルゴリズム ソースコードの一部 Lispによるothello Lispとは ゲーム理論 minimaxアルゴリズム αβアルゴリズム ソースコードの一部

Lispとは 記号処理を中心にしたプログラム言語。 リスト形式のデータ処理に向いている。 人工知能(AI)研究などの分野で使われている。 1962年に米MIT(マサチューセッツ工科大学)のJ.マッカーシーが考案し、その後様々な研究機関が独自の拡張を行っていたが、1984年にCommon Lispとして標準化された。 Prologと並ぶ人工知能分野の基本言語で、「リスト」と呼ばれるデータ操作命令の並びの形式を処理するのが特徴。 Lispのプログラミングは、既に定義されているいくつかの関数を組み合わせて新しい関数を作る形で記述される。また、呼び出すべき関数を実行時に決定でき、変数や関数の型宣言が不要リスト処理や記号処理用の機能が組み込まれている。つまり関数型言語である。

ゲーム理論とは ゲーム理論はAIの最も古いアリアのひとつです。ゲームを難しくしているのは限られた時間の中で問題をとかなければならないことです。 例えばチェス。    チェスでは平均分岐数が約35個ある。各プレーヤーは大体50ステップずつ行うので、トータルで35100もの分岐が考えられる。    これだけの分岐をすべてチェックするのは一生かかっても無理かもしれない。 このようにゲーム理論は現実的な問題を解決する上で有力なものである。

Minimaxアルゴリズム ミニマックス法は非常に単純な考え方で、相手がこちらの一番不利になる手を打ってくるとして、自分が打てる最良の手を探すアルゴリズムです。つまり、相手は評価をMINにする手、自分はその中で評価をMAXにする手を選ぼうというものです。

αβアルゴリズム この方法はミニ・マックス法と基本的に同じ考え方で、相手は常に一番有利な手を打って来ると考えますが、その上でこれ以上は考えても自分にとって不利な手しか出てこないような枝については、省略して行くという方法です。 盤面の評価を行いながら木を掘り進めることで、余計な枝について評価や探索を行うことを防ぎます。 資源(メモリ、CPU)の有効利用につながります。

Othelloのソースコード① (defun minimax (player board ply eval-fn) (if (= ply 0)    (funcall eval-fn player board)    (let ((moves (legal-moves player board))) (if (null moves)    (if (any-legal-move? (opponent player) board)       (- (minimax (opponent player) board (- ply 1) eval-fn))          (final-value player board)) (let ((best-move nil) (best-val nil))    (dolist (move moves) (let* ((board2 (make-move move player (copy-board board))) (val (- (minimax (opponent player) board2 (- ply 1) eval-fn)))) (when (or (null best-val) (> val best-val)) (setf best-val val) (setf best-move move)))) (values best-val best-move))))))

Othelloのソースコード② (defun alpha-beta (player board achievable cutoff ply eval-fn) (if (= ply 0)    (funcall eval-fn player board)    (let ((moves (legal-moves player board))) (if (any-legal-move? (opponent player) board)    (- (alpha-beta (opponent player) board (- cutoff)                      (- achievable) (- ply 1) eval-fn)) (final-value player board)) (let ((best-move (first moves))) (loop for move in moves do  (let* ((board2 (make-move move player (copy-board board))) (val (- (alpha-beta (opponent player) board2 (- cutoff)                      (- achievable) (- ply 1) eval-fn))))          (when (> val achievable) (setf achievable val) (setf best-move move))) until (>= achievable cutoff)) (values achievable best-move)))))

Othelloの始め方 とタイプして、実行するとゲームが始まります。 Minimax vs αβ 結果は? (othello     (minimax-searcher 3 #'count-difference)     (alpha-beta-searcher 3 #'weighted-squares)) とタイプして、実行するとゲームが始まります。 Minimax vs αβ 結果は?

おまけ(さらにOthelloをJessで) JessとはExpertSystem構築ツールであるCLIPSをJAVA環境で使用できるようにしたもの。 文法はLISPになかなか似てる。 人工知能プログラミング + JAVA LISPで書いたコードを100%JESSにtranslateすることは難しい。(多分無理。) =>足りないところはJAVAで。

おまけ(続き・・・) イメージ データ JAVA (GUI担当) JESS (アルゴリズム担当) データ

JavaとJessのコード public int[][] minimax(int player, int[][] board, int ply){ int eval = 0; int[][] position = new int[1][1]; ・・・・・・ return position;    } Minimaxメソッド 引数:player(現在のplayer)、board(現在のboard)、ply(検索木の深さ) Return:position(minimaxによって決められた手)

JavaとJessのコード① public int[] minimax(int player, int[][] board, int ply){ int eval = 0; int[] position = {0}; if(ply == 0){ eval = weightedSquares(player, board); } else{ minimax2(player, board, ply); return position;

JavaとJessのコード② private int[] minimax2(int player, int[][] board, int ply){ int[][] possibleStone; possibleStone = parent.checkAll2(parent.turn); try{ r.executeCommand("(bind ?moves (create$ ))"); for(int i = 0; i < 8; i++){ for(int j = 0; j < 8; j++){ if(possibleStone[i][j] == 1) r.executeCommand("(bind ?moves (create$ ?moves "+ (i*10 + j) +"))"); } if(r.executeCommand("(eq ?moves (create$ ))").equals("TRUE")){ r.executeCommand("" + "" + ""); else minimax3(player, board, ply); catch(JessException je){ System.err.println(je); return new int[1];