(57)【要約】【課題】必要な記憶域を抑えて、アイテム間の選択に制約があるナップサック問題を解決できる。【解決手段】求解部３２が、アイテムリストを、中間ノードに対応するアイテムで半分に分け、容量上限Ｃを、重み合計で分け、二分決定グラフの探索範囲を、中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた探索範囲の開始ノード、及び終了ノードとを中間点決定部３４に入力して、中間ノード、及び重み合計を求めることを再帰的に繰り返す。【選択図】図１
2018147088.tif 000002
【特許請求の範囲】
【請求項１】
価値と容量を持つアイテムの集合から、アイテム間の選択の制約条件の下で、容量上限Ｃ以下で価値を最大化するアイテムの部分集合上限を選択するナップサック問題を解決する問題解決装置であって、
前記アイテム間の選択の制約条件である論理制約を表す、前記アイテムに対応するノードの各々を含む二分決定グラフを作成する論理制約グラフ作成部と、
前記論理制約グラフ作成部によって作成された前記二分決定グラフに応じて前記アイテムを並べたアイテムリストに基づいて、前記二分決定グラフにおける、前記アイテムリストが表すアイテムの部分集合であって、前記容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算する求解部と、
アイテムリストと、容量上限と、前記二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、前記探索範囲における、アイテムリストが表すアイテムの部分集合であって、前記容量上限以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノード、及び重み合計を決定する中間点決定部と、
を含み、
前記求解部は、前記アイテムリストと、前記容量上限Ｃと、前記二分決定グラフの根ノードと、１終端ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求め、
前記アイテムリストを、前記中間ノードに対応するアイテムで半分に分け、前記容量上限Ｃを、前記重み合計で分け、前記二分決定グラフの探索範囲を、前記中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた前記探索範囲の開始ノード、及び終了ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求めることを再帰的に繰り返す
問題解決装置。
【請求項２】
価値と容量を持つアイテムの集合から、アイテム間の選択の制約条件の下で、容量上限Ｃ以下で価値を最大化するアイテムの部分集合上限を選択するナップサック問題を解決する問題解決装置における問題解決方法であって、
論理制約グラフ作成部が、前記アイテム間の選択の制約条件である論理制約を表す、前記アイテムに対応するノードの各々を含む二分決定グラフを作成するステップと、
求解部が、前記論理制約グラフ作成部によって作成された前記二分決定グラフに応じて前記アイテムを並べたアイテムリストに基づいて、前記二分決定グラフにおける、前記アイテムリストが表すアイテムの部分集合であって、前記容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算するステップと、
中間点決定部が、アイテムリストと、容量上限と、前記二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、前記探索範囲における、アイテムリストが表すアイテムの部分集合であって、前記容量上限以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノード、及び重み合計を決定するステップと、
を含み、
前記求解部が計算するステップは、前記アイテムリストと、前記容量上限Ｃと、前記二分決定グラフの根ノードと、１終端ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求め、
前記アイテムリストを、前記中間ノードに対応するアイテムで半分に分け、前記容量上限Ｃを、前記重み合計で分け、前記二分決定グラフの探索範囲を、前記中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた前記探索範囲の開始ノード、及び終了ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求めることを再帰的に繰り返す
問題解決方法。
【請求項３】
コンピュータを、請求項１に記載の問題解決装置の各部として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、問題解決装置、方法、及びプログラムに係り、特に、アイテム間の選択に制約があるナップサック問題を解決する問題解決装置、方法、及びプログラムに関する。
【背景技術】
【０００２】
組合せ最適化は計算機の産業応用において一つの重要な分野である。なかでも、ナップサック問題はさまざまな現実的な問題に対応付けることができ、ナップサック問題として定式化した上で解を得ることで、現実の問題に適用することが従来より広く行われていた。ナップサック問題とは、重さと価値がそれぞれ定まっているアイテム群と、重さの上限が設定された袋が与えられた場合に、選択したアイテムの価値の和が最大となるようなアイテムの組合せを決定する問題である。
【０００３】
例えば、計算機で自動的に文書の要約を行うという処理は、文書中の各単語をアイテムとし、単語の長さをアイテムの重さ、単語の重要度をアイテムの価値、事前に設定した要約文の最大長をナップサックの容量とするようなナップサック問題として処理することができる。別の例としては、電力不足時に、発電所がまかなえる範囲で最大の需要に応えるような需要家の選択の方法などもナップサック問題の一種として捉えることができる。
【０００４】
重さが整数で与えられ、各アイテムは２度以上選択できないとした場合、従来より、重さ×アイテムの数だけのマスを持つ表を備えた手法が知られている。各マスには２種類の情報を記録する。ひとつは各マスへ至るまでの最大価値を記録であり、もうひとつは、そのマスへ至る前の前のマスの番地である。すべてのアイテムについてマスを埋める作業を終えた後、最大価値を持つマスから、後ろ向きにすべて辿っていくことで(バックトラック)、どのアイテムが最終的に選択されたかを知ることができる。
【０００５】
さて、上記は単純な設定のナップサック問題の応用と、解法について述べた。しかし、現実の設定では、単純な設定のナップサック問題だけではなく、アイテムの選択にさらなる制約が課される場合がある。
【０００６】
例えば、上述の文書要約では単純に重要な単語のみを選択したのでは、選択された単語の結合が文法的に意味をなさない可能性があり、そのため、元の文や文書が持つ単語間の親子関係を考慮することが考えられる。このような設定は、子の単語選択するためにはその親の単語も選択しなければならないような追加の制約を持つようなナップサック問題としてとらえることができる。
【０００７】
あるいは、上述の電力網の例においても各需要家は独立した存在ではなくネットワークで繋がっているのであるから、ある需要家への給電を行うとすれば必然的に（芋づる式に）給電を行わざるをえない需要家が現れる場合がある。これも、ナップサックの容量という制約に加えて、ネットワークの形状に関する制約を持つようなナップサック問題ととらえることができる。
【０００８】
このようなアイテムの選択に関する制約がある場合のナップサック問題について、従来より、高速に厳密解を求める手法が知られている。非特許文献１、及び非特許文献２に示す従来技術では、アイテムの選択に関する制約を二分決定図(Binary Decision Diagram,ＢＤＤ)と呼ばれるグラフ構造を保持し、表のマス埋めと同時にこのＢＤＤを参照する方法が取られている。単純な設定のナップサック問題と比べ、高々ＢＤＤの「幅」と称する値を乗じただけの時間と記憶域によって、アイテムの選択に関する制約つきのナップサック問題を解いている。
【先行技術文献】
【非特許文献】
【０００９】
【非特許文献１】「ご予算にあう最高の詰合せをすぐに作れます」http://www.kecl.ntt.co.jp/openhouse/2015/exhibition/13/poster.pdf（2017/2/2参照）
【非特許文献２】Masaaki Nishino, Norihito Yasuda, Shin-ichi Minato, and Masaaki Nagata. "BDD-constrained search: a unified approach to constrained shortest path problems". In Proceedings of the Twenty-Ninth AAAI Conference on Artificial Intelligence (AAAI'15). AAAI Press 1219-1225.
【非特許文献３】Ulrich Pferschy, "Dynamic programming revisited: improving knapsack algorithms". Computing 63.4 (1999): 419-430.
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかし、上記の手法は結局、「重さ×アイテムの数×「幅（アイテムに係るＢＤＤの節点の総数）」」という数のマスに、最適値とバックトラックのための情報を保持する必要がある。このため、必要な記憶域が大きいという問題があった。
【００１１】
一方、アイテム間の選択に制約が課されない、単純な設定のナップサック問題については従来より、記憶域を削減する方法が知られている。非特許文献３に示す従来技術では、最適解を与えるような経路の中間地点を分割統治法により再帰的に求めていくことで、必要な記憶域を削減している。しかし、この方法は、適用可能な問題が単純な設定のナップサック問題に限られており、上述のような現実の問題に伴って出現するアイテム間の選択に関する制約を取り扱うことができないという課題があった。
【００１２】
本発明は、上記問題点を解決するために成されたものであり、必要な記憶域を抑えて、アイテム間の選択に制約があるナップサック問題を解決できる問題解決装置、方法、及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記目的を達成するために、第１の発明に係る問題解決装置は、価値と容量を持つアイテムの集合から、アイテム間の選択の制約条件の下で、容量上限Ｃ以下で価値を最大化するアイテムの部分集合上限を選択するナップサック問題を解決する問題解決装置であって、前記アイテム間の選択の制約条件である論理制約を表す、前記アイテムに対応するノードの各々を含む二分決定グラフを作成する論理制約グラフ作成部と、前記論理制約グラフ作成部によって作成された前記二分決定グラフに応じて前記アイテムを並べたアイテムリストに基づいて、前記二分決定グラフにおける、前記アイテムリストが表すアイテムの部分集合であって、前記容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算する求解部と、アイテムリストと、容量上限と、前記二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、前記探索範囲における、アイテムリストが表すアイテムの部分集合であって、前記容量上限以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノード、及び重み合計を決定する中間点決定部と、を含み、前記求解部は、前記アイテムリストと、前記容量上限Ｃと、前記二分決定グラフの根ノードと、１終端ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求め、前記アイテムリストを、前記中間ノードに対応するアイテムで半分に分け、前記容量上限Ｃを、前記重み合計で分け、前記二分決定グラフの探索範囲を、前記中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた前記探索範囲の開始ノード、及び終了ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求めることを再帰的に繰り返すことを特徴とする。
【００１４】
第１の発明に係る問題解決方法は、価値と容量を持つアイテムの集合から、アイテム間の選択の制約条件の下で、容量上限Ｃ以下で価値を最大化するアイテムの部分集合上限を選択するナップサック問題を解決する問題解決装置における問題解決方法であって、論理制約グラフ作成部が、前記アイテム間の選択の制約条件である論理制約を表す、前記アイテムに対応するノードの各々を含む二分決定グラフを作成するステップと、求解部が、前記論理制約グラフ作成部によって作成された前記二分決定グラフに応じて前記アイテムを並べたアイテムリストに基づいて、前記二分決定グラフにおける、前記アイテムリストが表すアイテムの部分集合であって、前記容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算するステップと、中間点決定部が、アイテムリストと、容量上限と、前記二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、前記探索範囲における、アイテムリストが表すアイテムの部分集合であって、前記容量上限以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノード、及び重み合計を決定するステップと、を含み、前記求解部が計算するステップは、前記アイテムリストと、前記容量上限Ｃと、前記二分決定グラフの根ノードと、１終端ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求め、前記アイテムリストを、前記中間ノードに対応するアイテムで半分に分け、前記容量上限Ｃを、前記重み合計で分け、前記二分決定グラフの探索範囲を、前記中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた前記探索範囲の開始ノード、及び終了ノードとを前記中間点決定部に入力して、前記中間ノード、及び前記重み合計を求めることを再帰的に繰り返すことを特徴とする。
【００１５】
第３の発明に係るプログラムは、第１の発明に係る問題解決装置の各部として機能させるためのプログラムである。
【発明の効果】
【００１６】
本発明の問題解決装置、方法、及びプログラムによれば、アイテムに対応するノードの各々を含む二分決定グラフを作成し、二分決定グラフに応じてアイテムを並べたアイテムリストに基づいて、二分決定グラフにおける、アイテムリストが表すアイテムの部分集合であって、容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算する場合において、アイテムリストと、容量上限と、二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、探索範囲における、アイテムリストが表すアイテムの部分集合であって、容量上限以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノード、及び重み合計を決定し、アイテムリストと、容量上限Ｃと、二分決定グラフの根ノードと、１終端ノードとを入力して、中間ノード、及び重み合計を求め、アイテムリストを、中間ノードに対応するアイテムで半分に分け、容量上限Ｃを、重み合計で分け、二分決定グラフの探索範囲を、中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた探索範囲の開始ノード、及び終了ノードとを入力して、中間ノード、及び重み合計を求めることを再帰的に繰り返すことにより、必要な記憶域を抑えて、アイテム間の選択に制約があるナップサック問題を解決できる、という効果が得られる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施の形態に係る問題解決装置の構成を示すブロック図である。
【図２】論理制約が課されたＢＤＤの一例を示す図である。
【図３】求解部３２の処理の流れを示す図である。
【図４】本発明の実施の形態に係る問題解決装置における問題解決処理ルーチンを示すフローチャートである。
【図５】本発明の実施の形態に係る問題解決装置における中間点決定処理ルーチンを示すフローチャートである。
【発明を実施するための形態】
【００１８】
以下、図面を参照して本発明の実施の形態を詳細に説明する。本発明の実施の形態の問題解決装置は、価値と容量を持つアイテムの集合から、アイテム間の選択の制約条件の下で、容量上限Ｃ以下で価値を最大化するアイテムの部分集合上限を選択するナップサック問題を解決する。
【００１９】
＜本発明の実施の形態に係る問題解決装置の構成＞
【００２０】
まず、本発明の実施の形態に係る問題解決装置の構成について説明する。図１に示すように、本発明の実施の形態に係る問題解決装置１００は、ＣＰＵと、ＲＡＭと、後述する問題解決処理ルーチンを実行するためのプログラムや各種データを記憶したＲＯＭと、を含むコンピュータで構成することが出来る。この問題解決装置１００は、機能的には図１に示すように入力部１０と、演算部２０と、出力部５０とを備えている。
【００２１】
入力部１０は、アイテム間の制約条件である論理制約を受け付ける。また、価値と容量を持つアイテムの集合と、容量上限Ｃとを受け付ける。
【００２２】
演算部２０は、論理制約グラフ作成部３０と、求解部３２と、中間点決定部３４とを含んで構成されている。
【００２３】
求解部３２は、初期化部３６と、再帰処理部３８とを含んで構成されている。
【００２４】
論理制約グラフ作成部３０は、アイテム間の選択の制約条件である論理制約を表す、アイテムに対応するノードの各々を含む二分決定グラフを作成する。
【００２５】
論理制約グラフ作成部３０では、入力部１０で受け付けたアイテム間の制約条件である論理制約を入力として、論理的な制約を表現したグラフを出力する。ここで、論理的な制約を表現したグラフの要件としては、アイテムの選択（ナップサックに入れる／入れない）に応じて辺を辿っていくことができるようなグラフであり、かつ、選択の結果辿った頂点が同じであれば、残りのアイテム間の選択に関して課される論理制約も同じであることを表現しているようなグラフであれば良い。本実施の形態では、論理式を表現するグラフとして当業者に広く知られている二分決定グラフ（ＢＤＤ）を用いる場合について説明する。論理制約を入力として、その論理制約を表現したＢＤＤを作成する技術は当業者に公知である。例えば、図２に、アイテムがｘ１，ｘ２，ｘ３の３つがあり、これらのアイテム間に（（ｘ１を選択かつｘ３を選択）またはｘ２を選択）という論理制約が課されている場合のＢＤＤを示す。ＢＤＤでは、最上位の節点から、１終端までの経路によって論理制約を満たすような割り当てを表現してある。各節点からは２つの枝が出ており、ＨＩ枝（図２中の実線）とＬＯ枝（図２中の点線）と呼ばれる。ＨＩ枝は、その変数を選択する（その変数に１を割り当てる）ことを示し、ＬＯ枝は選択しない（その変数に０を割り当てる）ことを表現する。こうして作成した論理制約を持つ二分決定グラフを出力する。ここで、従来手法、及び本発明の実施の形態における「幅」について補足しておく。ＢＤＤにおける「幅」は、各アイテムを論理変数となるようなＢＤＤを構成した場合に、ひとつのアイテムの０／１に関与するＢＤＤの節点の総数にあたる。例えば、図２のＢＤＤにおいては、アイテムｘ１，ｘ２，ｘ３に関与するＢＤＤ節点数はそれぞれ１，２，１であるため、このＢＤＤの幅はｘ２のＢＤＤ節点数である２となる。
【００２６】
求解部３２は、論理制約グラフ作成部３０によって作成された二分決定グラフに応じてアイテムを並べたアイテムリストに基づいて、二分決定グラフにおける、アイテムリストが表すアイテムの部分集合であって、容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算する。
【００２７】
求解部３２は、上記経路を計算するために、アイテムリストＩと、容量上限Ｃと、二分決定グラフの根ノード（ｒｏｏｔ）と、１終端ノード（Ｂｅ）とを中間点決定部３４に入力して、中間ノード、及び重み合計を求める。そして、アイテムリストＩを、中間ノードに対応するアイテムで半分に分け、容量上限Ｃを、重み合計で分け、二分決定グラフの探索範囲を、中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた探索範囲の開始ノード、及び終了ノードとを中間点決定部３４に入力して、中間ノード、及び重み合計を求めることを再帰的に繰り返す。
【００２８】
求解部３２では、問題と、論理制約グラフを入力として、制約を満たす中で、価値の和が最大となるようなアイテムの組合せを決定する。最適解を与えるような組合せは、（これまでに取捨選択したアイテムの数，累積重さ，ＢＤＤ節点）の３つ組を座標として持つようなマス（あるいはグラフノードとして捉えても良い）を持つ表の遷移において、開始座標（０，０，ｒｏｏｔ）から価値が最大となるような座標（アイテム総数，累積重さ，１終端）に至るまでの経路に相当する。非特許文献２の従来技術においては、最終的にバックトラックによってこの経路を求めるため、最適解に至った履歴をすべて保存していた。これに対し、本発明の実施の形態の求解部３２では、最適解を与えるような中間点のみを中間点決定部３４により決定し、中間点を再帰的に求めていく。
【００２９】
求解部３２の処理の流れを図３に示す。求解部３２では、まず、初期化部３６で、ＢＤＤ探索終了節点Ｂｅ、ＢＤＤ探索開始節点ｒｏｏｔ、ナップサック容量Ｃ、及び出力リストＲを初期化する。次に、再帰処理部３８により、探索範囲のアイテムリストＩと、容量上限Ｃと、二分決定グラフのうちの探索範囲の開始ノード（ＢＤＤ探索開始節点ｒｏｏｔ）、及び終了ノード（ＢＤＤ探索終了節点Ｂｅ）とを中間点決定部３４への入力として、最初に問題全体の最適解を与えるような中間点を得る。得られた中間点（Ｃｍ（累積重さ），Ｂｍ（ＢＤＤ節点））を出力リストＲへ追加する。再帰処理部３８は、アイテムリストを中間点で半分に分けた問題について、前半分では、アイテムリスト（Ｉの前半分）、ナップサック容量（Ｃｍ）、ＢＤＤ探索開始節点（ｒｏｏｔ）、及びＢＤＤ探索終了節点（Ｂｍ）を中間点決定部３４へ入力し、中間点を求め、出力リストＲへ追加する。後半分では、アイテムリスト（Ｉの後半分）、ナップサック容量（Ｃ−Ｃｍ）、ＢＤＤ探索開始節点（Ｂｍ）、及びＢＤＤ探索終了節点（Ｂｅ）を中間点決定部３４へ入力し、中間点を求め、出力リストＲへ追加する。以後、再帰処理部３８は、前半分と後半分との中間点を求める操作をアイテムリストの長さが１になるまで再帰的に繰り返す。すべての再帰のプロセスが終了した後、出力リストＲを出力部５０に出力する。
【００３０】
中間点決定部３４は、探索範囲のアイテムリストと、容量上限Ｃと、二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、探索範囲における、アイテムリストが表すアイテムの部分集合であって、容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノードＢｍ、及び中間ノードＢｍまでの重み合計Ｃｍを決定する。
【００３１】
中間点決定部３４では、部分問題についてその部分問題の最適解を与えるような中間点を返す。処理の詳細については後述する。中間点決定部３４は入力として、アイテムのリストＩ、ＢＤＤ探索開始節点ｒｏｏｔ、及びＢＤＤ探索終了節点Ｂｅを受取り、出力として、最適解を与えるような経路のうち、アイテムリストＩを半分処理した時点での中間点Ｂｍと、中間点Ｂｍまでの重み合計Ｃｍとの対を返す。中間点決定部３４では、２種類の配列Ｔ及びＭを更新する作業を繰り返す。配列Ｔは、アイテムを順に「選択する場合」「しない場合」について判定し、累積重さが同じもののうち、最大の価値の和を保持する。配列Ｍは中間点で通った点を保持する。基本的な流れは従来技術（非特許文献２）と同様である。すべての履歴を保持（非特許文献２では配列Ｂ）しない代わりに、アイテムリストを半分処理した時点での中間点を保持する点が異なる。
【００３２】
＜本発明の実施の形態に係る問題解決装置の作用＞
【００３３】
次に、本発明の実施の形態に係る問題解決装置１００の作用について説明する。入力部１０においてアイテム間の制約条件である論理制約と、価値と容量を持つアイテムと、容量上限Ｃとを受け付けると、問題解決装置１００は、図４に示す問題解決処理ルーチンを実行する。
【００３４】
まず、ステップＳ１００では、アイテム間の選択の制約条件である論理制約を表す、アイテムに対応するノードの各々を含む二分決定グラフを作成する。
【００３５】
次に、ステップＳ１０２では、求解部３２の初期化部３６は、ＢＤＤ探索終了節点Ｂｅ、ＢＤＤ探索開始節点ｒｏｏｔ、ナップサック容量Ｃ、及び出力リストＲを初期化する。
【００３６】
ステップＳ１０４では、求解部３２は、ステップＳ１００で作成された二分決定グラフに応じてアイテムを並べたアイテムリストに基づいて、二分決定グラフにおける、アイテムリストが表すアイテムの部分集合であって、容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算する。具体的には、後述する中間点決定処理ルーチンにおいて、求解部３２の再帰処理部３８が、アイテムリストＩと、容量上限Ｃと、二分決定グラフの根ノード（ｒｏｏｔ）と、１終端ノード（Ｂｅ）とを中間点決定部３４に入力して、中間ノード、及び重み合計を求め、アイテムリストＩを、中間ノードに対応するアイテムで半分に分け、容量上限Ｃを、重み合計で分け、二分決定グラフの探索範囲を、中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた探索範囲の開始ノード、及び終了ノードとを中間点決定部３４に入力して、中間ノード、及び重み合計を求めることを再帰的に繰り返す。中間点決定部３４は、探索範囲のアイテムリストと、容量上限Ｃと、二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、探索範囲における、アイテムリストが表すアイテムの部分集合であって、容量上限以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノードＢｍ、及び中間ノードＢｍまでの重み合計Ｃｍを決定し、出力リストＲに格納する。
【００３７】
ステップＳ１０６では、ステップＳ１０４で得られた出力リストＲの中間点を出力部５０に出力して処理を終了する。
【００３８】
次に、ステップＳ１０４の中間点決定処理ルーチンについて図５を用いて説明する。
【００３９】
ステップＳ３００では、探索範囲のアイテムリストＩと、容量上限Ｃと、二分決定グラフのうちの探索範囲の開始ノード（ＢＤＤ探索開始節点ｒｏｏｔ）、及び終了ノード（ＢＤＤ探索終了節点Ｂｅ）とを受け付ける。
【００４０】
ステップＳ３０２では、（累積重さ、ＢＤＤ節点）をキーとして持つ配列Ｔを空の連想配列として初期化する。ここで、配列Ｔのキーには状態（累積重さ，ＢＤＤ節点）において、値はその状態までの最高価値が格納される。
【００４１】
ステップＳ３０３では、Ｔ[(０,ｒｏｏｔ)]＝０と書き換える。
【００４２】
ステップＳ３０４では、（累積重さ、ＢＤＤ節点）をキーとして持つ配列Ｍを空の連想配列として初期化する。ここで、配列Ｍのキーには状態（累積重さ，ＢＤＤ節点）において、値はその状態に至る際に経由した中間地点（中間の状態）が格納される。
【００４３】
ステップＳ３０５では、Ｍ[(０,ｒｏｏｔ)]＝ｎｕｌｌと書き換える。
【００４４】
アイテムｉについて、ｉ＝１...|Ｉ|まで、以下のステップＳ３０６〜Ｓ３２６の処理をループする。
【００４５】
ステップＳ３０６では、Ｔｎ←Ｔと配列をコピーする。
【００４６】
選択中のアイテムｉについて、配列Ｔに格納される全てのキー(ｃ,ｂ)について、以下のステップＳ３０８〜Ｓ３２５の処理をループする。
【００４７】
ステップＳ３０８では、選択中のアイテムｉの重さ及び価値をそれぞれｗｉ、ｖｉに代入する。
【００４８】
ステップＳ３１０では、ｂ’に、ｂのＬＯ枝をＢＤＤ変数が選択中のアイテムｉのＢＤＤ変数より大きくなるまで辿った結果を代入する。
【００４９】
ステップＳ３１２では、ステップＳ３１０でｂ’が０終端であるか否かを判定し、０終端であればステップＳ３１４へ移行し、０終端でなければ、ステップＳ３２５へ移行する。
【００５０】
ステップＳ３１４では、ｂ’のＢＤＤ変数が選択中のアイテムｉと一致しているか否かを判定し、一致していればステップＳ３１６へ移行し、一致していなければステップＳ３１８へ移行する。
【００５１】
ステップＳ３１６では、ｂ’に、ｂ’のＨＩ枝の先の節点を代入する。
【００５２】
ステップＳ３１８では、配列Ｔｎ[ｃ＋ｗｉ,ｂ']が、ｖｉ+Ｔ[(ｃ,ｂ)]より小さいか否かを判定し、小さければステップＳ３２０へ移行し、小さくなければステップＳ３２２へ移行する。
【００５３】
ステップＳ３２０では、Ｔｎ[(ｃ＋ｗｉ,ｂ')]をｖｉ+Ｔ[(ｃ,ｂ)]と書き換える。
【００５４】
ステップＳ３２１では、Ｍ[(ｃ＋ｗｉ,ｂ')]をＭ[(ｃ,ｂ)]と書き換える。
【００５５】
ステップＳ３２２では、選択中のアイテムｉは、アイテム数の半分（切り下げ）と一致するか否かを判定し、一致する場合にはステップＳ３２４へ移行し、一致しない場合には、ステップＳ３２５へ移行する。
【００５６】
ステップＳ３２４では、Ｍ[ｃ＋ｗｉ,ｂ']を(ｃ＋ｗｉ,ｂ')と書き換える。
【００５７】
ステップＳ３２５では、Ｍ[(ｃ,ｂ)]を削除する。
【００５８】
全てのキーについて処理を終えると、ステップＳ３２６に移行し、Ｔ←Ｔｎと配列をコピーする。
【００５９】
全てのアイテムについて処理を終えると、ステップＳ３２７に移行し、ｃｏに、Ｔ[(ｃｉ,１終端)]((ｃｉ＝１,...,Ｃ)が最大となるｃｉ)を代入する。
【００６０】
ステップＳ３２８では、Ｍ[(ｃｏ,１終端)]を算出された中間点として決定して再帰処理部３８に出力し、中間点決定処理ルーチンを終了する。
【００６１】
以上説明したように、本発明の実施の形態に係る問題解決装置によれば、アイテムに対応するノードの各々を含む二分決定グラフを作成し、二分決定グラフに応じてアイテムを並べたアイテムリストに基づいて、二分決定グラフにおける、アイテムリストが表すアイテムの部分集合であって、容量上限Ｃ以下で価値を最大化するアイテムの部分集合を表す経路を計算する場合において、アイテムリストと、容量上限と、二分決定グラフのうちの探索範囲の開始ノード、及び終了ノードとを入力とし、探索範囲における、アイテムリストが表すアイテムの部分集合であって、容量上限以下で価値を最大化するアイテムの部分集合を表す経路上の中間ノード、及び重み合計を決定し、アイテムリストと、容量上限Ｃと、二分決定グラフの根ノードと、１終端ノードとを入力して、中間ノード、及び重み合計を求め、アイテムリストを、中間ノードに対応するアイテムで半分に分け、容量上限Ｃを、重み合計で分け、二分決定グラフの探索範囲を、中間ノードで分けた問題の各々について、分けられたアイテムリストと、分けられた容量上限と、分けられた探索範囲の開始ノード、及び終了ノードとを入力して、中間ノード、及び重み合計を求めることを再帰的に繰り返すことにより、必要な記憶域を抑えて、アイテム間の選択に制約があるナップサック問題を解決できる。
【００６２】
このように、本発明の実施の形態によれば、アイテム間の選択に制約があるナップサック問題の解（選択するアイテムの組合せ）を求める際に必要な記憶域の削減を行うことができる。したがって、より大規模な問題であってもより小さな記憶域しか持たない計算機での求解が可能となる。具体的には、アイテム総数をＮ、ナップサックの容量をＣ、ＢＤＤの幅をＷとした場合に、従来手法では必要な記憶域は、Ｎ×Ｃ×Ｗに比例してが、本発明の実施の形態に係る手法によれば、Ｃ×Ｗに比例した量の記憶域だけで良い。
【００６３】
なお、本発明は、上述した実施の形態に限定されるものではなく、この発明の要旨を逸脱しない範囲内で様々な変形や応用が可能である。
【符号の説明】
【００６４】
１０   入力部
２０   演算部
３０   論理制約グラフ作成部
３２   求解部
３４   中間点決定部
３６   初期化部
３８   再帰処理部
５０   出力部
１００ 問題解決装置
【図１】
2018147088.tif 000003
【図２】
2018147088.tif 000004
【図３】
2018147088.tif 000005
【図４】
2018147088.tif 000006
【図５】
2018147088.tif 000007