(57)【要約】【課題】厳密敷き詰め問題又は一般化厳密敷き詰め問題を高速に解くことができる厳密敷き詰め計算装置、方法、及びプログラムを提供する。【解決手段】厳密敷き詰め計算装置１０は、キャッシュテーブル１８Ａと、ユニークテーブル１８Ｂと、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、３つ組データに対応するノードの情報をユニークテーブル１８Ｂに格納するＺＤＤ構築演算部１６と、厳密敷き詰め問題を表す二値行列の入力を受け付ける問題入力部１２と、入力を受け付けた二値行列に基づいて、選択される列番号を１とする行番号の各々に対し、キャッシュテーブル１８Ａ及びユニークテーブル１８Ｂを用いて、行番号を解に含めたときに得られる部分問題を求め、求められた部分問題を再帰的に解く再帰計算部１４と、を備える。【選択図】図４
2018112784.tif 000002
【特許請求の範囲】
【請求項１】
二値行列により表される厳密敷き詰め問題又は一般化厳密敷き詰め問題の部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、前記部分問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフ(Zero-suppressed Binary Decision Diagram)の根ノードを示すエントリのペアを保持するキャッシュテーブルと、
前記厳密敷き詰め問題又は一般化厳密敷き詰め問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフに関する各ノードの情報を保持するユニークテーブルと、
ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、前記３つ組データに対応するノードの情報を前記ユニークテーブルに格納するＺＤＤ構築演算部と、
厳密敷き詰め問題又は一般化厳密敷き詰め問題を表す二値行列の入力を受け付ける問題入力部と、
前記問題入力部により入力を受け付けた二値行列に基づいて、選択される列番号を１とする行番号の各々に対し、
前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を再帰的に解く再帰計算部であって、
前記求められた部分問題を解くときに、前記部分問題を表す部分行列中に存在する列番号の集合に対応するキーを用いて、前記キャッシュテーブルから検索し、前記キーに対応する前記ペアが検索された場合、前記ペアのエントリを、前記部分問題の解を表すゼロサプレス型二分決定グラフの根ノードとし、
前記キーに対応する前記ペアが検索されなかった場合、前記部分問題を表す部分行列に基づいて、選択される列番号を１とする行番号の各々に対し、前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を解き、前記解に含めた前記行番号をラベルとし、前記部分問題の解を表す前記ゼロサプレス型二分決定グラフの根ノードをｈｉ枝の指すノードとし、
2018112784.tif 000022
又は直前の前記行番号に対する部分問題を解いたときに前記ＺＤＤ構築演算部により格納された前記ノードをｌｏ枝の指すノードとした前記３つ組データを、前記ＺＤＤ構築演算部に入力し、
前記部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、前記ＺＤＤ構築演算部により格納された前記ノードを示すエントリのペアを、前記キャッシュテーブルに格納する再帰計算部と、
を備えた厳密敷き詰め計算装置。
【請求項２】
前記ユニークテーブルは、前記ノードの情報として、ノードＩＤ、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの４つの項目を１組とする４つ組データを保持し、
前記ＺＤＤ構築演算部は、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、前記３つ組データに対応するノードの情報を前記ユニークテーブルから検索し、
前記３つ組データに対応する前記ノードの情報が検索されなかった場合、前記３つ組データに対応するノードを作成して、前記ノードの情報を、前記ユニークテーブルに格納する請求項１に記載の厳密敷き詰め計算装置。
【請求項３】
前記再帰計算部は、前記キャッシュテーブルに保持されている複数のペアの個数が上限に達している状態において新しいペアを追加する場合、前記複数のペアの１つに代えて、前記新しいペアを追加する請求項１又は２に記載の厳密敷き詰め計算装置。
【請求項４】
二値行列により表される厳密敷き詰め問題又は一般化厳密敷き詰め問題の部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、前記部分問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフ(Zero-suppressed Binary Decision Diagram)の根ノードを示すエントリのペアを保持するキャッシュテーブルと、
前記厳密敷き詰め問題又は一般化厳密敷き詰め問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフに関する各ノードの情報を保持するユニークテーブルと、を備えた厳密敷き詰め計算装置における厳密敷き詰め計算方法であって、
ＺＤＤ構築演算部が、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、前記３つ組データに対応するノードの情報を前記ユニークテーブルに格納するステップと、
問題入力部が、厳密敷き詰め問題又は一般化厳密敷き詰め問題を表す二値行列の入力を受け付けるステップと、
再帰計算部が、前記問題入力部により入力を受け付けた二値行列に基づいて、選択される列番号を１とする行番号の各々に対し、
前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を再帰的に解く場合において、
前記求められた部分問題を解くときに、前記部分問題を表す部分行列中に存在する列番号の集合に対応するキーを用いて、前記キャッシュテーブルから検索し、前記キーに対応する前記ペアが検索された場合、前記ペアのエントリを、前記部分問題の解を表すゼロサプレス型二分決定グラフの根ノードとし、
前記キーに対応する前記ペアが検索されなかった場合、前記部分問題を表す部分行列に基づいて、選択される列番号を１とする行番号の各々に対し、前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を解き、前記解に含めた前記行番号をラベルとし、前記部分問題の解を表す前記ゼロサプレス型二分決定グラフの根ノードをｈｉ枝の指すノードとし、
2018112784.tif 000023
又は直前の前記行番号に対する部分問題を解いたときに前記ＺＤＤ構築演算部により格納された前記ノードをｌｏ枝の指すノードとした前記３つ組データを、前記ＺＤＤ構築演算部に入力し、
前記部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、前記ＺＤＤ構築演算部により格納された前記ノードを示すエントリのペアを、前記キャッシュテーブルに格納するステップと
を含む厳密敷き詰め計算方法。
【請求項５】
コンピュータを、請求項１〜３のいずれか１項に記載の厳密敷き詰め計算装置の各部として機能させるための厳密敷き詰め計算プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、厳密敷き詰め計算装置、方法、及びプログラムに係り、特に、厳密敷き詰め問題の全ての解を列挙するための厳密敷き詰め計算装置、方法、及びプログラムに関する。
【背景技術】
【０００２】
ポリオミノや数独などのパズルの解を発見する問題は、厳密敷き詰め問題と呼ばれる組合せ数学の問題を解くことに相当する。厳密敷き詰め問題とは、全体集合Ｕの部分集合からなる集合族Ｓが与えられたときに、
2018112784.tif 000003
に対して
2018112784.tif 000004
を満たすようなＳ＊⊆Ｓを見つける問題である。
【０００３】
また、パズルの一種であるＮクイーン問題を解くことは、厳密敷き詰め問題を拡張した、一般化厳密敷き詰め問題を解くことに相当する。一般化厳密敷き詰め問題は、
2018112784.tif 000005
であるような集合Ｕ，Ｕ’に対して、Ｕ∪Ｕ’の部分集合からなる集合族Ｓの部分集合のうち、
2018112784.tif 000006
を満たすようなＳ＊⊆Ｓを見つける問題である。
【０００４】
厳密敷き詰め問題と一般化厳密敷き詰め問題のすべての解を見つけるための手法として、アルゴリズムＤＬＸ（以下、ＤＬＸという。）が知られている（例えば、非特許文献１を参照）。ＤＬＸは、バックトラックを行いながら再帰的に深さ優先探索を実行し、元の敷き詰め問題を部分問題に分割しながら、部分問題を逐次的に解くことによって、厳密敷き詰め問題，一般化厳密敷き詰め問題の解を全て発見する手法である。
【０００５】
一方、組み合わせ問題の解を得るためにゼロサプレス型二分決定グラフ（Zero-suppressed Binary Decision Diagrams:ＺＤＤ)を構築する手法が知られている（例えば、非特許文献２を参照）。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Donald E. Knuth, "Dancing Links", Millennial Perspectives in Computer Science, 2000, 187-214.
【非特許文献２】Shin-ichi Minato, "Zero-suppressed BDDs for Set Manipulation in Combinatorial Problems", DAC'93:Proceedings of the 30th international conference on Design automation, 1993.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ところで、ＤＬＸの深さ優先探索では、同じ部分問題が複数回出現する可能性がある。同じ部分問題の解は等しいため、何度も同じ問題を解かなければならないのは計算時間の増加につながる。この課題に対する素朴な解決策として、部分問題とその解のペアをキャッシュテーブルに格納することが考えられる。同じ部分問題が複数回出現したならば、その問題を再度解くことはせずに、キャッシュテーブルに格納されている解を用いることで繰り返し計算を避けることができる
【０００８】
しかしながら、部分問題の解の数は膨大な数になることがある。そのような場合はキャッシュテーブルに解を格納するために必要な記憶容量が増大し、また部分問題の解をもとに主問題の解を構成する課程に多大な計算時間を要することになる。そのため、素朴なキャッシュテーブルの使用はＤＬＸの高速化に寄与しない。
【０００９】
本発明は、上記の事情に鑑みてなされたもので、厳密敷き詰め問題又は一般化厳密敷き詰め問題を高速に解くことができる厳密敷き詰め計算装置、方法、及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記目的を達成するために、第１の発明に係る厳密敷き詰め計算装置は、二値行列により表される厳密敷き詰め問題又は一般化厳密敷き詰め問題の部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、前記部分問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフ(Zero-suppressed Binary Decision Diagram)の根ノードを示すエントリのペアを保持するキャッシュテーブルと、前記厳密敷き詰め問題又は一般化厳密敷き詰め問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフに関する各ノードの情報を保持するユニークテーブルと、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、前記３つ組データに対応するノードの情報を前記ユニークテーブルに格納するＺＤＤ構築演算部と、厳密敷き詰め問題又は一般化厳密敷き詰め問題を表す二値行列の入力を受け付ける問題入力部と、前記問題入力部により入力を受け付けた二値行列に基づいて、選択される列番号を１とする行番号の各々に対し、前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を再帰的に解く再帰計算部であって、前記求められた部分問題を解くときに、前記部分問題を表す部分行列中に存在する列番号の集合に対応するキーを用いて、前記キャッシュテーブルから検索し、前記キーに対応する前記ペアが検索された場合、前記ペアのエントリを、前記部分問題の解を表すゼロサプレス型二分決定グラフの根ノードとし、前記キーに対応する前記ペアが検索されなかった場合、前記部分問題を表す部分行列に基づいて、選択される列番号を１とする行番号の各々に対し、前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を解き、前記解に含めた前記行番号をラベルとし、前記部分問題の解を表す前記ゼロサプレス型二分決定グラフの根ノードをｈｉ枝の指すノードとし、
2018112784.tif 000007
又は直前の前記行番号に対する部分問題を解いたときに前記ＺＤＤ構築演算部により格納された前記ノードをｌｏ枝の指すノードとした前記３つ組データを、前記ＺＤＤ構築演算部に入力し、前記部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、前記ＺＤＤ構築演算部により格納された前記ノードを示すエントリのペアを、前記キャッシュテーブルに格納する再帰計算部と、を備える。
【００１１】
第２の発明に係る厳密敷き詰め計算方法は、二値行列により表される厳密敷き詰め問題又は一般化厳密敷き詰め問題の部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、前記部分問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフ(Zero-suppressed Binary Decision Diagram)の根ノードを示すエントリのペアを保持するキャッシュテーブルと、前記厳密敷き詰め問題又は一般化厳密敷き詰め問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフに関する各ノードの情報を保持するユニークテーブルと、を備えた厳密敷き詰め計算装置における厳密敷き詰め計算方法であって、ＺＤＤ構築演算部が、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、前記３つ組データに対応するノードの情報を前記ユニークテーブルに格納するステップと、問題入力部が、厳密敷き詰め問題又は一般化厳密敷き詰め問題を表す二値行列の入力を受け付けるステップと、再帰計算部が、前記問題入力部により入力を受け付けた二値行列に基づいて、選択される列番号を１とする行番号の各々に対し、前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を再帰的に解く場合において、前記求められた部分問題を解くときに、前記部分問題を表す部分行列中に存在する列番号の集合に対応するキーを用いて、前記キャッシュテーブルから検索し、前記キーに対応する前記ペアが検索された場合、前記ペアのエントリを、前記部分問題の解を表すゼロサプレス型二分決定グラフの根ノードとし、前記キーに対応する前記ペアが検索されなかった場合、前記部分問題を表す部分行列に基づいて、選択される列番号を１とする行番号の各々に対し、前記行番号を解に含めたときに得られる前記部分問題を求め、前記求められた部分問題を解き、前記解に含めた前記行番号をラベルとし、前記部分問題の解を表す前記ゼロサプレス型二分決定グラフの根ノードをｈｉ枝の指すノードとし、
2018112784.tif 000008
又は直前の前記行番号に対する部分問題を解いたときに前記ＺＤＤ構築演算部により格納された前記ノードをｌｏ枝の指すノードとした前記３つ組データを、前記ＺＤＤ構築演算部に入力し、前記部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び前記ＺＤＤ構築演算部により格納された前記ノードを示すエントリのペアを、前記キャッシュテーブルに格納するステップと、を含む。
【００１２】
第１及び第２の発明によれば、キャッシュテーブルは、二値行列により表される厳密敷き詰め問題又は一般化厳密敷き詰め問題の部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、部分問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフの根ノードを示すエントリのペアを保持する。ユニークテーブルは、厳密敷き詰め問題又は一般化厳密敷き詰め問題の解となる行番号の集合からなる集合族を表すゼロサプレス型二分決定グラフに関する各ノードの情報を保持する。ＺＤＤ構築演算部は、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、３つ組データに対応するノードの情報をユニークテーブルに格納する。問題入力部は、厳密敷き詰め問題又は一般化厳密敷き詰め問題を表す二値行列の入力を受け付ける。再帰計算部は、問題入力部により入力を受け付けた二値行列に基づいて、選択される列番号を１とする行番号の各々に対し、行番号を解に含めたときに得られる部分問題を求め、求められた部分問題を再帰的に解く場合において、求められた部分問題を解くときに、部分問題を表す部分行列中に存在する列番号の集合に対応するキーを用いて、キャッシュテーブルから検索し、キーに対応するペアが検索された場合、ペアのエントリを、部分問題の解を表すゼロサプレス型二分決定グラフの根ノードとし、キーに対応するペアが検索されなかった場合、部分問題を表す部分行列に基づいて、選択される列番号を１とする行番号の各々に対し、行番号を解に含めたときに得られる部分問題を求め、求められた部分問題を解き、解に含めた行番号をラベルとし、部分問題の解を表すゼロサプレス型二分決定グラフの根ノードをｈｉ枝の指すノードとし、
2018112784.tif 000009
又は直前の行番号に対する部分問題を解いたときにＺＤＤ構築演算部により格納されたノードをｌｏ枝の指すノードとした３つ組データを、ＺＤＤ構築演算部に入力し、部分問題を表す部分行列中に存在する列番号の集合を示すキー、及びＺＤＤ構築演算部により格納されたノードを示すエントリのペアを、キャッシュテーブルに格納する。
【００１３】
このように、厳密敷き詰め問題又は一般化厳密敷き詰め問題を高速に解くことができる。また、ＺＤＤの根ノードを記憶しておけばよいため、キャッシュテーブルの記憶容量の増大を抑制することができる。
【００１４】
また、第１の発明に係る厳密敷き詰め計算装置は、前記ユニークテーブルが、前記ノードの情報として、ノードＩＤ、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの４つの項目を１組とする４つ組データを保持し、前記ＺＤＤ構築演算部が、ラベル、ｈｉ枝の指すノード、及びｌｏ枝の指すノードの３つの項目を１組とする３つ組データを入力とし、前記３つ組データに対応するノードの情報を前記ユニークテーブルから検索し、前記３つ組データに対応する前記ノードの情報が検索されなかった場合、前記３つ組データに対応するノードを作成して、前記ノードの情報を、前記ユニークテーブルに格納してもよい。
【００１５】
また、第１の発明に係る厳密敷き詰め計算装置は、前記再帰計算部が、前記キャッシュテーブルに保持されている複数のペアの個数が上限に達している状態において新しいペアを追加する場合、前記複数のペアの１つに代えて、前記新しいペアを追加してもよい。
【００１６】
本発明に係る厳密敷き詰め計算プログラムは、コンピュータを、第１の発明に係る厳密敷き詰め計算装置の各部として機能させるためのプログラムである。
【発明の効果】
【００１７】
以上説明したように、本発明に係る厳密敷き詰め計算装置、方法、及びプログラムによれば、厳密敷き詰め問題又は一般化厳密敷き詰め問題を高速に解くことができる。
【図面の簡単な説明】
【００１８】
【図１】実施形態に係る厳密敷き詰め問題を表す行列の一例を示す図である。
【図２】実施形態に係るＤＬＸのアルゴリズムの一例を示す図である。
【図３】実施形態に係るＺＤＤの一例を示す模式図である。
【図４】第１の実施形態に係る厳密敷き詰め計算装置の機能的な構成の一例を示すブロック図である。
【図５】第１の実施形態に係る厳密敷き詰め計算プログラムによる処理の流れの一例を示すフローチャートである。
【図６】第１の実施形態に係る厳密敷き詰め計算アルゴリズムの一例を示す図である。
【図７】第１の実施形態に係る厳密敷き詰め計算アルゴリズムのサブルーチンの一例を示す図である。
【発明を実施するための形態】
【００１９】
以下、図面を参照して、本発明を実施するための形態の一例について詳細に説明する。
【００２０】
[本発明の実施形態の概要]
本実施形態においては、ＤＬＸを実行しながら、キャッシュテーブルを用いて、厳密敷き詰め問題、もしくは、一般化厳密敷き詰め問題の解の集合を表現するＺＤＤを構築する。構築されたＺＤＤは、全ての解集合を有向非巡回グラフとして表現する。このＺＤＤは、ＤＬＸの実行中に出現する部分問題の全ての解の集合を部分グラフとして含んでいる。そのため、部分問題の解を格納するキャッシュテーブルは、部分問題の解集合を表す部分グラフの根ノードを記憶しておけばよく、キャッシュテーブルの記憶容量の増大を抑制することができる。また、ＺＤＤを用いることで部分問題の部分解の集合から主問題の解を求めることも定数時間で実行できるため、ＤＬＸを高速化することが可能となる。
【００２１】
以下、本実施形態に係る厳密敷き詰め問題、ＤＬＸ、及びＺＤＤについて説明する。
【００２２】
図１は、本実施形態に係る厳密敷き詰め問題を表す行列の一例を示す図である。
図１に示すように、厳密敷き詰め問題は、二値行列を用いて表現することができる。
【００２３】
行列は、｜Ｓ｜行、｜Ｕ｜列からなり、各列番号が全体集合Ｕに含まれる各要素に対応し、各行ベクトルが集合族Ｓに含まれる各要素に対応している。すなわち、図１の例に示す行列は、Ｕ＝｛Ａ，Ｂ，Ｃ，Ｄ，Ｅ，Ｆ｝、Ｓ＝｛１，２，３，４，５｝＝｛｛Ａ，Ｂ，Ｃ，Ｅ｝，｛Ａ，Ｂ｝，｛Ｄ，Ｆ｝，｛Ｃ，Ｄ，Ｆ｝，｛Ｃ，Ｅ｝｝であるような厳密敷き詰め問題を表現している。厳密敷き詰めＳ＊は各列について必ず１つだけ１となる要素が含まれるような行ベクトルの組合せとして表現される。この例では、｛１，３｝と｛２，３，５｝とが厳密敷き詰めとなる。従って、全ての厳密敷き詰めの集合は、｛１，．．．，５｝を全体集合とする集合族｛｛１，３｝，｛２，３，５｝｝として表現される。
【００２４】
一般化厳密敷き詰め問題も二値行列を用いて表現することができる。行列は、｜Ｓ｜行、｜Ｕ｜+｜Ｕ’｜列からなり、各行ベクトルが集合族Ｓに含まれる各要素に対応する。そして、一般化厳密敷き詰めＳ＊は，最初の｜Ｕ｜列について必ず１つだけ１となる要素が含まれ、かつ、残りの｜Ｕ’｜列については高々１つだけ１となる要素が含まれるような行ベクトルの組み合わせとして表現される。
【００２５】
ＤＬＸは、深さ優先のバックトラックを用いた探索によって厳密敷き詰め問題のすべての解を発見するアルゴリズムである。
【００２６】
図２は、本実施形態に係るＤＬＸのアルゴリズムの一例を示す図である。
図２に示すように、ＤＬＸは手続きＳｅａｒｃｈ（Ａ，Ｒ）を、Ａを更新しながら再帰的に実行することによって、全ての可能な解を発見する。一例として、図１に示す行列を入力としてＤＬＸを実行したときの処理を示す。
【００２７】
まず、アルゴリズム５行目にて行列Ａの列ｃ＝Ａを選択したとする。そうすると、Ａ[ｒ，Ａ]＝１となる行ｒは１，２となる。
【００２８】
アルゴリズム６行目にてｒ＝２が選択されたとすると、Ａ[ｒ，ｊ]＝１となる列ｊは、ｊ＝Ａ，Ｂのいずれかとなるので、アルゴリズム９行目にて行列Ａから列Ａ，Ｂを削除する。さらに、アルゴリズム１１行目でｊ＝Ａ，Ｂに対してＡ[ｉ，ｊ]＝１となる行ｉ＝１，２ を削除し、部分行列
2018112784.tif 000010
が得られる。
【００２９】
さらに、アルゴリズム１２行目で得られた部分行列を入力として再帰的にＳｅａｒｃｈ（Ａ，Ｒ）を呼び出す。再帰的な呼び出しで今度は列ｃ＝Ｅが選択されたとすると、Ａ[ｒ，Ｅ]＝１となる行ｒは５のみとなる。今度はＡ[５，ｊ]＝１となる列ｊ＝Ｃ，Ｅと、それらの列ｊに対してＡ[ｉ，ｊ]＝１となる行ｉ＝４，５を削除し、部分行列
2018112784.tif 000011
が得られる。
【００３０】
ここで、行ｒ＝３を選択すると、対応する行、列を削除した行列は空となることから、これまで選択されたｒ＝２，５，３が厳密敷き詰めとなる。
【００３１】
なお、アルゴリズム２行目の条件を、「Ａが最初の｜Ｕ｜列及びＳ行を含まない」に変更し、かつ、アルゴリズム５行目で選択する列ｃを最初の｜Ｕ｜列のいずれかに限定すると、一般化厳密敷き詰め問題の解法となる。
【００３２】
図３は、本実施形態に係るＺＤＤの一例を示す模式図である。
ＺＤＤは、集合族を有向非巡回グラフとして表現するデータ構造である。
【００３３】
図３に示すように、全体集合｛１，２，３｝の部分集合からなる集合族｛｛１，２｝，｛１，３｝，｛２，３｝｝を表現する。ＺＤＤは、終端ノードと分岐ノードの２種類のノードをもつ。終端ノードはそのノードを始点とするアークを持たないノードであり、図３では四角で表現される。
2018112784.tif 000012
終端ノードと
2018112784.tif 000013
終端ノードの２種類の終端ノードがあり、１つのＺＤＤには各終端ノードが高々１つずつ存在する。分岐ノードは、終端ノードではないノードのことであり、各分岐ノードにはそのノードが対応する全体集合の要素を表すラベルが付与される。また、各分岐ノードにはそのノードを始点とするアークが必ず２つ存在し、それぞれｌｏ枝、ｈｉ枝と呼ぶ。図３では各分岐ノードは円として表現され、ｈｉ枝は実線、ｌｏ枝は点線によって表現される。
【００３４】
図３に示すノードｎ１は、分岐ノードであり、要素１がラベルとして付与され、ｌｏ枝はノードｎ２を、ｈｉ枝はノードｎ３を指している。ＺＤＤ中では親をもたないノードが必ず１つのみ存在し、このノードは根ノードと呼ばれる。根ノードから
2018112784.tif 000014
終端ノードまでの各経路が、ＺＤＤが表現する集合族に含まれる各部分集合に対応している。
【００３５】
図３に示すＺＤＤでは、３種類の経路が存在し、それらがそれぞれ｛１，２｝，｛１，３｝，｛２，３｝に対応する。ＺＤＤ中の各ノードは、そのノードを根とする部分ＺＤＤを表現している。図３の例では、ノードｎ２を根とするＺＤＤは全体集合｛２，３｝の部分集合からなる集合族｛｛２｝，｛３｝｝を表現している。
【００３６】
ＺＤＤは、各ノードについて、(ノードＩＤ，ラベル，ｈｉ枝の指すノード，ｌｏ枝の指すノード) の４つの項目を１組（４つ組）として用意することで表現できる。図３に示すＺＤＤでは、６つのノードを持つため、
2018112784.tif 000015
2018112784.tif 000016
というテーブルを用意することで表現することができる。
【００３７】
[第１の実施形態]
図４は、第１の実施形態に係る厳密敷き詰め計算装置１０の機能的な構成の一例を示すブロック図である。
図４に示すように、厳密敷き詰め計算装置１０は、問題入力部１２と、再帰計算部１４と、ＺＤＤ構築演算部１６と、一時計算結果記憶部１８と、計算結果出力部２０と、を備えている。本第１の実施形態においては、厳密敷き詰め問題の場合を例示して説明する。
【００３８】
本実施形態に係る厳密敷き詰め計算装置１０は、ＣＰＵ（Central Processing Unit）、ＲＡＭ(Random Access memory)、ＲＯＭ(Read Only Memory)、及びＨＤＤ(Hard Disk Drive)等を備えたコンピュータとして構成される。ＲＯＭには、本実施形態に係る厳密敷き詰め計算処理を実行するための厳密敷き詰め計算プログラムが記憶されている。なお、厳密敷き詰め計算プログラムは、ＨＤＤに記憶されていてもよい。
【００３９】
上記の厳密敷き詰め計算プログラムは、例えば、厳密敷き詰め計算装置１０に予めインストールされていてもよい。厳密敷き詰め計算プログラムは、不揮発性の記憶媒体に記憶して、又は、ネットワークを介して配布して、厳密敷き詰め計算装置１０に適宜インストールすることで実現してもよい。なお、不揮発性の記憶媒体の例としては、ＣＤ-ＲＯＭ(Compact Disc Read Only Memory)、光磁気ディスク、ＤＶＤ-ＲＯＭ(Digital Versatile Disc Read Only Memory)、フラッシュメモリ、メモリカード等が挙げられる。
【００４０】
ＣＰＵは、ＲＯＭに記憶されている厳密敷き詰め計算プログラムを読み込んで実行することにより、厳密敷き詰め計算装置１０の各部として機能する。
【００４１】
一時計算結果記憶部１８は、再帰計算部１４で利用されるキャッシュテーブル１８Ａと、ＺＤＤノードを保持するユニークテーブル１８Ｂと、を記憶する。以下、一時計算結果記憶部１８に記憶されるキャッシュテーブル１８Ａ及びユニークテーブル１８Ｂについて説明する。
【００４２】
キャッシュテーブル１８Ａは、キーとエントリのペアを保持しており、テーブルサイズの上限は固定である。キャッシュテーブル１８Ａのキーは、厳密敷き詰め問題の部分問題を表す二値行列Ａ中に存在する列番号の集合を示す。また、エントリは、部分問題の解となる行番号の集合からなる集合族を表すＺＤＤの根ノードを示す。つまり、エントリは、二値行列Ａを入力とする厳密敷き詰め問題の解の集合を表現するＺＤＤの根ノードを示す。
【００４３】
ユニークテーブル１８Ｂは、厳密敷き詰め問題の解となる行番号の集合からなる集合族を表すＺＤＤに関する各ノードの情報を保持する。ユニークテーブル１８Ｂは、ノードの情報として、(ノードＩＤ，ラベル，ｌｏ枝の指すノード，ｈｉ枝の指すノード)の４つの項目を１組とする４つ組データ（以下、単に４つ組という。）を格納するテーブルである。ユニークテーブル１８Ｂに格納されている４つ組の集合は、ＺＤＤを表現しているとみなすことができる。このため、計算結果出力部２０では、最終的に計算結果として、ユニークテーブル１８Ｂの４つ組を出力する。なお、ユニークテーブル１８Ｂには、ラベル、ｌｏ枝の指すノード、及びｈｉ枝の指すノードが全て一致する４つ組は含まれていないものとする。
【００４４】
ＺＤＤ構築演算部１６は、ラベル、ｌｏ枝の指すノード、及びｈｉ枝の指すノードの３つの項目を１組とする３つ組データ（以下、単に３つ組という。）を入力とし、３つ組に対応するノードの情報をユニークテーブル１８Ｂに格納する。
【００４５】
一方、問題入力部１２は、二値行列として表現されている厳密敷き詰め問題のインスタンスの入力を受け付ける。
【００４６】
再帰計算部１４は、問題入力部１２により入力を受け付けた二値行列に基づいて、選択される列番号を１とする行番号の各々に対し、行番号を解に含めたときに得られる部分問題を求め、求められた部分問題を再帰的に解く。再帰計算部１４は、求められた部分問題を解くときに、部分問題を表す部分行列中に存在する列番号の集合に対応するキーを用いて、キャッシュテーブル１８Ａから検索する。そして、キーに対応するペアが検索された場合、ペアのエントリを、部分問題の解を表すＺＤＤの根ノードとする。
【００４７】
一方、キーに対応するペアが検索されなかった場合、部分問題を表す部分行列に基づいて、選択される列番号を１とする行番号の各々に対し、行番号を解に含めたときに得られる部分問題を求め、求められた部分問題を解き、解に含めた行番号をラベルとし、部分問題の解を表すＺＤＤの根ノードをｈｉ枝の指すノードとし、
2018112784.tif 000017
又は直前の行番号に対する部分問題を解いたときにＺＤＤ構築演算部１６により格納されたノードをｌｏ枝の指すノードとした３つ組を、ＺＤＤ構築演算部１６に入力する。
また、再帰計算部１４は、部分問題を表す部分行列中に存在する列番号の集合を示すキー、及び、ＺＤＤ構築演算部１６により格納されたノードを示すエントリのペアを、キャッシュテーブル１８Ａに格納する。
【００４８】
このように、本実施形態に係る再帰計算部１４は、問題入力部１２によって読み込まれた厳密敷き詰め問題のインスタンスを受け取り、ＤＬＸを実行しつつ、ＺＤＤ構築演算部１６をサブルーチンとして呼び出す。
【００４９】
ＺＤＤ構築演算部１６は、再帰計算部１４からの命令を受けて、ＺＤＤ構築のためのサブルーチンを呼び出し、キャッシュテーブル１８Ａの参照・更新、ユニークテーブル１８Ｂの参照・更新を行う。
【００５０】
すなわち、再帰計算部１４は、キャッシュテーブル１８Ａに対して、二値行列の列番号の集合をクエリとして与えられたときにキーがクエリと一致する（キー，エントリ）のペアを出力する機能を有している。
【００５１】
また、再帰計算部１４は、新たに（キー，エントリ）のペアをキャッシュテーブル１８Ａに追加する機能も有している。例えば、キャッシュテーブル１８Ａに格納されているキーとエントリのペアの個数がテーブルサイズの上限に達している状態において新しいキーとエントリのペアを追加する場合、既にキャッシュテーブル１８Ａに格納されているペアを一つ削除して、代わりに新しいペアを追加する。
【００５２】
また、ＺＤＤ構築演算部１６は、ユニークテーブル１８Ｂに対して、(ラベル，ｌｏ枝の指すノード，ｈｉ枝の指すノード)の３つ組を入力として受け取り、ユニークテーブル１８Ｂ中に含まれる、その３つ組を含む４つ組(ノードＩＤ，ラベル，ｌｏ枝の指すノード，ｈｉ枝の指すノード)が存在するか否かを判定し、その３つ組を含む４つ組が存在しない場合には、当該４つ組を、ユニークテーブル１８Ｂに追加する機能を有する。
【００５３】
なお、再帰計算部１４で計算された計算結果は、一時計算結果記憶部１８に記憶される。計算結果出力部２０は、一時計算結果記憶部１８に記憶されている計算結果を出力する。計算結果出力部２０は、例えば、ディスプレイやプリンタ等の出力装置である。
【００５４】
次に、図５を参照して、第１の実施形態に係る厳密敷き詰め計算装置１０の作用を説明する。なお、図５は、第１の実施形態に係る厳密敷き詰め計算プログラムによる処理の流れの一例を示すフローチャートである。
【００５５】
本第１の実施形態に係る厳密敷き詰め計算装置１０は、操作者の操作により厳密敷き詰め計算処理の実行が指示されると、ＣＰＵがＲＯＭに記憶されている厳密敷き詰め計算プログラムを読み出して実行する。
【００５６】
まず、図５のステップ１００では、再帰計算部１４が、問題入力部１２から厳密敷き詰め問題のインスタンスを、二値行列Ａとして受け取る。
【００５７】
ステップ１０２では、ＺＤＤ構築演算部１６が、再帰計算部１４からの命令に従って、厳密敷き詰め計算として、厳密敷き詰め問題の全ての解の集合を表現するＺＤＤを構築する。このステップ１０２の処理を行うためのアルゴリズムについては後述する。
【００５８】
ステップ１０４では、計算結果出力部２０が、ステップ１０２で計算した厳密敷き詰め問題の解集合を表現するＺＤＤを出力して、処理を終了する。
【００５９】
図６は、第１の実施形態に係る厳密敷き詰め計算アルゴリズムの一例を示す図である。
図６に示す厳密敷き詰め計算アルゴリズムは、上記ステップ１０２の処理を行うためのアルゴリズムであり、再帰計算部１４において処理される。
【００６０】
また、図７は、第１の実施形態に係る厳密敷き詰め計算アルゴリズムのサブルーチンの一例を示す図である。
図７に示すサブルーチンは、図６に示す厳密敷き詰め計算アルゴリズムの処理中にＺＤＤ構築演算部１６において処理される。
【００６１】
図６及び図７に示すアルゴリズムの処理は、ＤＬＸを踏襲しており、ＤＬＸとの違いは、キャッシュテーブル１８Ａとユニークテーブル１８Ｂの処理が組み込まれている点にある。なお、以下では、便宜上、図６のアルゴリズムをメインアルゴリズムと呼び、図７のアルゴリズムをサブアルゴリズムと呼び、キャッシュテーブル１８ＡをキャッシュテーブルＣと表し、ユニークテーブル１８ＢをユニークテーブルＺと表すものとする。
【００６２】
まず、再帰計算部１４は、ＺＤＤ構築演算部１６に命令し、ＺＤＤ構築演算部１６が、メインアルゴリズム１行目で空のキャッシュテーブルＣを作成し、メインアルゴリズム２行目で空のユニークテーブルＺを作成する。そして、ＺＤＤ構築演算部１６は、作成した空のキャッシュテーブルＣ及び空のユニークテーブルＺを一時計算結果記憶部１８に格納する。
そして、再帰計算部１４は、入力された二値行列Ｘを入力として、Ｓｅａｒｃｈ（Ｘ）を実行し（メインアルゴリズム２０行目）、実行結果として出力されたノードｚを根ノードとするＺＤＤを、厳密敷き詰め問題の全ての解の集合を表現するＺＤＤとして出力する。
【００６３】
次に、メインアルゴリズム３行目のＳｅａｒｃｈ（Ａ）の処理について説明する。
再帰計算部１４は、メインアルゴリズム４行目で二値行列Ａが空であるか否かを判定し、Ａが空である場合、ＺＤＤ構築演算部１６でサブアルゴリズム１行目のサブルーチンＴｏｐ()を呼び出し、ＺＤＤノード
2018112784.tif 000018
を出力する。一方、Ａが空でない場合、ＺＤＤ構築演算部１６でサブアルゴリズム５行目のサブルーチンＣｈｅｃｋＣａｃｈｅ(ｃｏｌ(Ａ)，Ｃ)を呼び出す。そして、ＺＤＤ構築演算部１６は、サブアルゴリズム６行目に示すように、キーの値がｃｏｌ(Ａ)と一致する要素（キー，エントリ）のペアがキャッシュテーブルＣ中に存在しないか否かを調べる。
【００６４】
さらに、再帰計算部１４は、キャッシュテーブルＣにキーの値がｃｏｌ(Ａ)と一致する要素（キー，エントリ）のペアが存在するのであれば、ＺＤＤ構築演算部１６でサブアルゴリズム７行目のサブルーチンＧｅｔＣａｃｈｅ(ｃｏｌ(Ａ)，Ｃ)を呼び出し、（キー，エントリ）のペアのエントリを、二値行列Ａが表す部分問題の解を表すＺＤＤの根ノードとして出力し、Ｓｅａｒｃｈ(Ａ)の処理を終了する。なお、ｃｏｌ()は、部分行列を入力として受け取り、その中に存在する列番号の集合を返す関数である。従って、ｃｏｌ(Ａ)は、部分行列Ａ中に存在する列番号の集合となる。また、キャッシュテーブルの要素（キー，エントリ）のペアのエントリは、ＺＤＤノードを示す。
【００６５】
キャッシュテーブルＣにキーの値がｃｏｌ(Ａ)と一致する要素（キー，エントリ）のペアが存在しなかった場合、再帰計算部１４は、メインアルゴリズム７行目の処理において、部分行列Ａから列ｃを選択し、メインアルゴリズム８行目の処理において、ＺＤＤ構築演算部１６でサブアルゴリズム３行目のサブルーチンＢｏｔ()を呼び出す。なお、メインアルゴリズム７〜１３行目の処理は、変数ｘをＺＤＤノード
2018112784.tif 000019
で初期化する以外はＤＬＸと同一である。
【００６６】
つまり、メインアルゴリズム７〜１７行目では、再帰計算部１４が、部分行列Ａから列ｃを選択し、列ｃを１とする行ｒの各々に対して、当該行ｒを解に含めたときに得られる部分問題の部分行列を、部分行列Ａとし、部分行列Ａを入力として、Ｓｅｒｃｈ（Ａ）を再帰的に実行し、部分問題を解く。実行結果として、部分問題の解を表すＺＤＤの根ノードを得て、ｙとする。
ｙが、
2018112784.tif 000020
でない場合には、解に含めた行ｒをラベルとし、部分問題の解を表すＺＤＤの根ノードｙをｈｉ枝の指すノードとし、
2018112784.tif 000021
又は直前の行番号に対する部分問題を解いたときにＺＤＤ構築演算部１６により格納されたノードｘをｌｏ枝の指すノードとした３つ組を入力として、Ｕｎｉｑｕｅ（ｒ、ｘ、ｙ、Ｚ）を実行し、当該３つ組に対応するＺＤＤノードを、ｘとする。そして、１１、１３行目の処理でＡから削除された行、列を復元し、列ｃを１とする他の行ｒについて、上述したメインアルゴリズム９〜１７行目の処理を繰り返す。
【００６７】
メインアルゴリズム１８行目では、再帰計算部１４が、二値行列Ａ中に存在する列ｃの集合を示すキー、及び、上述したメインアルゴリズム９〜１７行目の処理を繰り返したときに最終的に得られたＺＤＤノードｘを示すエントリのペアを、キャッシュテーブル１８Ａに格納する。そして、ＺＤＤノードｘを出力して、Ｓｅａｒｃｈ(Ａ)の処理を終了する。
【００６８】
より具体的に説明すると、メインアルゴリズム１６行目の処理において、ＺＤＤ構築演算部１６でサブアルゴリズム１１行目のサブルーチンＵｎｉｑｕｅ（ｒ，ｘ，ｙ，Ｚ）を呼び出し、変数ｘを、Ｕｎｉｑｕｅ（ｒ，ｘ，ｙ，Ｚ）に更新する。なお、Ｕｎｉｑｕｅ（ｒ，ｘ，ｙ，Ｚ）は、ＺＤＤ構築演算部１６で実行されるサブルーチンであり、サブアルゴリズム１２行目に示すように、ユニークテーブルＺ中に３つ組(ｒ，ｘ，ｙ) を含む４つ組(ｎ，ｒ，ｘ，ｙ)が存在するか否かを調べる。そして、存在するのであれば、その４つ組のノードＩＤｍを発行し、一方、存在しないのであれば、新たにノードＩＤｎを発行し、４つ組（ｎ，ｒ，ｘ，ｙ）をユニークテーブルＺに格納し、ｎを出力する。なお、ｎはノードＩＤ、ｒはラベル、ｘはｌｏ枝の指すノード、ｙはｈｉ枝の指すノードを示す。
【００６９】
メインアルゴリズム１７行目の処理は、ＤＬＸと同等の処理として行われる。
【００７０】
次に、メインアルゴリズム１８行目の処理では、ＺＤＤ構築演算部１６でサブアルゴリズム９行目のサブルーチンＳｔｏｒｅＣａｃｈｅ（ｃｏｌ(Ａ)，ｘ，Ｃ）を呼び出す。すなわち、ＺＤＤ構築演算部１６が、ペア（ｃｏｌ(Ａ)，ｘ，Ｃ）をキャッシュテーブルＣに格納するサブルーチンＳｔｏｒｅＣａｃｈｅ（ｃｏｌ(Ａ)，ｘ，Ｃ）を実行し、再帰計算部１４からｘが出力される。
【００７１】
次に、メインアルゴリズム１９行目の処理では、再帰計算部１４が、Ｓｅａｒｃｈ（Ｘ）を実行し、得られたＺＤＤノードｚを根ノードとするＺＤＤを出力して処理を終了する。
【００７２】
本実施形態に係る厳密敷き詰め計算装置１０に、一例として、図１に示す厳密敷き詰め問題を入力として与えると、敷き詰め問題の解の集合｛｛１，３｝，｛２，３，５｝｝を表現するＺＤＤが出力として得られる。
【００７３】
[第２の実施形態]
上記第１の実施形態では、厳密敷き詰め問題を例示して説明したが、本第２の実施形態では、一般化厳密敷き詰め問題を例示して説明する。一般化厳密敷き詰め問題を計算する場合における厳密敷き詰め計算装置の構成及び全体処理フローについても、上記第１の実施形態に係る厳密敷き詰め計算装置１０と略同様である。
【００７４】
本第２の実施形態に係る一般化厳密敷き詰め問題を計算する場合、図６に示すメインアルゴリズムにおいて、４行目の判定条件を、「Ａの最初の｜Ｕ｜列が空、かつ、｜Ｓ｜行が空」に変更し、７行目の「列ｃをＸから選択」を、「列ｃを最初の｜Ｕ｜行のいずれかから選択」に変更すればよい。この変更により、一般化厳密敷き詰め問題を計算することが可能となる。
【００７５】
以上、実施形態として厳密敷き詰め計算装置及び方法を例示して説明した。実施形態は、コンピュータを、厳密敷き詰め計算装置における各部として機能させるための厳密敷き詰め計算プログラムの形態としてもよい。実施形態は、この厳密敷き詰め計算プログラムを記憶したコンピュータが読み取り可能な記憶媒体の形態としてもよい。
【００７６】
その他、上記実施形態で説明した厳密敷き詰め計算装置の構成は、一例であり、主旨を逸脱しない範囲内において状況に応じて変更してもよい。
【００７７】
また、上記実施形態で説明した厳密敷き詰め計算プログラムの処理の流れも、一例であり、主旨を逸脱しない範囲内において不要なステップを削除したり、新たなステップを追加したり、処理順序を入れ替えたりしてもよい。
【００７８】
また、上記実施形態では、厳密敷き詰め計算プログラムを実行することにより、実施形態に係る処理がコンピュータを利用してソフトウェア構成により実現される場合について説明したが、これに限らない。実施形態は、例えば、ハードウェア構成や、ハードウェア構成とソフトウェア構成との組み合わせによって実現してもよい。
【符号の説明】
【００７９】
１０   厳密敷き詰め計算装置
１２   問題入力部
１４   再帰計算部
１６   ＺＤＤ構築演算部
１８   一時計算結果記憶部
１８Ａ キャッシュテーブル
１８Ｂ ユニークテーブル
２０   計算結果出力部
【図１】
2018112784.tif 000024
【図２】
2018112784.tif 000025
【図３】
2018112784.tif 000026
【図４】
2018112784.tif 000027
【図５】
2018112784.tif 000028
【図６】
2018112784.tif 000029
【図７】
2018112784.tif 000030