= 関数・論理型プログラミング実験/課題メモ/第8回 =
== boardについて ==
{{{
val init_board
}}}
reversi.mliを見ての通り、init_boardは変数です。関数ではないです。0引数関数ではないです。<
>
つまり、当然ながら評価はされません。参照されるだけです。
put_stoneでboardを受け取ってboardを返す際に注意しないとこのinit_boardを編集する事になり、二試合目以降置ける手が無い盤面でスタートする事になります。 -- [[Naoaki Iwakiri]] <>
== ocamloptでのコンパイルについて ==
リバーシAIを強くしようと思ってる人は、なるべく先読みができたほうがいいですよね?
配布されているMakefileではocamlcでコンパイルする設定になっており、バイトコードを生成するようになっていますが、
ocamloptでネイティブコードにコンパイルしたほうが数倍速いです。(自分のプログラムだと大体2手ぐらい多めに読めるようになりました)
ocamloptでコンパイルするには、
・ocamlc → ocamlopt
・.cma → .cmxa
・.cmo → .cmx
と変えればいいはずです。とりあえずコレでコンパイルは通ります(何か問題あったら加筆してください) -- TakuyaKuwahara
{{{#!wiki comment
30秒セットで中盤は大体7手ぐらい読めるはずです。 -- TakuyaKuwahara
}}}
==== もうちょい速くしたい? ====
ocamloptでコンパイルするとき、-unsafeオプションをつけると配列の境界チェック等をしなくなるので、多少速くなるそうです。
ただし、配列のインデックスエラーやスタックオーバーフローを起こした時にどうなるかが保証されないため、もしやるなら自己責任で…… -- TakuyaKuwahara
{{{#!wiki comment
一度不変オブジェクトを作り、それを経由して新しいboardを作る、自前で関数を作りdeepcopyを行う、等々の方法が考えられます。
}}}
{{{#!wiki comment/dotted
部屋で見当違いの予想とかいろいろ大声で話してて恥ずかしい!! -- [[Naoaki Iwakiri]] <>
}}}