PRG (w6a): お悩み相談

Ken Wakita (https://prg1-2019.github.io/lecture/web/)

2019-11-11

プログラミングが辛い

プログラミングが辛い

きれいなプログラムが書けない

  • インデント

  • 横に長い縦に長い繰り返しが長い

  • 高階関数 vs pattern match

    気持ちよく書ける/気持ちよく読めるコードを書けばよい

  • 説明可能なコード

    コメントを書けば読みやすくなるわけでもない(国語能力、コミュニケーション能力が問われる)

    適切な名前の選択、コードの順序 = 説明の順序

Scalaについての本

  • 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。ものすごい分量。

Beautiful Code

Scalaの言語仕様についての悩み

  • 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 でもいい

var l = List()
for ((x, y) <- List((-1, 0), (1, 0), (0, -1), (0, 1), (1, 1), (1, -1), (-1, 1), (-1, -1)) {
  l = l ++ subflip(makeList(board, player, position, x, y), board, player))
}

オセロ

  • ビットボード

  • 強化学習(マルバツ) ← 鋭意実装中

  • 評価関数の作り方

  • オセロの戦略のための AI

  • 強いオセロのための並列計算、並列計算の例 → もしかしたら top level の par

  • Minimax でゲームが進行しない (お悩みの内容がわかりませんでした。叢先生かTAにご相談を。)

ビットボード

簡単な解説をソースコードで

評価関数の作り方 (1/2)

叢先生の課題より

countBW と countWB という 2 つの評価関数

インターネット上で「オセロ 必勝法」と検索

4 隅に置かれた石は反転することがないので、これらの位置を好んで選ぶ、という考え方

評価関数の作り方 (2/2)

  • 場当たり的な評価関数の考え方を一般化できないか?

  • 評価関数を「強化学習」させてみるとか? ← ゲームAIに疎い脇田の無責任なアイデアです

    • (countBW, countWB) を状態集合として強化学習するとか?状態空間がかなり小さそう。

    • 盤面中央からのマンハッタン距離に応じたヒストグラムを状態として強化学習してみるとか?この程度なら素朴なQ学習でも状態が爆発しないかも。

    • がんばる人は、モンテカルロ木探索(Q学習よりも実装は簡単かも)

    • さらにがんばる人は、強化学習と深層学習の組み合わせ(AlphaGo Zero)

一般・研究

独習

独習したい (1/2)

独習したい (2/2)