Ken Wakita (https://prg1-2019.github.io/lecture/web/)
2019-11-11
ささいなプログラミングのミスに気づかず時間を浪費してしまう
Errorへの対処
PC のファイルの同期
Dropbox とかを使おう。
基本的には Windows でも問題ない。Java と sbt をインストールすれば ok (のはず)。
「Mac じゃないと駄目」は都市伝説
Mac で作成したファイルを Windows で見るとときどき ._othello.scala
のような妙なファイルが混入する。._
で始まるファイルを削除すれば大丈夫。
インデント
横に長い、縦に長い、繰り返しが長い
高階関数 vs pattern match
気持ちよく書ける/気持ちよく読めるコードを書けばよい
説明可能なコード
コメントを書けば読みやすくなるわけでもない(国語能力、コミュニケーション能力が問われる)
適切な名前の選択、コードの順序 = 説明の順序
Chiusano and Bjarnason, Functional Programming in Scala, Manning, 2014. (4,000円弱 / 322 pages)
邦訳: クイープ、Scala 関数型デザイン & プログラミング、インプレス、2015. (Kindle 版, 3,861円)
英語のデジタル版を買うのなら、プロテクトされていないデータをさまざまな形式(pdf, ePub, Kindle, liveBook)で一括入手できる Manning のサイトがお薦め。
Odersky, Spoon, and Venners, Programming in Scala, second edition, Artima Press, 2010. (Kindle 版 1,879円/852 pages)
開発者が解説する Scala。ものすごい分量。
Oram and Wilson, Beautiful Code: Leading programmers explain how they think, O’Reilly, 2007.
美しいコードについての示唆に富むエッセイ集
throw / Future / thread
foldLeft, foldRight, foreach, map の働きと違い
for と再帰の使い分け
深さ優先探索
subflip(makeList(board, player, position, -1, 0), board, player) ++ subflip(makeList(board, player, position, 1, 0), board, player) ++ subflip(makeList(board, player, position, 0, -1), board, player) ++ subflip(makeList(board, player, position, 0, 1), board, player) ++ subflip(makeList(board, player, position, 1, 1), board, player) ++ subflip(makeList(board, player, position, 1, -1), board, player) ++ subflip(makeList(board, player, position, -1, 1), board, player) ++ subflip(makeList(board, player, position, -1 ,-1), board, player)
500文字越え!
目安は 100 文字
subflip(makeList(board, player, position, -1, 0), board, player) ++
subflip(makeList(board, player, position, 1, 0), board, player) ++
subflip(makeList(board, player, position, 0, -1), board, player) ++
subflip(makeList(board, player, position, 0, 1), board, player) ++
subflip(makeList(board, player, position, 1, 1), board, player) ++
subflip(makeList(board, player, position, 1, -1), board, player) ++
subflip(makeList(board, player, position, -1, 1), board, player) ++
subflip(makeList(board, player, position, -1 ,-1), board, player)
今度は縦が長いよ。しかも記述が冗長。
subflip(makeList(board, player, position, -1, 0), board, player) ++
subflip(makeList(board, player, position, 1, 0), board, player) ++
subflip(makeList(board, player, position, 0, -1), board, player) ++
subflip(makeList(board, player, position, 0, 1), board, player) ++
subflip(makeList(board, player, position, 1, 1), board, player) ++
subflip(makeList(board, player, position, 1, -1), board, player) ++
subflip(makeList(board, player, position, -1, 1), board, player) ++
subflip(makeList(board, player, position, -1 ,-1), board, player)
要するに A ++ B ++ C ++ ...
ということか
A ++ B ++ C ++ ...
は fold でしょ以下のような感じに書けるんじゃないかな?
List((-1, 0), (1, 0), (0, -1), (0, 1), (1, 1), (1, -1), (-1, 1), (-1, -1)).
foldLeft(List())
((l, (x, y)) =>
l ++ subflip(makeList(board, player, position, x, y), board, player))
(-1, 0), (1, 0), (0, -1), (0, 1), (1, 1), (1, -1), (-1, 1), (-1, -1)
の順番は気になるけれど。。。
foldLeft
が嫌いなら for
でもいい
ビットボード
強化学習(マルバツ) ← 鋭意実装中
評価関数の作り方
オセロの戦略のための AI
強いオセロのための並列計算、並列計算の例 → もしかしたら top level の par
Minimax でゲームが進行しない (お悩みの内容がわかりませんでした。叢先生かTAにご相談を。)
簡単な解説をソースコードで
叢先生の課題より
countBW と countWB という 2 つの評価関数
インターネット上で「オセロ 必勝法」と検索
4 隅に置かれた石は反転することがないので、これらの位置を好んで選ぶ、という考え方
場当たり的な評価関数の考え方を一般化できないか?
評価関数を「強化学習」させてみるとか? ← ゲームAIに疎い脇田の無責任なアイデアです
(countBW, countWB) を状態集合として強化学習するとか?状態空間がかなり小さそう。
盤面中央からのマンハッタン距離に応じたヒストグラムを状態として強化学習してみるとか?この程度なら素朴なQ学習でも状態が爆発しないかも。
がんばる人は、モンテカルロ木探索(Q学習よりも実装は簡単かも)
さらにがんばる人は、強化学習と深層学習の組み合わせ(AlphaGo Zero)
計算量の削減 → 森先生
λ計算、可逆計算、プログラム変換 (CPS)
AI, 遺伝的アルゴリズム(実は最近、試した), ニューラルネットワーク
AIではないけれど、SATソルバーを用いた数独ソルバーも書いてみた。
ビッグデータ
長期休暇中のプログラミング修行(問題がのっているサイト)
速いプログラムを一秒でも早く書くための指南書。勉強になります。きれいなプログラムにはなりません。
自学自習できるツール
PKU JudgeOnline – C / C++ / Java / Pascal / Fortran
Sphere Online Judge – Scala を含め、たくさんのプログラミング言語に対応している
AIZU online judge – C / C++ / Java: 日本国内のプログラミングコンテスト(パソコン甲子園、情報オリンピック国内予選、会津大学のプログラミングコンテスト、ACM国際プログラミングコンテスト)の問題が試せる
腕試し