moveがゼロのときはZTYWとしない

MakeZeroTYWで「moveがゼロのときはZTYWとしない@20230219」として,描画できるようになった.155件のTYWが成立している.ZTYWはゼロだ.TYWは世代差がある場合にのみ適用されるのではなかったろうか?だとしたら,TYW存在すること自体おかしいということになるのだが… ⇒こんな感じになっているようだ.

image

2601と5203は別々の箱に入っているので,兄弟枠内の間隔よりも離れている.このため,この2つの子ども枠を結婚点一致させようとすると衝突が発生してしまうという理由でTYWになっているのではないだろうか?ただし,これはTYWではなくZTYWではないかという気がするのだが…⇒TYWを止めるとどうなるかを見てみよう.⇒確かに,ルール通りの動作になっている.

image

従って,動作的には問題ないと言えるのだが…TYWのリセットが頻発しているのはなぜか?⇒結婚枠の衝突には許容上限があり,TYW枠がMAXCRUSHCOUNTを超えると抽出枠に落とされるようなルールになっている.たとえば,@4067のTYWはリセットされている.TYWがリセットされるとTooYoungListからも外されて,リセットされたノードがZTYWの場合はそこで処理が終了する.従って,生き延びたTYWはそのまま残存しているということにはなるが,ZTYWカウントがゼロというのはなぜか?

ZTYWは系列枠ごとに集計しているZTYWCountを合算したもので,CheckMultiCardsで集計している.この数が当てにならないのではないか?大域変数 ztywcount は人名枠属性を設定するところで直接カウントするべきだろう.ただし,この値はMARGBOXのIsZtywBoxを見ていることに注意.IsZtywBox では,(ERASEDYOUNGWIFE|TOOYOUNGWIFE) を見ているが,ここではERASEDYOUNGWIFEだけを見ることにする.

方式変更してZTYWが173と表示された.ただし,TYWが155で数が少ない.基本的にこのサンプルではTYW=ZTYWとならなくてはならないはずだ.どこでこの食い違いが生じているのだろう?MARGBOX:ResetTooYoungWifeでは,TOOYOUNGWIFEはリセットされているが,ERASEDYOUNGWIFEは放置されている.⇒対処した.これでTYWとZTYWのカウントが一致した.つまり,ZTYWが173個生成され,うち18個が解除されて155個残ったということにになる.

赤色表示しているはずのTYW本人ノードがまったく見えないのはなぜか?⇒おそらく,TYW本人ノードというのは不可視になっている方だろう.⇒TOOYOUNGWIFEを含めていなかった.⇒出てきた.

image

これで見ると,なぜTYWになるのかがよく分かる.これでよいのではないか?結婚枠衝突の上限はもっと小さくてもよいのではないだろうか?現行ではMAXCRUSHCOUNTはMAXCHANNELFAILUREにそろえてある.MAXCHANNELFAILUREは現在20だ.MAXCRUSHCOUNTはいろいろなループの上限として使われているが,直観的には10回くらいで十分であるような気もする.

MAXCRUSHCOUNT=10という設定ではTYWは129まで減少する.系統並び替えの所要時間は104秒.従来の設定に戻すと,時間はむしろ短縮して73秒になった.ほぼ無制限=100という設定では,処理時間が相当長引くほか,「不可視ノードの座標補正」というのが入って停止しなくなる.どうも,やはりある程度の歯止めがないと無理なようだ.MAXCRUSHCOUNT=30でも抜けて来なくなる.どうも,この値はかなりクリティカルだ.この場合もやはり,不可視ノードの座標補正というのが入る.「不可視ノードの座標補正」というのは,ほぼ検定に失敗したことを意味している.とりあえず,ここは現行のママとしておこう.

ここで,moveがゼロのときはZTYWとしない@20230219を復活させてみよう.⇒衝突検定でループカウントオーバーになる.事後の後処理中,NAMEBOX::RestoreYoungWifeで(!getghostbits(ELDERWIFE|ERASEDYOUNGWIFE))のエラーになる.これは論理的におかしいので,調べておこう.TooYoungListに記載されたノードで属性を持たないものが検出されたというエラーだ.RestoreYoungWifeは結婚枠と同期を取っているので,結婚枠と本人ノードに不一致が生じていることになる.つまり,本人ノードのELDERWIFE|ERASEDYOUNGWIFEをリセットするときに,結婚枠の属性が放置されたままになっている.

MARGBOX::ResetTooYoungWifeの他に,NAMEBOX:RestoreExtractBoxでもリセットしている.この中でもIsTooYoungWifeの場合は,ResetTooYoungWifeを呼び出しているのだが… 衝突回数オーバーなどでなにかイレギュラーな操作を行っているのではないだろうか?しかも,このケースではtywboxを削除までしているので,リストに残っている可能性はゼロだ.

ERASEDYOUNGWIFEはMARGBOX::ResetTooYoungWife,NAMEBOX:ExtractBox2LDRsub,NAMEBOX::ConvertZTYW2TYWでもリセットしている.ResetTooYoungWifeではTYW婚をリセットしているので,結婚枠もリセットしなくてはならない.⇒いや,それはやっている.ExtractBox2LDRsubでは抽出/TYW枠のチェーンをLDRの長い尻尾に転換している.この関数の中でもResetTooYoungWifeが実行されている.ConvertZTYW2TYWではTYWをZTYWに変換している.この場合はTYWはリセットされないので問題ないはずだ.

TRIBEBOX::StopTooYoungWifeの修正に誤りがある.仮修正@20230217だ.従来論理ではTYW2ExtractBoxでTYW→抽出枠転換していたものを,RestoreYoungWifeで廃棄するように仮修正しているが,呼び出しの主語が誤りだ.⇒修正して動作するようになったが,別のエラーが出てきた.①衝突検定ループカウントオーバー,②Yリスト上位ノード不在,③TYW婚の吸収合併成功,④NAMEBOX:CheckUnerasable 結婚枠不在,⑤多重カードが怒涛のような嵐となって吹き荒れている.それでも,エラーを無視して描画できた.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA