重婚同類循環数=重婚同類循環を切断するために削除された枝数とする

重婚同類循環の見直しに掛かっているところだが,先に進む前にまず,最近の修正をフィックスしてから取り掛かることにしよう.仕掛りのオプションには以下がある.すべて現状でフィックスすることにする.

  1. majortribepathを廃止する@20210115 7箇所
  2. 異世代ではBTWは成立しない@20210115 廃止
  3. setMajortribeを使う@20210115 4箇所
  4. MakeTooYoungWifeでSTOPCARDSHIFTを無視@20210116 1箇所
  5. 系列木グラフを連結成分に分解する@20210115 4箇所
  6. DONTSORTTRIBEを廃止する@20210116 廃止
  7. AlternateTribeRealNodeを廃止する@20210116 2箇所
  8. adjustGenerationRangeを停止する@20210117 1箇所 ⇒ 保留
  9. ChangeRealRefferenceで系列優先ノードの切り替えは実施しない@20210119 1箇所
  10. TailSheddingで差分が負の場合はノード対を破棄する@20210120 1箇所
  11. sameGeneCyclesのカウントを整理する@20210124 6箇所
  12. removeDeadEndBranchを廃止する@20210124 3箇所
  13. 重婚グラフの自己ループ枝を削除しない@20210124 6箇所

仮修正6箇所,暫定修正7箇所.

源氏物語全系譜6.1.ZELの傍系血族図を#4 明石中宮で開いて,TestInevitableMultiZeroでエラーが発生する.TestStronglyConnectedで循環が検出されて停止した後,MakeHasseDiagramで無限ループしてスタックオーバーフローが起きる.⇒上記でremoveDeadEndBranchを廃止しているが,この修正は誤っている.removeDeadEndBranchは「行き止まりノードの枝をグラフから削除」して閉路上の枝だけを残すための関数で,同種の関数が三種ある.

①RemoveDeadEndBranch,②removeDeadEndBranch,③RemoveSingleEndBranch,うち①は軸線図グラフ専用で,②はそれを汎用化したもの,③は「一端が一本の入力枝ないし出力枝しか持たないような枝を削除する」ための関数で,最終的には閉路上の枝だけが残るというものだが,②と③を等価な関数と早とちりしてしまった.実際には,③は対象が無向グラフでなくては動作しない.⇒removeDeadEndBranchを復活させ,①をRemoveDeadJikusenBranchにリネームして,RemoveDeadEndBranchの名前は②が引き継ぐようにした.

これで障害は解消したが,TestInevitableMultiZeroでTestStronglyConnectedの戻り値が非ゼロでハッセ図が循環しているというエラーになった.これは削除した枝を戻すとき自己ループ枝しか保留していなかったためだ.重婚同類循環に関わるすべての枝(重婚同類循環を切断するために削除されたすべての枝)を保留するようにしてエラーは解消した.これに伴い,SameGeneMarriageCirculationをBuildSameGeneMarriageGraphに吸収して一本化し,さらに,TestInevitableMultiZeroの一部もBuildSameGeneMarriageGraphに移動して,(1)婚姻/重婚グラフと(2)ハッセ図の境界を明確にした.

sameGeneCycles(重婚同類循環数)の値は「重婚同類循環を切断するために削除された枝数」と再定義する.

▲同上サンプルの全体図を#101 朧月夜で開いて,NAMEBOX:IsPossibleBTWLeftHandで停止する.「右手配偶者が左手本人」というエラーが起きている.エラーを無視して描画は可能.障害ノードはNAMEBOX #1826 髭黒(2)で,右手結婚枠はMARGBOX #1182:#1254 玉鬘(0)+#1373 髭黒(0)→#1266 左兵衛督(0),右手配偶者はNAMEBOX #1373 髭黒(0).髭黒(0)を左手本人とするBTW右手結婚枠はMARGBOX #1206:#1391 髭黒の前の北の方(0)+#1809 髭黒(1)→#1810 真木柱(2).

出力を見ると,髭黒+玉鬘のBTWは成立しているが,髭黒+髭黒の前の北の方では連結線が引かれていない.髭黒と髭黒の前の北の方は同世代なので連結線を引くことは可能であるように見えるのだが… FALSEで復帰するようにすると,髭黒は玉鬘の隣に配偶者として配置され,髭黒の前の北の方とは連結線で結ばれるが,本人カードが別の位置に配置され,他の配偶者(木工の君,中将のお許)との結婚はその位置で展開される.「右手配偶者が左手本人」をエラーとしないという方向でよいと思われるが,ここでは保留としておく.この件は「右手配偶者が左手本人で停止しない@20210108」というDEBUGオプションになっている.

同上サンプルの直系親族図 基準ノード=#49 八宮でNAMEBOX:RestoreExtractBoxのMargPointOffsetエラーが発生した.エラーを無視して描画は可能.MARGBOX::CheckMargBoxChanged→ IfMargboxVisible→ ConfirmGoldenCouple→ GetGoldenCouple→ RestoreErasedYoungWifeが実行されている.MargPointOffsetの移動量は-1なので誤差の範囲と考えられる.

image

完全木テストが完了した.

image

前回より少し速くなっている.だいぶ重婚同類循環の様子が見えてきた.前出のサンプル:薫のZ木家系図の場合で言うと,重婚同類循環は1つで,これに関わっているノードは23点ある.

  1. Corder=3 wives=13 #406 光源氏 @1
  2. Corder=3 wives=6 #408 桐壷院 @2
  3. Corder=3 wives=1 #410 桐壷の更衣 @3
  4. Corder=3 wives=5 #488 朱雀院 @42
  5. Corder=3 wives=2 #514 落葉の宮 @55
  6. Corder=3 wives=2 #518 女三宮 @57
  7. Corder=3 wives=5 #556 致仕太政大臣 @76
  8. Corder=3 wives=2 #562 柏木 @79
  9. Corder=3 wives=2 #600 夕顔 @98
  10. Corder=3 wives=2 #604 源典侍 @100
  11. Corder=3 wives=2 #606 朧月夜 @101
  12. Corder=3 wives=2 #612 藤壷の宮 @104
  13. Corder=3 wives=1 #624 弘徽殿大后 @110
  14. Corder=3 wives=1 #628 麗景殿女御 (桐壷院の)@112
  15. Corder=3 wives=1 #644 八宮の母女御 @120
  16. Corder=3 wives=1 #656 源氏宮 @126
  17. Corder=3 wives=1 #670 麗景殿女御 (朱雀院の)@133
  18. Corder=3 wives=1 #674 致仕太政大臣の北の方 @135
  19. Corder=3 wives=1 #708 承香殿女御 (朱雀院の)@152
  20. Corder=3 wives=1 #710 一条御息所 @153
  21. Corder=3 wives=2 #752 雲井の雁の母 @174
  22. Corder=3 wives=1 #838 承香殿女御 (桐壷院の)@217
  23. Corder=3 wives=1 #856 近江の君の母 @226

婚歴を見ると,光源氏13, 桐壷院6, 朱雀院5, 致仕太政大臣5を筆頭に,落葉の宮,女三宮,柏木,夕顔,源典侍,朧月夜,藤壷の宮,雲井の雁の母の2が並んでいる.しかし,これだけでは循環にはならない.これに,桐壷院→光源氏,弘徽殿大后→朱雀院,致仕太政大臣→柏木などの親子関係が(自己ループとして)加わってようやく重婚同類循環が完成する.「重婚同類」と呼んでいるのは,「重婚関係」で連結したグループが排他的な「同値類」を構成するためだ.今後は重婚同類と言う代わりに「重婚クラスター」と呼んでみることにしよう.

「重婚同類循環は1つ」という言い方をしているが,この表現はあまり正確ではない.重婚グラフから抽出した強連結成分を分解するのに必要な最小枝数を重婚同類循環数としているが,現在扱っている枝グラフは多重枝を認めていないため,自己ループが1個しか登録されていないことで最小枝数1ということになっているので,多重枝を扱えるようになると,たとえば,今のサンプルの場合なら少なくとも自己ループ枝は3つになるはずだ.従って,「重婚同類循環の個数」と「重婚同類循環を分解する最小枝数」ははっきりと区別する必要がある.

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA