差分表示


積みの評価時に,NEXT以降のツモを考慮することを深読みと呼ぶことにする.
この内容について検討する.

#contents
----

*概要
フィールドに,ある積み(NEXT)を置いたと仮定する.
そのフィールドにさらにある積み(NEXT2)を置いたと仮定して,その状態を評価する.

NEXTを評価するときにNEXT2まで考えることによって,
- NEXTを置いたときには状況が悪くなるけど,
- NEXT2を置くと挽回できる

という積みを採用できるようにすることを,狙う.

具体的にありそうなのは,「発火点から伸ばす」という状況.
NEXTを置いた時点では発火点がふさがる(悪状況)が,NEXT2を置いたときには連鎖数が増加していると.
----

*深読みの具体的な実装
**連鎖数を用いた各積み(NEXT〜NEXT3)の評価
深読みでは実際には,未来において連鎖数がどうなるかに着目することとする.
以下の値を導出すれば良いと思っている.

:NEXTの連鎖数:着目している積みを置いた状態で,発火候補点で発火したときに生じる連鎖数.
:NEXT2の最大連鎖数:着目している積みを置いた状態にさらにNEXT2の積みを置いた状態で,発火候補点で発火したときに生じる最大連鎖数.NEXT2の置き方は最大22通り考えられるが,それらの中で最大の連鎖数を採用する.
:NEXT3の最大連鎖数:着目している積みを置いた状態にさらにNEXT2とNEXT3の積みを置いた状態で,発火候補点で発火したときに生じる最大連鎖数.NEXT2は,「NEXT2の最大連鎖数」を実現できる置き方とし,NEXT3は最大22通りから最大の連鎖数になる置き方を選択する.


発火候補点については,[[発火候補点による積みの評価]]を参照.

**連鎖数評価を評価関数へ組み込む方法
深読み結果を,実際に評価関数に組み込む時に使用する評価式.

[[RensaYomi4>アルゴリズム(RensaYomi4)]]の場合
, ,''連鎖数の評価式''
,いつでも,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )

[[RensaYomi6>アルゴリズム(RensaYomi6)]]の場合
,''危険度'',''連鎖数の評価式''
,Normal,[NEXT2の最大連鎖数] + [NEXTの連鎖数] / 2
,Red3,[NEXT3の最大連鎖数] + [NEXT2の最大連鎖数] / 2 + [NEXTの連鎖数] / 4
,Red2,[NEXT2の最大連鎖数] + [NEXTの連鎖数] / 2
,Red1,[NEXTの連鎖数]

[[RensaYomi7>アルゴリズム(RensaYomi7)]]の場合
,''危険度'',''連鎖数の評価式''
,Normal,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )
,Red3,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )
,Red2,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )
,Red1,[NEXTの連鎖数]

----
*その他の話題
**楽観的読みと現実的読み
上述の「発火候補点で発火するとどうなるか?」という読みは,発火候補点で発火できるという前提に立っている.
しかし現実には,発火候補点の発火色が来る保証は何もない.
終盤になってフィールドの空きが少なくなってくると,この精度の低さが問題になりそう.

具体的には,発火できるだろうと楽観視していたのに,発火色が来る前にフィールドが埋まって窒息死してしまうことが,起こりうる.

そこで,今見えているツモ(NEXT〜NEXT3)のみを使って何が起きるか?を読むことを考える.
これを,''現実的読み''と呼ぶことにする.
見えるものしか信じない.

それなら常に,現実的読みを使っていれば良いような気もするが,試してみたところ,現実的読みを使った場合は序盤がうまく形にならなかった.

そのため,
+序盤は発火候補点を使った''楽観的読み''
+終盤は見えるツモのみを使った''現実的読み''

という風に,読み方を切り替えることにする.
もちろん,
-序盤と終盤をどう定義するか?

という問題は残るわけだが.

...[[RensaYomi6>アルゴリズム(RensaYomi6)]]では下表のように,まず楽観的読みでスタートして,危険度がRedになったら&color(red){現実的読み};に切り替えるという方法を採った.
,危険度,k(NEXTに適用),k(NEXT2に適用),k(NEXT3に適用)
,Normal,楽観(3),楽観(3),-
,Red3,&color(red){現実(4)};,楽観(3),楽観(3)
,Red2,&color(red){現実(4)};,&color(red){現実(4)};,-
,Red1,&color(red){現実(4)};,&color(red){現実(4)};,-

----
**枝刈り
深さnの深読みを行うと,最大22^n手の評価を行う必要がある.
この手数をできるだけ少なくして,計算量を削減する.
[[RensaYomi4-2>アルゴリズム(RensaYomi4-2)]]から導入し始めた.

明らかに採用しないような悪手を早い段階で候補から排除するわけだが,今のところ
-自分が窒息してしまう手
-発火すべきでない(危険度=Normal)のに発火してしまう手

しか排除できていない.
積みの評価時に,NEXT以降のツモを考慮することを深読みと呼ぶことにする.
この内容について検討する.
//parent=連鎖アルゴリズムの設計
#contents
----

*概要
フィールドに,ある積み(NEXT)を置いたと仮定する.
そのフィールドにさらにある積み(NEXT2)を置いたと仮定して,その状態を評価する.

NEXTを評価するときにNEXT2まで考えることによって,
- NEXTを置いたときには状況が悪くなるけど,
- NEXT2を置くと挽回できる

という積みを採用できるようにすることを,狙う.

具体的にありそうなのは,「発火点から伸ばす」という状況.
NEXTを置いた時点では発火点がふさがる(悪状況)が,NEXT2を置いたときには連鎖数が増加していると.
----

*深読みの具体的な実装
**連鎖数を用いた各積み(NEXT〜NEXT3)の評価
深読みでは実際には,未来において連鎖数がどうなるかに着目することとする.
以下の値を導出すれば良いと思っている.

:NEXTの連鎖数:着目している積みを置いた状態で,発火候補点で発火したときに生じる連鎖数.
:NEXT2の最大連鎖数:着目している積みを置いた状態にさらにNEXT2の積みを置いた状態で,発火候補点で発火したときに生じる最大連鎖数.NEXT2の置き方は最大22通り考えられるが,それらの中で最大の連鎖数を採用する.
:NEXT3の最大連鎖数:着目している積みを置いた状態にさらにNEXT2とNEXT3の積みを置いた状態で,発火候補点で発火したときに生じる最大連鎖数.NEXT2は,「NEXT2の最大連鎖数」を実現できる置き方とし,NEXT3は最大22通りから最大の連鎖数になる置き方を選択する.


発火候補点については,[[発火候補点による積みの評価]]を参照.

**連鎖数評価を評価関数へ組み込む方法
深読み結果を,実際に評価関数に組み込む時に使用する評価式.

[[RensaYomi4>アルゴリズム(RensaYomi4)]]の場合
, ,''連鎖数の評価式''
,いつでも,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )

[[RensaYomi6>アルゴリズム(RensaYomi6)]]の場合
,''危険度'',''連鎖数の評価式''
,Normal,[NEXT2の最大連鎖数] + [NEXTの連鎖数] / 2
,Red3,[NEXT3の最大連鎖数] + [NEXT2の最大連鎖数] / 2 + [NEXTの連鎖数] / 4
,Red2,[NEXT2の最大連鎖数] + [NEXTの連鎖数] / 2
,Red1,[NEXTの連鎖数]

[[RensaYomi7>アルゴリズム(RensaYomi7)]]の場合
,''危険度'',''連鎖数の評価式''
,Normal,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )
,Red3,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )
,Red2,MAX( [NEXTの連鎖数],[NEXT2の最大連鎖数] )
,Red1,[NEXTの連鎖数]

----
*その他の話題
**楽観的読みと現実的読み
上述の「発火候補点で発火するとどうなるか?」という読みは,発火候補点で発火できるという前提に立っている.
しかし現実には,発火候補点の発火色が来る保証は何もない.
終盤になってフィールドの空きが少なくなってくると,この精度の低さが問題になりそう.

具体的には,発火できるだろうと楽観視していたのに,発火色が来る前にフィールドが埋まって窒息死してしまうことが,起こりうる.

そこで,今見えているツモ(NEXT〜NEXT3)のみを使って何が起きるか?を読むことを考える.
これを,''現実的読み''と呼ぶことにする.
見えるものしか信じない.

それなら常に,現実的読みを使っていれば良いような気もするが,試してみたところ,現実的読みを使った場合は序盤がうまく形にならなかった.

そのため,
+序盤は発火候補点を使った''楽観的読み''
+終盤は見えるツモのみを使った''現実的読み''

という風に,読み方を切り替えることにする.
もちろん,
-序盤と終盤をどう定義するか?

という問題は残るわけだが.

...[[RensaYomi6>アルゴリズム(RensaYomi6)]]では下表のように,まず楽観的読みでスタートして,危険度がRedになったら&color(red){現実的読み};に切り替えるという方法を採った.
,危険度,k(NEXTに適用),k(NEXT2に適用),k(NEXT3に適用)
,Normal,楽観(3),楽観(3),-
,Red3,&color(red){現実(4)};,楽観(3),楽観(3)
,Red2,&color(red){現実(4)};,&color(red){現実(4)};,-
,Red1,&color(red){現実(4)};,&color(red){現実(4)};,-

----
**枝刈り
深さnの深読みを行うと,最大22^n手の評価を行う必要がある.
この手数をできるだけ少なくして,計算量を削減する.
[[RensaYomi4-2>アルゴリズム(RensaYomi4-2)]]から導入し始めた.

明らかに採用しないような悪手を早い段階で候補から排除するわけだが,今のところ
-自分が窒息してしまう手
-発火すべきでない(危険度=Normal)のに発火してしまう手

しか排除できていない.


© 2019 KMIソフトウェア