私は、将来的に囲碁のプログラムを書きたいと思っているのですが、
囲碁に関してまだ良く分かっていないので勉強中です。
囲碁の前座として、やや曖昧な要素を合わせ持つテトリスを
コンピュータに解かせることを思い付いて書いてみました。
1990年頃に流行っていた頃は、ブロックの平坦性とか表面形状に
対するブロックの置き方り定石みたいな方法で解けるのではないかと
思っていましたが、普通の積み方の部分で破綻しそうで作ろうとは
思いませんでした。
今回は、取り敢えず次のブロッを全ての置き方で取り敢えず置いてみて、
評価関数をかけて最も良い結果の置き方を選ぶという極めて
単純な方法を基本にしています。
評価関数は、テトリスの本質、つまり究極的な目的をごく当たり前に
評価することでかなりいい線行くとが分かりました。
この他に、覆い被せることにペナルティーをつけたり、整理して
積ませる要素を組み入れたり、復活させるように仕向けたり、
1列の棒をあまり当てにしない積み方になる様にしたりというこで
単一の評価関数の大小だけで置き方を選択しています。
NEXTが分かればだいぶ簡単になるのですが、NEXTを見なくても
なかなか終わらないレベルになりました。
以下に、以前JAVAアプレットで試作したものを
HTML5 Canvas(JavaScript)に移植したもの示します。(2017.4.22)
アルゴリズム1
バランスがいいアルゴリズムですが、縦穴が2列出来る欠点を持ちます。そこで、ある程度長くなると諦めて穴をつぶして評価関数が
偏らない様にしています。改良の余地あり。
アルゴリズム2
既に置かれているブロックとどれだけフィットするかという評価を加えて縦長の待ちを作りにくくしたアルゴリズム。
穴を作る評価値と競合するので微妙なさじ加減が必要です。