2010/12/30 Mikio Kanemaki □ 数独というパズル 左の図のように、番号 1~9 の付いた 9 行、番号 A~I の付いた 9 列、番号 0~8 の付い た 9 ブロックからなる、合計 9 × 9 = 81 個の Cell が与えられる。 一部の Cell に右の図のようにある数値が予め与えられる。 数独パズルのゴールは、余白の Cell に1から 9 の数値を埋めることにある。すべて埋 めたら完成。 埋めていく時、次の 3 つのルールを守らなければならない。 予め与えられた数値を変更してはならない。 全ての Cell には数字の 1 から 9 のいずれか 1 個だけを入れる。 どの行、どの列、どのブロックも数値が重複してはならない 右のパズルの完成図は以下の通り、因みにこれはフィンランドの科学者が作った世界で 一番難しい数独だそうです。ちょっと紙と鉛筆でトライして見て下さい。1 つでも Cell が 埋まれば貴方は天才かも。 1 2010/12/30 Mikio Kanemaki 次の一欄表は、著名な数独の解法を列挙したものです。数独の解法は実に多様で、これ らの一部あるいは全部を組み合わせてパズルを解く事が出来ます。一般には持ち出す武器 の多様さとパズルの難易度は比例します。 さて、一欄にあるとおり解法にはとてもユニークな名前が付けられています。いずれの 解法も興味深いものですが、私の経験では Forcing Chain と名付けられたものがピカ一で した。とても感動的な解法だったので皆さんに紹介しようと思います。脳が活性化する事、 請け合いです。 Full House Naked Single Hidden Single Locked Candidates Naked Pairs Basic/Finned X-Wing Basic/Finned Swordfish Basic/Finned Jellyfish Basic/Finned Squirmbag XY-Wing XYZ-Wing Sue de Coq Simple Colors Multi Colors Empty Rectangle W-Wing X-Chain XY-Chain Basic/Grouped Continuous Nice Loop Basic/Grouped Discontinuous Nice Loop Basic/Grouped AIC Single/Double Linked ALS-XZ Death Blossom ALS XY-Wing ALS Chain Forcing Chain Kraken Fish Pattern Overlay Method (a.k.a Templates) Brute Force Forcing Chain を理解するには、その前に Link とか Chain という面白い概念を理解す る必要があります。先ずその解説からスタートしましょう。 2 2010/12/30 Mikio Kanemaki □ Link 事象 a と事象 b との間に何らかの依存関係 Link がある場合、その関係をその強弱に 応じて 2 種類に分けて定義します。 とつぜん「事象」などと難解な用語を持ち出しますが、話は所詮「数独」、ここでは 事象とは、 「Cell A1 = 3」とか「Cell A1 <> 3」という Cell の状態をさします。 さてその強弱 2 種類に分けられた Link の定義とは? (1) Weak Link 事象 a と事象 b が Weak Link にあるとは、 「a が真なら b は偽である」関係を さす。 (2) Strong Link 事象 a と事象 b が Strong Link にあるとは、 「a が偽ならば b は真である」関 係をさす。 何やら純粋論理の世界に突入したみたいでしょう? こういうのは、絵で理解するのが一番早い。 図(1)が Weak Link 図(2)が Strong Link を示しています。 図(1) Weak Link 図(2) Strong Link Weak Link には a, b 以外の状態が存在する、Strong Link には事象 a, b 以外 の状態は存在しないと理解しておけば簡単です。 3 2010/12/30 Mikio Kanemaki 話を数独にもどして、Weak Link/ Strong Link の具体例を見ましょう。 一番簡単な例 いかなる Cell も取り得る数値は 1 から 9 のいずれか1つです。 例えば次の例で、 Cell C1 に着目すると C1 = 1 が真なら、C1 = 3 あるいは C1 = 4 は偽です。 事象 a : C1 = 1、事象 b:C1 = 3 この様に定義したなら、事象 a と事象 b とは Weak Link になっています。事象 a が真(C1=1)なら事象 b は偽(C1<>3)だからです。しかし Strong Link にはなっ ていません。a が偽(C1 <> 1)でも、C1=4 かもしれないため b が真(C1 =3)と は断言できないからです。 Cell A1 の様に、Cell の取り得る数値が 4 か 6 のいずれかに絞られていれば、事 象 a : A1 = 4、事象 b:A1 = 6 とするなら、この事象 a と b とは Strong Link にあ ります。同時に Weak Link も成立していますね。 2 つの事象が Strong Link であれば同時に Weak Link も成立する事に注意してお いてください。ただし逆は成り立ちません。 別の事象例 上の例で I 列に数値 6 が入る可能性は Cell I1 か I3 のいずれかです。この場合、 事象 a:I1 = 6、事象 b:I3 = 6 とすると、事象 a と b とは Strong Link になります。 4 2010/12/30 Mikio Kanemaki □ Chain 「Weak Link と Strong Link にある事象を交互に連ねると、 推論の連鎖 Chain が出来る」 最初にこの一文に接した時、雷に打たれた気分になりました。 雷に打たれる前に、以降の記述方式を工夫しておきます。事象 a と b にいずれかの Link が成立している時その表現を次の様に定義しておきます。 Weak Link:a- b と表記 Strong Link:a = b と表記 この記号を使えば、事象 a, b, c, ….の間に Weak と Strong の Link 関係が交互に現れる 連鎖 Chain は次の様に記述できます。 (Case1) a - b = c - d = e- f… (Weak Link で Chain が開始するケース) あるいは、 (Case2) a = b - c = d - e = f… (Strong Link で Chain が開始するケース) いよいよ、 「雷」の出番です。 複数の事象(a, b, c, …)の間に、 Case1 の Chain が成立するなら、事象 a が真なら事象 b は偽、事象 b が偽なら事象 c は 真、事象 c が真なら事象 d は偽…..事象 f は真、….という推論の連鎖が成立する。 一方 Case2 の Chain が成立していれば、同様に、事象 a が偽なら事象 b は真、事象 b が真なら事象 c は偽、事象 c が偽なら事象 d は真….事象 f は偽、….という推論の連鎖が 成立する。 このように推論をどんどん連鎖させられる事は、2 つの Link の定義に戻れば明らかです よね? なお Chain の最初の推論(真・偽)は最初の Link(Weak/Strong)に依存して決 まります。 再び話を数独の Cell 状態に当てはめて考えてみましょう。 Chain 上で隣り合う事象は案外と物理的に接近した Cell の事象となります。 例えば同一 Cell 内の異なる値の間とか、同一行/同一列/同一ブロックの中の異なる 2 つの Cell 状態 というように距離的に近い Cell が事象の対象になります。しかし上記の推論の連鎖は同一 Cell 内/同一行/同一列/同一ブロックという制約を超え、距離的に遠い Cell の間で、一 方が真なら他方は偽(あるいは一方が偽なら他方は真)という推論を可能にしてくれます。 何を言っているかわからない? 具体例で示しましょう。 5 2010/12/30 Mikio Kanemaki この Chain は Case2 の例です。連鎖を構成する事象を Cell(digit)で表現すると、上の Case2 の Chain は次の様に表記できます。 G8(5)=G8(4)-I9(4)=B9(4)-A8(4)=A3(4)-B1(4)=I1(4)-I1(5)=H1(5) 注:図の中では Cell 間の Link として、実線が Strong Link、波線が Weak Link を表し ている。なお Cell 内の Link については特別な表記はされていない この Chain から導き出せる推論は、 「G8<>5 なら H1=5」という、とてつもなく離れた Cell 間で成立する関係になります。Chain 上に現われる隣接する事象、例えば最初の 2 つ、 G8(5)=G8(4)は同一 Cell G8 内に閉じた関係、次の 2 つ G8(4)-I9(4)は同一のブロック内の Cell 間の関係です。いずれもが近隣の Cell の関係になっていますが、推論の連鎖を重ねる と、結果として、とてつもなく離れた 2 つの Cell G8 と H1 の間の推論になっています。 近くの Cell 間なら、その間で推論を働かせるのは容易です。しかし離れた Cell 間となる と推論することは非常に困難です。Chain はこの困難な推論を可能にしてくれる武器とな ります。 6 2010/12/30 Mikio Kanemaki 上の例の続き。この Chain により導き出された推論「G8<>5 なら H1=5」を利用すると、 数独の問題解決を 1 ステップ進められます。 G8<>5 なら H1=5、H1=5 なら H8<>5(何故なら H1 と H8 は同一列にある Cell、 このため数値 5 は H1 か H8 いずれか1つの Cell にしか入らない) 一方、G8=5 なら H8<>5(何故なら G8 と H8 は同一行/同一ブロックにある Cell、 このため数値 5 は G8 か H8 のいずれかの1つの Cell にしか入らない) 以上 2 つの推論を合体させると、 「G8=5 が真であっても偽であっても H8<>5」という 新たな推論が得られます。これは、H8 は数値 5 を取り得ないという判断になり、数独の 問題解決の1ステップとして H8 の候補から数値 5 を除去することが可能になります。 図を良く見ると、Cell H8 の候補数字の中で数値 5 に赤マークが付いています。これは この数値が削除できることを示しています。 7 2010/12/30 Mikio Kanemaki □ Forcing Chain Link と Chain の概念が理解できると目標の Forcing Chain の理屈がわかります。 数独の解法は多様であると書きましたが、Chain もそれ自体が単独で一つの解法になっ ています。前の例で示した通り、Chain のお陰で候補数字を 1 個減らす事が出来た事を 思いだして下さい。 数独の解法の中には、一挙にある Cell の数字を決定してしまう強力な物もあります が、多くは、Cell の候補数字 1 個の削除を教えてくれるだけの地道なものです。この地 道な解法を重ね、いずれ Cell の候補数字が 1 個に絞られた時 Cell の数字が初めて確定 する。 数独はこのような忍耐力の必要なパズルです。難易度が上がれば忍耐力も上が ります。ただし、これが人気の秘密の一つなのかもしれない。時として人は苦痛を求め その先の輝く達成感を求める。 話を Forcing Chain にもどします。 Chain 自体も解法の一つと書きましたが、実は、どんな数独の解法状態を起点にしても Chain は無数に作り出す事が出来ます。しかし、その多くは何ら有益な推論をもたらし てくれないガラクタの山です。試しに前述の例をもう一度見て下さい。いくらでも例に あげた Chain と異なる別の Chain を見つけられますよね?しかし、そこからいつも有 益な推論が得られるとは限らないのです。 告白すると、前の例に示した Chain は、無数に存在するガラクタ Chain の中から、 その推論の連鎖が数独の問題解決に何らかの貢献ができるという観点で厳選した、超優 秀 Chain、ダーウィンの進化論も真っ青、突然変異の Chain なのです。どうやって超 優秀 Chain を選びだす事ができたのか?これはまた別のテーマなのでここでは詳述は しません。 Forcing Chain はこの何の役にも立たないガラクタ Chain を寄せ集め、寄せ集めた Chain の中から何とか有益な推論を引き出す解法です。これを考え出した人は誰でしょ うか? 子だくさんの貧乏人だったのでしょうか? 8 2010/12/30 Mikio Kanemaki さて、Chain は無数に作り出せると言っても、産めよ増やせよと無節操に作っても意 味がない。Forcing Chain では Chain の先頭の事象にある「意思」を込めます。 Chain の先頭として Verity という概念を導入 Verity という単語、はじめて知りましたが、妥当な日本語訳は「真理の陳述」かな? Verity では、ある事象の取り得る状態を全て列挙する。例えば次の例で Cell B3 に 着目してください。この Cell に許される候補は 2, 4, 6, 7, 9 の 5 種類です。 そこで Verity「真理の陳述」として、 {B3=2, B3=4, B3=6, B3=7, B3=9}を列挙 します。神様、誓います、世の中何があろうと、真理はこの列挙の中のいずれか一 つにあります….. という心境で。 次に Verity の 1 項目ごとに、各々の事象を先頭に採用した Chain を作り出します。 するとガラクタ Chain が山のように出来ますが、構わずどんどん作ります。 そのガラクタの山の中から、「都合の良い」Chain を取りだし並べ直します。 どうやってお宝 Chain を取り出したかは聞かないで。 以下の chain がガラクタの山から選ばれた性格の良い組み合わせです。 B3(2)-E3(2)=E1(2)-E1(1)=F1(1)-F1(4) B3(4)-A2(4)=F2(4)-F1(4) B3(6)-B7(6)=AC9(6)-E9(6)=F7(6)-F2(6)=F2(4)-F1(4) B3(7)-B4(7)=B4(6)-B7(6)=AC9(6)-E9(6)=F7(6)-F2(6)=F2(4)-F1(4) B3(9)-BC1(9)=E1(9)-E1(1)=F1(1)-F1(4) 選ばれた Chain 全体の先頭で Verity「真理の陳述」が網羅され、しかも全てが weak link で始まっている。さらに、現れる位置に統一性はないが、全ての Chain は weak link で共通事象 F1(4)に到達していますね? 9 2010/12/30 Mikio Kanemaki これは何を意味するか? 全ての Chain は推論の連鎖の結果、同一の結論、 「F1=4 は偽である」と主張しています。 即ち、真理の陳述から Cell F1 に数値 4 は取り得ないという「神の声」を引き出している のです。これで数独解決は 1 ステップ前進、Cell F1 の候補から数値 4 を削除できる事に なります。これが Forcing Chain です。 「真理の陳述」にはこのほかに、色々なものが採用できます。例えば前の例だと 1 行 目に数字 9 を入れられるのは B1, C1, E1 の 3 つの Cell だけです。これも立派な Verity、 新たな陳述は{B1=9, C1=9, E1=9}となり、これから Chain を作って都合の良い Chain を選ぶ事が出来たら、それは新たな Forcing Chain の適用となります。 どうでしょうか? 原理を理解していただけたでしょうか? 下の図は一つの Verity を起点に枝分かれして生成される Chain が無数に存在すること、 その中から推論に役立つ都合の良い Chain を、起点の Verity ごとに 1 個ずつ選び出す作 業を示した概念図です。これは気が遠くなるほど根気のいる作業です。これが数独をコ ンピュータで解いてみようと思い立った理由です。 10
© Copyright 2026 Paperzz