(57)【特許請求の範囲】
【請求項１】
開始位置の集合に配置されたp台の制御対象物からなる開始隊列を目標位置の集合からなる目標隊列に移動させるための行動制御を行う行動制御システムであって、
前記目的位置の集合には、所定の入口位置が予め設定されているものとし、
各時刻において、前記ｐ台の制御対象物の各々は、少なくとも１以上の辺で他の制御対象物と接続した状態を維持するものとし、
前記移動は、1<q<pを満たすq台の隣接する制御対象物からなる一塊の単位を制御対象物単位として、前記制御対象物単位の移動は、当該制御対象物単位と隣接する制御対象物単位とが接している辺同士をスライドさせる方向でのみ許容されるものとし、
行動aの種類を、静止、または、前記辺同士をスライドさせる各方向への移動として、
前記制御対象物単位の移動は、当該制御対象物単位が現在の位置sにおいて各行動aを取ったときの適切さを表す１個の価値関数に基づいて制御されるものとし、
前記価値関数は、空間上の全ての位置において、該位置にある制御対象物単位が前記所定の入口位置を目指して動作するための動作計画により計算されるものとし、
前記目標隊列を前記制御対象物単位の大きさで分割したときの制御対象物単位ごとの位置の集合を目的位置単位の集合として、
前記価値関数が記憶される記憶部と、
入力された隊列をGaとし、前記目的位置単位の集合に含まれる各位置が前記隊列Gaをなす各制御対象物単位で充填されていない場合に、前記隊列Gaをなす各制御対象物単位の中から頭部制御対象物単位を決定し、隊列Ga内の制御対象物単位のうち当該頭部制御対象物単位から最も遠い位置に存在する制御対象物単位を尾部制御対象物単位として決定し、隊列Gaから尾部制御対象物単位の位置を削除した隊列に、前記頭部制御対象物単位が前記価値関数により特定される行動に応じて移動した後の位置を追加してなる隊列を移動後の隊列Gbとして決定する移動先隊列決定用動作計画部と、
隊列Gaと隊列Gbとを入力として、前記目的位置単位の集合に含まれる各位置が前記隊列Gaをなす各制御対象物単位で充填されるまで、前記頭部制御対象物単位から前記尾部制御対象物単位まで順に隊列Ga内で隣接する制御対象物単位を移動させるように各制御対象物の動作を決定する各制御対象物動作用動作計画部と、
前記各制御対象物動作用動作計画部の結果に基づいて各制御対象物単位を移動させた後の位置の集合と前記目的位置の集合とが一致するまで、移動後の位置を新たに隊列Gaとして前記移動先隊列決定用動作計画部と前記各制御対象物動作用動作計画部とを繰り返し実行させる位置判定部と、を含み、
前記各制御対象物動作用動作計画部は、
前記隊列Gaにおける前記頭制御対象物単位中の位置のうち、前記頭部制御対象物単位の移動先の位置単位と隣接する位置以外の位置にボイドが発生するように前記各制御対象物を移動させ、
前記隊列Gaにおける前記尾部制御対象物単位に隣接する制御対象物単位内の各位置のうち、当該尾部制御対象物単位と隣接する位置が前記ボイドの位置とならないようにボイドの位置を定め、前記尾部制御対象物単位に含まれる各制御対象物を隊列Gb中の尾部制御対象物単位の位置へ移動させる
行動制御システム。
【請求項２】
請求項１の行動制御システムとしてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数の制御対象物の行動を制御する技術に関する。例えば、複数のロボットを、開始位置における隊列形成状態から協調して移動させ、障害物を回避させ、目標位置で隊列形成をさせるための各ロボットの行動計画を求めるロボット協調制御技術に関する。
【背景技術】
【０００２】
近年、多数の自律移動ロボットを効率的に制御にするための研究が活発に行われている。その任務内容は、人の入れない箇所の監視、物品の搬送などさまざまであるが、多数のロボットの協調動作による隊列形成を効率的に行わせるための技術が求められており盛んに研究が行われている（例えば、非特許文献１参照）。多数のロボットによる効率的な隊列形成を実現するには、それぞれのロボットの配置、動作順序などを事前に計画することが重要である。このような計画においては、当然ながら、複数のロボットが動作する実環境における障害物の存在や経路の形状なども十分に考慮しなければならない。
【０００３】
このような計画計算を行うための効果的な手法の一つとして、マルコフ決定過程における動的計画法や強化学習の手法があり、さまざまな研究が行われている（例えば、非特許文献２参照）。
【０００４】
また、ロボットの隊列制御の中でも、ロボット同士が互いに接したままの状態で、アメーバのように全体で移動を行うという仮定の下でのロボット隊列制御においては、ロボット同士の相対的な位置関係から、各ロボットの絶対位値の決定が可能であるという利点と、付加的な位置計測用の装備を必要としないという利点があり、そのようなロボットの研究もおこなわれている。例えば、非特許文献３に示すものでは任意の矩形形状隊列から他の矩形形状隊列までの隊列制御が示されている。
【０００５】
また、非特許文献４に示す研究に至る一連の研究や非特許文献５では、ある隊列から他の隊列に変化する隊列制御が示されている。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】M.Shimizu, A.Ishiguro, T.Kawakatsu, Y.Masubuchi, “Coherent Swarming from Local Interaction by Exploiting Molecular Dynamics and Stokesian Dynamics Methods”, Proceeaings of the 2003 IEE/RSJ International Conference on intelligent Robots and Systems, Las Veqas, pp.1614-1619, October 2003.
【非特許文献２】Y.Wang, C.W.de Silva, “Multi-Robot Box-pushing: Single-Agent Q-Learning vs. Team Q-Learning”, Proceedings of the 2006 IEEE/RSJ International Conference on Intelligent Robots and Systems, Beijing, China, pp.3694-3699, October 2006.
【非特許文献３】A.Becker, G.Habibi, J.Werfel, M.Rubenstein, and J.McLurkin, “Massive Uniform Manipulation: Controlling Large Populations of Simple Robots with a Common Input Signal”, Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems, Japan, pp.520-527, November, 2013.
【非特許文献４】Stanton Wong1 and Jennifer Walter ”Deterministic Distributed Algorithm for Self-Reconfiguration of Modular Robots from Arbitrary to Straight Chain Configurations”, Proceedings of the 2013 IEEE International Conference on Robotics and Automation (ICRA), Karlsruhe, Germany, pp.537-543, May 6-10, 2013.
【非特許文献５】Michael Rubenstein, Alejandro Cornejo, Radhika Nagpal, “Programmable self-assembly in a thousand-robot swarm”, SCIENCE, 2014, Vol. 345, Issue 6198, pp.795-799.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、非特許文献１の手法では、流体力学的な特性をロボット動作に組み込む手法を用いて群ロボットの動作を制御しており、低い計算負荷での制御を可能にしている利点があるが、任意の形状の隊列形成をすることができるとは限らない。
【０００８】
また、非特許文献２の手法のように、マルコフ決定過程における動的計画法や強化学習を使用してこのような計画を行おうとすると、単体のロボットを使用する場合に比べて複数のロボットを使用する場合には、その計算に要する時間や計算機の記憶容量がロボットの数に対して指数関数的に増大してしまう。その主たる原因となるのが、探索計算のためのマルコフ状態空間内の状態数の莫大な増加である。非特許文献２では、検証された強化学習の手法では、ロボット数の増加に伴い、指数関数的に計算負荷が増加するという、マルコフ状態空間内の爆発問題への解決策は示されていない。
【０００９】
また、非特許文献１，２の手法ともに、付加的な位置計測用の装備を必要とする。
【００１０】
また、非特許文献３では、各時刻でロボットに与えられる動作命令が皆同じ方向であるという条件を考慮しており、付加的な位置計測用の装備を必要としないが、その実現には障害物の存在を必要としている。また、一度の動作における各ロボットの移動誤差から発生する隊列の崩れの問題も解決できていない。
【００１１】
非特許文献４の手法においては、一度、線形隊列への変換をしなければならず、可能な隊列形成動作そのものへの制約が大きい。
【００１２】
非特許文献５の手法においては、開始隊列と目標隊列が共有する点がなければならないことや、障害物を考慮していないなどの問題点がある。
【００１３】
このような現状に鑑みて、本発明では、多数のロボットの存在を考慮しつつも、計画計算に必要な計算時間や計算機の記憶容量を少ないものに低減可能で、かつ、ロボット同士が接したままの状態を維持しつつ任意の開始位置における隊列形成状態から、他の任意の目標位置における隊列形成状態へ障害物のある環境にて変形動作を行うことを可能とする、ロボット協調隊列形成技術を提供することを目的とする。
【課題を解決するための手段】
【００１４】
上記の課題を解決するために、本発明の一態様によれば、行動制御システムは、M及びNをそれぞれ2以上の整数の何れかとし、pをM×N以上の整数の何れかとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に移動させるための行動制御を行う。行動制御システムは、第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、各開始位置及び各目標位置は、それぞれ第一方向〜第四方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、目標位置の集合及び開始位置の集合はそれぞれ一塊の任意の形状を成し、制御対象物は、当該制御対象物の２次元平面上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、及び、第四方向において隣接する第四位置とし、静止するか、または、二次元平面上の第一〜第四位置の何れかに移動するように制御されるものとし、p台の制御対象物は、M×N台毎に１つの制御対象物単位を構成し、１つの制御対象物単位を構成するM×N台の制御対象物はそれぞれ２つ以上の方向において当該制御対象物単位を構成する他の制御対象物と隣接し、目標位置の集合からN×N個の位置からなる位置単位からなる目標位置単位の集合を設定し、制御対象物単位がその制御対象物単位の現在の位置sにおいて各行動aを取ったときの適切さを表す１個の価値関数に基づいて制御され、静止するか、または、二次元平面上の第一〜第四方向の何れかのN×N個の位置からなる位置単位に移動するように制御されるものとし、価値関数が記憶される記憶部と、全ての目標位置単位の集合に制御対象物が存在しない場合、複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、開始位置の集合に配置されたp台の制御対象物を目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画部と、全ての目標位置単位の集合に制御対象物が存在しない場合、頭部制御対象物単位の位置にM×N台の制御対象物が位置するように各制御対象物の動作を制御する各制御対象物動作用動作計画部とを含み、全ての目標位置単位の集合に制御対象物が存在する場合に、各制御対象物動作用動作計画部は、目標位置単位の集合には含まれるが、目標位置の集合には含まれない位置に、各制御対象物が移動するように制御する。
【００１５】
上記の課題を解決するために、本発明の他の態様によれば、行動制御方法は、M及びNをそれぞれ2以上の整数の何れかとし、pをM×N以上の整数の何れかとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に移動させるための行動制御を行う。行動制御方法は、第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、各開始位置及び各目標位置は、それぞれ第一方向〜第四方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、目標位置の集合及び開始位置の集合はそれぞれ一塊の任意の形状を成し、制御対象物は、当該制御対象物の２次元平面上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、及び、第四方向において隣接する第四位置とし、静止するか、または、二次元平面上の第一〜第四位置の何れかに移動するように制御されるものとし、p台の制御対象物は、M×N台毎に１つの制御対象物単位を構成し、１つの制御対象物単位を構成するM×N台の制御対象物はそれぞれ２つ以上の方向において当該制御対象物単位を構成する他の制御対象物と隣接し、目標位置の集合からN×N個の位置からなる位置単位からなる目標位置単位の集合を設定し、制御対象物単位がその制御対象物単位の現在の位置sにおいて各行動aを取ったときの適切さを表す１個の価値関数に基づいて制御され、静止するか、または、二次元平面上の第一〜第四方向の何れかのN×N個の位置からなる位置単位に移動するように制御されるものとし、移動先隊列決定用動作計画部が、全ての目標位置単位の集合に制御対象物が存在しない場合、複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、開始位置の集合に配置されたp台の制御対象物を目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画ステップと、各制御対象物動作用動作計画部が、全ての目標位置単位の集合に制御対象物が存在しない場合、頭部制御対象物単位の位置にM×N台の制御対象物が位置するように各制御対象物の動作を制御するステップと、各制御対象物動作用動作計画部が、全ての目標位置単位の集合に制御対象物が存在する場合に、各制御対象物動作用動作計画ステップは、目標位置単位の集合には含まれるが、目標位置の集合には含まれない位置に、各制御対象物が移動するように制御するステップと、を含む。
【００１６】
上記の課題を解決するために、本発明の他の態様によれば、行動制御システムは、M,N,Qをそれぞれ2以上の整数の何れかとし、Rを24以上の整数の何れかとし、pをM×N×Q×Rとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に移動させるための行動制御を行う。行動制御システムは、第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置からなる一つの位置単位とし、各開始位置及び各目標位置は、それぞれ第一方向〜第六方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、目標位置の集合及び開始位置の集合はそれぞれR個の位置単位からなる一塊の任意の形状を成し、制御対象物は、当該制御対象物の３次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、３次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、p台の制御対象物は、M×N×Q台毎に１つの制御対象物単位を構成し、１つの制御対象物単位を構成するM×N×Q台の制御対象物はそれぞれ３つ以上の方向において当該制御対象物単位を構成する他の制御対象物と隣接し、制御対象物単位がその制御対象物単位の現在の位置単位において各行動を取ったときの適切さを表す１個の価値関数に基づいて制御され、静止するか、または、３次元空間上の第一〜第六方向の何れかのN×N×Q個の位置からなる位置単位に移動するように制御されるものとし、価値関数が記憶される記憶部と、複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、開始位置の集合に配置されたp台の制御対象物を目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画部と、頭部制御対象物単位の位置にM×N×Q台の制御対象物が位置するように各制御対象物の動作を制御する各制御対象物動作用動作計画部とを含み、価値関数は、ある位置単位から所定の入口位置を含む位置単位までのマンハッタン距離を用いて得られる。
【００１７】
上記の課題を解決するために、本発明の他の態様によれば、行動制御方法は、M,N,Qをそれぞれ2以上の整数の何れかとし、Rを24以上の整数の何れかとし、pをM×N×Q×Rとし、開始位置の集合に配置されたp台の制御対象物を所定の入口位置を含む目標位置の集合に移動させるための行動制御を行う。行動制御方法は、第一方向に対して平行でない方向を第二方向とし、第一方向に対して反対の方向を第三方向とし、第二方向に対して反対の方向を第四方向とし、第一方向と第二方向との成す平面に対して平行でない方向を第五方向とし、第五方向に対して反対の方向を第六方向とし、M×N×Q個の位置からなる一つの位置単位とし、各開始位置及び各目標位置は、それぞれ第一方向〜第六方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、目標位置の集合及び開始位置の集合はそれぞれR個の位置単位からなる一塊の任意の形状を成し、制御対象物は、当該制御対象物の３次元空間上の第一方向において隣接する第一位置、第二方向において隣接する第二位置、第三方向において隣接する第三位置、第四方向において隣接する第四位置とし、第五方向において隣接する第五位置とし、第六方向において隣接する第六位置とし、静止するか、または、３次元空間上の第一〜第六位置の何れかに移動するように制御されるものとし、p台の制御対象物は、M×N×Q台毎に１つの制御対象物単位を構成し、１つの制御対象物単位を構成するM×N×Q台の制御対象物はそれぞれ３つ以上の方向において当該制御対象物単位を構成する他の制御対象物と隣接し、制御対象物単位がその制御対象物単位の現在の位置単位において各行動を取ったときの適切さを表す１個の価値関数に基づいて制御され、静止するか、または、３次元空間上の第一〜第六方向の何れかのN×N×Q個の位置からなる位置単位に移動するように制御されるものとし、移動先隊列決定用動作計画部が、複数の制御対象物単位が成すある隊列をGaとし、複数の制御対象物単位が成す他の隊列をGbとし、隊列Gbに存在し隊列Gaに存在しない制御対象物単位を頭部制御対象物単位とし、開始位置の集合に配置されたp台の制御対象物を目標位置の集合に移動させる際に、頭部制御対象物単位が移動の先頭を務めるように、価値関数を用いてある時刻の隊列Gaに対して隊列Gbを決定する移動先隊列決定用動作計画ステップと、各制御対象物動作用動作計画部が、頭部制御対象物単位の位置にM×N×Q台の制御対象物が位置するように各制御対象物の動作を制御する各制御対象物動作用動作計画ステップとを含み、価値関数は、ある位置単位から所定の入口位置を含む位置単位までのマンハッタン距離を用いて得られる。
【発明の効果】
【００１８】
本発明に拠れば、多数のロボットの存在を考慮しつつも、計画計算に必要な計算時間や計算機の記憶容量を少ないものに低減可能で、かつ、ロボット同士が接したままの状態を維持しつつ任意の開始位置における隊列形成状態から、他の任意の目標位置における隊列形成状態へ障害物のある環境にて変形動作を行うことを可能とする。
【図面の簡単な説明】
【００１９】
【図１】ロボットの移動を説明するための図。
【図２】多数のロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図。
【図３】ロボットの移動を説明するための図。
【図４】尾部ロボット及び頭部ロボットを説明するための図。
【図５】頭部ロボットの位置にいた一つのボイドが、尾部ロボットの位置に移動していく様子を示す図。
【図６】ロボット単位を説明するための図。
【図７】目標隊列エリアG及び目標隊列エリア単位GUを説明するための図。
【図８】多数の不変型ロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図。
【図９】隊列Ga及び隊列Gbを説明するための図。
【図１０】隊列Ga及び隊列Gbを説明するための図。
【図１１】図１１Ａは各ロボット動作決定用動作計画のモード１を説明するための図、図１１Ｂは各ロボット動作決定用動作計画のモード１を説明するための図。
【図１２】図１２Ａは各ロボット動作決定用動作計画のモード１を説明するための図、図１２Ｂは各ロボット動作決定用動作計画のモード１を説明するための図。
【図１３】図１３Ａは各ロボット動作決定用動作計画のモード１を説明するための図、図１３Ｂは各ロボット動作決定用動作計画のモード１を説明するための図。
【図１４】図１４Ａは各ロボット動作決定用動作計画のモード１を説明するための図、図１４Ｂは各ロボット動作決定用動作計画のモード１を説明するための図。
【図１５】各ロボット動作決定用動作計画のモード１を説明するための図。
【図１６】ロボット序列計算処理Robot_Joretu_Decisionを説明するための図。
【図１７】多数の不変型ロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図。
【図１８】多数の不変型ロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図。
【図１９】多数の不変型ロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図であって、目標エリア単位GUが充填された状態を示す図。
【図２０】条件１を説明するための図。
【図２１】多数の不変型ロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図。
【図２２】多数の不変型ロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図であって、目標エリアGが充填された状態を示す図。。
【図２３】第一実施形態に係る行動制御システムの機能ブロック図。
【図２４】第一実施形態に係る行動制御システムの処理フローの例を示す図。
【図２５】各格子が菱形での場合の例を示す図。
【図２６】ロボットの移動を説明するための図。
【図２７】図２７Ａは開始位置の集合を説明するための図、図２７Ｂは目標位置の集合を説明するための図。
【図２８】尾部ロボット及び頭部ロボットを説明するための図。
【図２９】頭部ロボットの位置にいた一つのボイドが、尾部ロボットの位置に移動していく様子を示す図。
【図３０】ロボット単位を説明するための図。
【図３１】ボイド移動制御を説明するための図。
【図３２】第二実施形態に係る行動制御システムの機能ブロック図。
【図３３】第二実施形態に係る行動制御システムの処理フローの例を示す図。
【図３４】多数のロボットが協調して開始位置における隊列形成状態から移動を行い、目標位置での隊列形成を行う任務を説明するための図。
【発明を実施するための形態】
【００２０】
以下、本発明の実施形態について説明する。なお、以下の説明に用いる図面では、同じ機能を持つ構成部や同じ処理を行うステップには同一の符号を記し、重複説明を省略する。
【００２１】
＜第一実施形態＞
まず、行動制御システム及び方法の理論的背景について説明する。以下、行動制御の対象である制御対象物が、ロボットである場合を例に挙げて説明するが、制御対象物は、制御の対象となり得るものであれば、ロボット以外であってもよい。
【００２２】
[問題設定]
多数のロボットが協調して開始位置における隊列形成状態から、各ロボットが接した状態を維持しつつ移動を行い、目標位置での隊列形成を行う任務は、例えば図１に例示するような、互いに接する辺同志をスライドさせて移動していくことが可能な正方形型のロボットの使用を想定し、図２に示すように、壁で区切られた部屋においての開始位置から目標位置まで複数のロボットの移動によって実現するものである。
【００２３】
ロボットについては、例えば図１に示すように、ロボットの周囲上下左右４マスのうち一つに他のロボットが存在している状態を維持しながら移動をするものとする。この手法では１つのロボット自身が、一台のロボットのサイズ分の距離を移動することで、一回の動作の移動量を正確に測ることができるというメリットがある。また、一つの辺を共有する隣り合うロボットとの相対的な位置を計測しあうことで、ロボットの群れ全体の中での各ロボットの位置も容易に知ることができる。このため、ロボットの移動量の誤差によって、隊列が崩れるといった問題を起こしにくい。また、図３のように、複数のロボットを連結したように、同時に複数のロボットを移動させていくことが可能である。図３では、隊列Aから隊列Bに変形する際に、及び、隊列Dから隊列Eに変形する際に二台のロボットが連結したように同時に移動する。なお、ロボットは、隣の位置に他のロボットが存在しているか否か、障害物があるか否か、そして、自身が目標位置上にいるかどうかを知ることができるものとする。例えば、何れのロボットもロボットの周囲のマスに存在する他のロボットと通信できるものとし、少なくとも一台のロボットがGPSを備えるか、または、少なくとも１台のロボットが一回の行動制御において移動しない場合、GPSを備えるロボットや移動しなかったロボットを基準として、隣接するロボットと通信することで、各ロボットは自身の絶対的な位置を容易に知ることができる。もしくは、少なくとも一台のロボットの絶対位置が開始位置にて既知であるならば、それを使用してGPSなしでも、各時刻の各ロボットの絶対位置を知ることが出来る。
【００２４】
任務を行うロボットは、p台（pは2以上の整数の何れかであり、例えばp≧50）であり、各ロボットは、隣接するロボットと一辺以上を共有しつつ、二次元平面におけるX-Y軸方向（この例では、図面の紙面上下左右の四方向）に移動可能とする。ただし、p台のロボットで１つの群れを成すものとする。各格子にはロボットは一台しか存在することができない。それぞれのロボットは、移動しようとする方向に障害物か他のロボットがある場合には、静止をするものと仮定する。図２において、Rが記載された格子はロボットが存在する位置を示し、Oが記載された格子は障害物が存在する位置を示す。また、太線の破線で囲まれた領域は開始位置の集合を示し、太線の一点鎖線で囲まれた領域は目標位置の集合Gで表される領域（以下、この領域のことを「目標隊列エリアG」ともいう）を示し、太線の実線で囲まれた領域は後述する目標隊列エリアGの入口位置Peを示す。このように、各開始位置及び各目標位置は、それぞれ上下左右方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、ロボットの開始位置及び目標位置での隊列形状はそれぞれ一塊の任意の形状である。
【００２５】
[ロボットの座標設定]
それぞれのロボットi（iはロボット番号を表すi=0,1,2,3,,,p-1）の初期位置(開始位置)を（Xr0[i],Yr0[i]）とし、目標位置を（Xre[i],Yre[i]）とするとき、本問題は、開始位置に配置されたロボットが、目標位置まで移動するための行動計画を求めることと定義できる。
【００２６】
[任務空間の定義]
このような問題に対して単純にマルコフ状態遷移モデルを適用しようとする場合、マルコフ状態空間は、iをロボット番号としたとき、ロボットiの位置（Xr[i],Yr[i]）、ロボットiの行動aによって構成される。各状態（ロボットの位置と行動）は離散値で表現される。部屋をX,Yの直交座標系からなる２次元平面で表すと、X軸、Y軸をそれぞれ離散化表現した値により各位置を表現する。つまり、図２のように部屋（２次元平面）は格子で区切られ、各格子が各位置に対応する。また、各格子において、障害物の「ある／なし」が予め設定されている。
【００２７】
[ロボット動作の定義]
また、行動主体は部屋に配置されている各ロボットとなる。ロボットiの行動a[i]は、静止、上下左右方向への１格子分の移動の計５種類のうちのいずれかを取る。例えば、a[i]∈{0,1,2,3,4}として、
0: 静止
1: 二次元平面上でX座標値が増える方向（図2で右方向）に１格子だけ移動する
2: 二次元平面上でY座標値が増える方向（図2で下方向）に１格子だけ移動する
3: 二次元平面上でX座標値が減る方向（図2で左方向）に１格子だけ移動する
4: 二次元平面上でY座標値が減る方向（図2で上方向）に１格子だけ移動する
とする。
【００２８】
[探索計算上の問題点]
このような任務環境におけるマルコフ状態空間は、ロボット数×2の次元数の状態を持ち、かつ選択可能な行動数は、ロボットの行動（＝５通り）のロボット数乗だけ存在する。例えば、ロボット数が５０で、部屋の縦横方向の格子数がそれぞれ２０であるとすれば状態数は２０の100乗個にもなり、探索計算に要する資源の量は膨大なものとなる。さらにロボット数が１台増えるごとに、その状態数は400倍増加していくことになる。
【００２９】
[問題設定]の項で説明したように、ロボット同士が接しているという拘束条件を取り入れても、根本的な計算量の削減は難しく、複数のロボットを使用する場合の大きな問題となっている。
【００３０】
具体的には、例えば、多数のロボットを複数の目標位置に誘導する問題においては、一台のロボットがある位置へ至るための経路を探索計算により求めることができるとしても、各ロボットにどの目標位置を割り振るかが大きな問題となる。この目標位置の割り振りがうまくいかなければ、早めに目標位置内に到達したロボットが、後から来るロボットの移動を邪魔するような位置に居座ってしまい、全体でのロボットの隊列形成を困難にしてしまう。そのようなことを避けるための各ロボットへの目標位置への割り振り方を探索により計算することを考えた場合、ロボットの台数の階乗分だけの目標位置への割り振り方が存在するため、計算にかかる負荷はロボットの台数とともに劇的に増加する。
【００３１】
また、ロボットが互いに一辺を共有しつつ移動を行うための探索計算について考えた場合の探索計算も、各ロボットのお互いの移動を考慮したうえで行うために、必要な計算量はロボットの台数に対して指数関数的に増えてしまう。
【００３２】
[二つの動作計画の導入]
そこで本実施形態では、これらの計算負荷の問題を解決するための方策の一つとして、ロボットの動作決定における探索計算を二つに分けることとする。ここでそのための準備として、ある隊列Gaをなしているロボットが、次になすべき隊列の形状としてGbを考える。隊列Gaと隊列Gbの間には、隊列Gaにて存在し、隊列Gbにて存在しない位置にあるロボットと、隊列Gbにて存在し隊列Gaにて存在しない位置にあるロボットがある（図４参照）。前者を尾部ロボットとし、後者を頭部ロボットとする。本実施形態では、ちょうど、頭部ロボットの位置にあるロボットが、ロボット群の移動において先頭を務め、尾部ロボットが、移動の最後尾を務めるロボットになるように、隊列Gaと隊列Gbとを定義する。
【００３３】
この定義の元、一つ目の探索計算は、隊列Gaをなすロボットの群が、障害物を回避しつつも、目標位置まで移動するためには、次の隊列Gbとしてどの隊列を選択すればよいかを決定するための動作計画計算（以下「移動先隊列決定用動作計画」ともいう）である。この探索計算は、事実上、頭部ロボット位置に移動するロボットとして、隊列Gaのどのロボットを選択するかと、隊列Gaにおける尾部ロボットを決定するための計算である。
【００３４】
二つ目の探索計算は、ロボットが互いに接した位置関係を維持しつつも、隊列Gaから隊列Gbへの変形する際の各ロボットの動作を決定するための動作計画計算（以下「各ロボット動作用動作計画」ともいう）である。これは、事実上、移動先隊列決定用動作計画により決定済みの頭部ロボット及び尾部ロボットに対し、尾部ロボットの位置からロボットを追い出し、隊列Gbにおける頭部ロボットの位置へのロボット誘導のための探索計算である。
【００３５】
前者、後者ともに動的計画法を使用した探索計算を使用するが、ここでは、前者の頭部ロボットの決定のための探索計算ではマルコフ決定過程における動的計画法を利用する。また、前者の尾部ロボットの決定と、後者の探索計算ではロボット同士の隣接関係の情報を使用したダイクストラ法等の動的計画法を使用する。なお、前者の頭部ロボットを決定する際に用いる価値関数Q(s,a)（詳細は後述する）の計算は、ロボットの群れが開始位置からの移動を開始する前にあらかじめ行い、価値関数Q(s,a)を用いた実際の前者の頭部ロボットの決定ロボット移動中の実時間で行う。また、後者の探索計算とそれを使用した尾部ロボットの決定も、ロボット移動中の実時間で行う。
【００３６】
[2種類のボイド制御]
これらの二つの探索計算の計算負荷の軽減のため、本実施形態では、ボイド制御の考え方を導入する。まず、ここでいうボイドとは、あるロボットが別の位置に移動した後に、元いた位置にできる空隙のことである。別の言い方をすると、ボイドとは、ロボットの移動する方向と反対の方向に移動する仮想的な存在である。こうした群ロボットの隊列形成問題においては、複数のロボットの動作に着目するがゆえに、その探索計算量が爆発してしまうが、視点を変えて、ボイドの動きに着目すれば、多数のロボットの動作計画の問題を単一のボイドの動作計画として考えることができる。そのため、ボイド制御の考え方を導入することは、群ロボットの隊列形成問題における探索計算負荷の軽減に適している。
【００３７】
まず、移動先隊列決定用動作計画において、ロボット群の移動の先頭を務める頭部ロボットの動作について考える。本実施形態では、目標隊列エリアGに一か所の入口位置Peを設けて、他の位置からは頭部ロボットが目標隊列エリアGに入ることはできないこととする。また、一度目標隊列エリアG内に入った全てのロボットは、二度と目標隊列エリアG外には出られないこととする。この条件のもと、目標隊列エリアG外にいる頭部ロボットがPeに至るまでのロボットの経路決定問題は、一台のロボットを入口位置Peまで誘導するための探索問題を解けばよく、得られた解を頭部ロボットの選択と誘導のために使用すればよい。目標隊列エリアG内の頭部ロボットの動作については、ボイドの動きに着目して、ボイドの誘導について同様のことを行う。すなわち、目標隊列エリアG内の頭部ロボットに望まれる動作とは、適切に頭部ロボットが入口位置Peから遠ざかり、目標隊列エリアG内の各場所に散らばっていきつつ目標隊列エリアGを埋めていくことである。これをボイドの動きとしてみれば、ロボットが入口位置Peから、目標隊列エリアG内に入るたびに、ボイドはそれに伴って、入口位置Peから目標隊列エリアGの外に出ていくのである。このとき、目標隊列エリアG内のボイドは、すべて一点の入口位置Peに向かって移動していくのが理想的な動作である。つまり、目標隊列エリアG内の頭部ロボットを目標隊列エリアGに適切に散らばるように誘導するためには、目標隊列エリアG内に位置する各ボイドが入口位置Peに至るための経路を探索計算すればよく、そうして求められたボイドの動作を頭部ロボットを動かすことで実現するようにすればよい。この考え方ならば、すべての位置にあるロボットが入口位置Peを目指して動作するための動作計画（価値関数Q(s,a)の計算）を一回行えばよいので、計算負荷が劇的に少なくなる。
【００３８】
続いて、隊列Gaを維持しているロボット群が、隊列Gbに変形することを考える。このとき、ロボット群が隊列Gaから隊列Gbに変形する動作とは、頭部ロボットの位置にいた一つのボイドが、尾部ロボットの位置に移動していくプロセスとしてとらえることができる（図４及び図５参照）。このようなボイドの動作は、頭部ロボットの位置をスタート位置とし、尾部ロボットの位置をゴール位置とした、一つのボイドの動作計画によって計算可能であり、計算負荷も小さい。この計算において考慮すべきボイドの移動の拘束条件としては、ボイドが移動する際に、ロボットが存在する位置をたどっていくという制限を設けるだけでよい。
【００３９】
[4マスロボット単位の導入]
さらに、本実施形態では、図６に示すように、田の字状に隣接した4つのロボットを一つの単位とし（以下、「ロボット単位」ともいう）、ロボットは、この田の字型のロボット単位を維持しつつ移動を行うこととする。言い換えると、四台毎に１つのロボット単位を構成し、１つのロボット単位を構成する四台のロボットはそれぞれ２つの方向において１つのロボット単位を構成する他のロボットと隣接した状態を維持しつつ移動を行う。このロボット単位の集団は、互いにロボット単位ごとに一辺を共有し、接しながら移動をするように制御される。
【００４０】
このような４つのロボットを一つの単位とした移動を行う理由としては、このような状態で移動を行う限り、ロボットの群れの中のいずれのロボットが一台欠けても、各ロボットはお互いに一つの辺で接しあう位置関係を崩さずに済むからである。すなわちこれは、各ロボット動作用動作計画において、ロボット同士の接続を考慮するための計算負荷を軽減することにつながるからである。
【００４１】
すなわち、先に述べた移動先隊列決定用動作計画は、4台のロボットがなすロボット単位がなす群れの移動について行う。先に述べた頭部ロボット、尾部ロボットは、それぞれ4台のロボットで構成される頭部ロボット単位、尾部ロボット単位となる。各ロボット動作用動作計画は、頭部ロボット単位に含まれる４つのロボット位置に、ロボットを誘導し、尾部ロボット単位位置に含まれるロボットから、４つのロボットを追い払うための動作を探索計算する。
【００４２】
ここでは4台のロボットがなすロボット単位に対応する四つのマスが一つのマスの単位（以下「マス単位」ともいう）であるとし、一つのマス単位を一状態として状態空間を組む。言い換えると、ロボット単位の位置を（Xr_unit[j],Yr_unit[j]）（j=0,1,2,…j_max-1）としたとき、そのロボット単位に所属するロボットをi1,i2,i3,i4とすれば、
Xr[i1] = 2 ×Xr_unit[j] 
Yr[i1] = 2 ×Yr_unit[j] 
Xr[i2] = 2 ×Xr_unit[j] + 1
Yr[i2] = 2 ×Yr_unit[j] 
Xr[i3] = 2 ×Xr_unit[j]
Yr[i3] = 2 ×Yr_unit[j] + 1
Xr[i4] = 2 ×Xr_unit[j] + 1
Yr[i4] = 2 ×Yr_unit[j] + 1
である。なお、ロボットの全体数pが、4の倍数でない場合には、端数のロボットが存在することになるが、それらのロボットは、皆、移動先隊列決定用動作計画においては切り捨てられ（存在しないものとして扱い）、各ロボット動作用動作計画においては、尾部ロボット単位のメンバとして扱われる。
【００４３】
ロボット単位の頭部ロボット決定用の目標位置の集合をGU（以下「目標隊列エリア単位GU」ともいう）とする。目標隊列エリア単位GUは、ロボット単位と同様に4つのロボット位置が一単位となったマス単位で構成され、図７、図８で示すように、目標隊列エリア単位GUを構成するマスが、目標隊列エリアGをはみ出さないように設定される。このとき、目標隊列エリアGに属するが目標隊列エリア単位GUに属さないロボット目標位置（4マスを構成できない端数のロボット目標位置）が存在する場合がある。なお、目標隊列エリアGは以下の２つの条件を満たすことを前提とする。(1)目標隊列エリアGが目標隊列エリア単位GUから飛び出している部分は目標隊列エリア単位GUに隣接するマス単位に含まれるものとする（図７参照）。(2)目標隊列エリアGが目標隊列エリア単位GUから飛び出している部分は、かぎ型のように飛び出したL字型とはならないものとする（図７参照）。このように、目標隊列エリアG及び目標隊列エリア単位GUを設定するため、移動先隊列決定用動作計画にて使用するロボット単位の総数は、目標隊列エリア単位GU内のロボット単位の数と同じかそれ以上となる。よって、目標隊列エリアGに属するが目標隊列エリア単位GUに属さないロボット目標位置の個数が４を超えることは起こりうるが、本実施形態はそのような場合でも使用可能である。すべての目標隊列エリア単位GU内にロボットが満たされたら、移動先隊列決定用動作計画はそれ以降は行わない。それ以降は、各ロボット動作決定用動作計画によって、目標隊列エリア単位GUに属さないが目標隊列エリアGに属する目標位置へロボットを埋めるための動作が計算される。
【００４４】
[移動先隊列決定用動作計画のためのMDP状態空間]
移動先隊列決定用動作計画での探索計算用のマルコフ状態空間を、一つのロボット単位の状態変数のみで構成することにする。すなわち、
状態変数s=（Xr_unit,Yr_unit），行動変数a∈{0,1,2,3,4}
である。頭部ロボット単位の選択と誘導は、この状態変数を引数とした一つの価値関数Q(s,a)を使用して行動決定を行う。価値関数Q（s,ａ）の計算は、動的計画法を使用して、任務の事前に行うものとする。入口位置Peを含む入口位置単位をPeUとし（図８参照）、動的計画法にて計算を行う際に、報酬の値は、入口位置単位PeUに頭部ロボット単位が移動した場合において高報酬値１が与えられ、その他は０の報酬が与えられる。
【００４５】
すなわち、価値関数Q（s,ａ）を計算するために必要なマルコフ状態空間での状態遷移確率と報酬値の設定は、行動aにより、状態がsからｓ'に移動したとして、その遷移確率をP(s'|s,a)とすると、例えば、設定方法の一例として
(1)sが障害物でなく、s'が行動aの行先のマス単位のとき、
P(s'|s,a)←1
(2)sが障害物でなく、s'が行動aの行先のマス単位でないとき、
P(s'|s,a)←0
(3)sが障害物のときで、s'=sのとき、
P(s'|s,a)←1
(4)sが障害物のときで、s'=sではないとき、
P(s'|s,a)←0
のように設定される。なお、マス単位の中に1つでも障害物が含まれる場合には、そのロボット単位の状態sを障害物とする。報酬Rについては、
If s'= PeUthen R(s',s, a)  ← r_plus
Else If  (sがGU内かつｓ'がGU外) then  R(s',s, a)  ← -r_minus
Else If  (sがGU外かつｓ'がGU内でかつs'=PeUでない) then  R(s',s, a)  ← -r_minus
Else R(s',s, a)  ← 0
である。r_minusとr_plusはともに正値だが、r_minus > 10 × r_plusとするのが望ましい。頭部ロボット単位が障害物には入れず、また、入口位置単位PeU以外から目標隊列エリア単位GUに入れず、目標隊列エリア単位GU内からは出られないという条件が記述できていれば、遷移確率と報酬の設定方法はこの限りではない。すべてのマス単位にあるロボット単位が入口位置単位PeUを目指して動作するための動作計画（価値関数Q(s,a)の計算）を一回行えばよいので、前述の通り、計算負荷が劇的に少なくなる。また、マス単位の個数は、マスの個数の4分の1となるため、状態の個数が減り計算負荷が少なくなる。
【００４６】
通常は、各状態sにある頭部ロボット単位が、Q（s,a）を使用して行動選択を行う場合は、各状態sにおいて、価値関数Q（s,ａ）の値を最大にする行動aを選択するが、以上に提示した条件設定で、価値関数Q（s,ａ）を計算した場合、目標隊列エリア単位GU外にいる頭部ロボット単位も目標隊列エリア単位GU内にいる頭部ロボット単位もともに、入口位置単位PeUを目指して移動することになる。そこで、本実施形態では以下のルールにより行動選択を行うものとする。この行動方策を行動方策Policy_Gとする。
【００４７】
（行動方策Policy_G）
(1)ｓがGU内のとき、頭部ロボット単位は、他のロボット単位の位置や障害物位置に移動しない行動であって、かつ、GU外に出ていかない行動であり、かつ、Q(s,a)<Q(s,0)を満たす行動aの中でQ(s,a)を最小化する行動を選択する。そのような行動がない場合は行動a=0（静止）を選択する。
(2)ｓがGU外のとき、頭部ロボット単位は、他のロボットの位置や障害物位置に移動しない行動であって、かつ、Q(s,a) > Q(s,0)を満たす行動aの中でQ(s,a)を最大化する行動を選択する。そのような行動がない場合は行動a=0（静止）を選択する。
【００４８】
このようにすることで、一度、(1)によりGU内に入った頭部ロボット単位は、入口位置単位PeUからなるべく離れた（遠い他の）GU内の位置に移動する。一方、(2)により、GU外の頭部ロボット単位は、入口位置単位PeUに向かって移動し、入口位置単位PeUよりGU内に入ろうとする行動をとるようにできる。また、他のロボットや障害物との衝突も避けることができる。なお(1)において、条件を満たす行動aが二つ以上存在するとき、その行動aにより移動した先のロボット単位が移動元ロボット単位以外のロボット単位と接していないならば、そのようなロボット単位に移動する行動aを優先出力する。
【００４９】
（頭部決定処理Head_Robot_Decision）
以上の価値関数Q（s,ａ）、行動方策Policy_Gを用いて、ある隊列Gaをなすロボット単位の群が、つぎに移動すべき隊列Gbの頭部ロボット単位を決定する方法は以下のとおりである。なお、本処理を、頭部決定処理Head_Robot_Decisionともいう。
(1)GU内の各ロボット単位jについて、ロボット単位jの位置sにおける全行動aの中でのQ(s,a)の最小値Qmin(j)を計算する。
(2)GU内の各ロボット単位jについて、Qmin(j)の値が小さい順に順位付けを行う。
(3)GU外の各ロボット単位jについて、ロボット単位jの位置sにおける全行動aの中でのQ(s,a)の最大値Qmax(j)を計算する。
(4)GU外の各ロボット単位jについて、Qmax(j)の値が大きい順に順位付けを行う。
(5)GU外の各ロボット単位jの順位値にGU内にあるロボット単位数を加算する。
(6)変数head_num←0とする。
(7)  (6)までで計算した順位値の第head_num位の、ロボット単位jを選択し、j_head←jとする。ロボット単位j_headの行動a_headを行動方策Policy_Gにより計算する。a_head=0でない場合、ロボット単位j_headを頭部ロボット単位位置に移動するロボット単位として選択する。ロボット単位j_headを行動a_headによって移動させた先の位置を、頭部ロボット単位位置とし、頭部ロボット単位をj_newとする。a_head=0のとき、head_numをインクリメントし、(7)を繰り返す。
【００５０】
以上の処理では、GU外にしかロボット単位が存在しないときになるべくPeUに近いロボット単位か、もしくは、GU内にロボット単位が存在するときには、なるべくQ_min(j)の値の小さいロボット単位のうちで、行動方策Policy_Gにより選択される行動が静止ではないものを頭部ロボット単位として選んでいる。
【００５１】
（ロボット単位群内序列決定処理Unit_Joretu_Decision）
続いて、尾部ロボット単位位置を決定するための手法を述べる。まず、各ロボット単位が、頭部ロボット単位からどれだけの距離離れているかを計算する。この計算はダイクストラ法などの動的計画法で計算可能であるが、本実施形態で使用する方法を一例として以下に述べる。なお、本処理をロボット単位群内序列決定処理Unit_Joretu_Decisionともいう。
(1)各ロボット単位にて、上下左右４方向に隣接するロボット単位の番号を調べる。ロボット単位jの行動aの移動方向にロボット単位j_nextが隣接して存在する場合、next_u[a][j]変数の値をj_nextに設定する（next_u[a][j]←j_next）。ロボットが存在しないときは、next_u[a][j]変数の値をj_maxに設定する（next_u[a][j]←j_max）。ただし、j_maxはロボット単位の個数である。
(2)状態空間内（Xr_unit,Yr_unit）の各位置の序列変数値Joretu[Xr_unit][Yr_unit]の値をj_maxに初期化する(Joretu[Xr_unit][Yr_unit]←j_max)。
(3)ロボット単位j_headの位置の序列変数値Joretu[Xr_unit[j_head]][Yr_unit[j_head]]の値をj_minに初期化する（Joretu[Xr_unit[j_head]][Yr_unit[j_head]]←j_min）。ただし、j_minの値は、例えば、j_min=0とする。
(4)ロボット単位j_head以外の、各ロボット単位jの、全行動aについて、next_u[a][j]の値がj_maxではない場合の、Joretu[Xr_unit[next_u[a][j]]][Yr_unit[next_u[a][j]]]の値を調べ、その最小値に１を加えた値が、現在のJoretu[Xr_unit[j]][Yr_unit[j]]よりも小さい場合は、その値をJoretu[Xr_unit[j]][Yr_unit[j]]に代入する(Joretu[Xr_unit[j]][Yr_unit[j]] ←Joretu[Xr_unit[next_u[a][j]]][Yr_unit[next_u[a][j]]]+1)。
(5)  (4)の処理にて、Joretu値の更新がなくなるまで、(4)を繰り返す。この処理により、ロボット単位j_headから離れた位置にあるロボット単位jの序列変数値Joretu[Xr_unit[j]][Yr_unit[j]]ほど大きな値となるように更新される（図９参照）。なお、図９の丸括弧内の数値は序列変数値Joretu[Xr_unit[j]][Yr_unit[j]]を表す。
【００５２】
（尾部ロボット決定処理Tail_robot_Decision）
以上の、ロボット単位群内序列決定処理Joretu_Decisionが済んだうえで、Joretu[Xr_unit[j]][Yr_unit[j]]が最大となる位置にあるロボット単位を尾部ロボット単位j_tailとする。なお、尾部ロボット単位を決定する処理を尾部ロボット決定処理Tail_robot_Decisionともいう。以上の処理では、頭部ロボット単位からもっとも離れたロボット単位を尾部ロボット単位として設定している。
【００５３】
（移動先隊列決定用動作計画処理Next_Formation_Decision）
以上の処理をまとめて、以下のように、移動先隊列決定用動作計画処理Next_Formation_Decisionが行われる。
(1)頭部決定処理Head_Robot_Decisionを行う。
(2)ロボット単位群内序列決定処理Unit_Joretu_Decisionを行う。
(3)尾部ロボット決定処理Tail_robot_Decisionを行う。
(4)ロボット単位j_headが行動a_headを行った後の、移動後の位置に新たな頭部ロボット単位j_newを設定し、(3)にて、尾部ロボット単位位置が特定できたので、現在の隊列Gaから尾部ロボット位置j_tailのロボット単位を削除し、隊列Gaに頭部ロボット単位j_newを追加し、隊列Gbとする（図９参照）。
【００５４】
[簡略化された移動先隊列決定用動作計画処理]
なお、移動先隊列決定用動作計画処理Next_Formation_Decisionは、以下のように簡略化してもよい。
(1)現時点で、４つのロボットが収まっているロボット単位位置を特定し、隊列Gaのロボット単位の要素として設定する。
(2)頭部決定処理Head_Robot_Decisionを行う。
(3)ロボット単位j_headが行動a_headを行った後の、移動後の位置に新たな頭部ロボット単位j_newを設定し、頭部ロボット単位j_newとロボット単位j_headとからなるロボット単位隊列を、隊列Gbとする（図１０参照）。なお、隊列Gbに含まれれないロボットの群れを尾部ロボット群G_tailという。この時点では、尾部ロボット群G_tailに含まれるどのロボットが削除されるかは決定していない。
【００５５】
後述する各ロボット動作決定用動作計画においては、ロボット単位j_headと頭部ロボット単位j_new以外は、直接計算に使用されないので、省いて構わない。その代り、簡略化された移動先隊列決定用動作計画処理における(1)の処理にて、毎回、4つのロボットで埋まっているロボット単位の特定を行う。
【００５６】
[各ロボット動作決定用動作計画]
移動先隊列決定用動作計画においてロボット単位j_headと頭部ロボット単位j_newが決定され、次の隊列Gbが決定されたので、現隊列Gaから次隊列Gbへの移動を各ロボットの移動によって実現するための探索計算を各ロボット動作決定用動作計画にて行う。
【００５７】
まず、各ロボット動作決定用動作計画においては、隊列Gb内のどのロボット単位にも属さない端数のロボットを特定し、それらを尾部ロボット群G_tailに属するロボットとする（図１０参照）。
【００５８】
本実施形態では、4つのロボットを組にしたロボット単位を維持しつつロボット群が移動を行うようにしているので、ボイド制御を行う際の、各ロボットの接続維持を考える際には、尾部ロボット単位j_tail(前述の通り、各ロボット動作決定用動作計画における尾部ロボット単位は、何れのロボット単位にも属さない端数のロボットをメンバとする)と頭部ロボット単位j_new付近でのボイドの動きにさえ気を配れば、それ以外は、ボイドがロボット群内のどの位置にあるかを考慮する必要はない。
【００５９】
各ロボット動作決定用動作計画においては、以下の２つのモードが存在する。
モード１：GUがロボットで満たされていない場合。
モード２：GUがロボットで満たされている場合。
（モード１）
まず、モード１のGUがロボットで満たされていない場合の各ロボット動作決定用動作計画の動作について述べる。
【００６０】
まず、ロボット単位j_headに所属するロボットのうち、頭部ロボット単位j_newに接した位置にある２つのロボットをロボットi_move_11,i_move_21とし(図１１参照)、ロボットi_move_11,i_move_21と行動a_headの移動方向の逆方向に接しているロボットをそれぞれ、ロボットi_move_12,i_move_22とする。頭部ロボット単位j_newに所属し、かつ、ロボットi_move_11,i_move21に、行動a_headの方向で接するロボットがある場合は、そのロボットをそれぞれi_move_101,i_move_201とし, ロボットi_move_101,i_move201の位置に、行動a_headの方向で接する位置にロボットがある場合は、そのロボットをそれぞれi_move_102,i_move_202とする。モード１の動作は、以下の手順で行われる。
【００６１】
（手順１）  ロボットi_move_101,i_move102の両方が存在する場合は（図１１参照、なお、図１１においては破線で示したロボットi_move_101,i_move_102が存在する場合）、手順７へ。その他の場合で、ロボットi_move_101が存在する場合は（図１２Ａ参照）、ロボットi_move_11とロボットi_move12とロボットi_move101をa_head方向に移動する（図１２Ｂ参照）。その他の場合で、ロボットi_move_101が存在しない場合は（図１３Ａ）、ロボットi_move_11とロボットi_move12をa_head方向に移動する（図１３Ｂ）。
【００６２】
（手順２）  手順１で生じたボイド（ロボットi_move12の元あった位置）を位置void_endとする（図１２Ｂ、図１３Ｂ参照）。
【００６３】
（手順３）  位置void_endを、ロボットi_move_11とロボットi_move12以外のロボットで埋めていくことで、尾部ロボット群G_tailに所属するロボットのうち、もっとも位置void_endから離れた位置のロボットを現在位置より、1マス分位置void_endに近づける。例えば、図１３Ｂから図１４Ａに遷移する。
【００６４】
（手順４）  ロボットi_move_101かロボットi_move_102が存在する場合は（図１２、図１３参照、なお、図１３においては破線で示したロボットi_move_102が存在する場合）、手順７へ。どちらも存在しない場合は（図１４Ａ参照）、ロボットi_move_11とロボットi_move12と、「ロボットi_move12に、行動a_headの移動方向と逆の方向で接するロボット」を、a_head方向に移動する（図１４Ｂ参照）。
【００６５】
（手順５）  手順４で生じたボイド（手順１実行前にロボットi_move12の元あった位置）を、位置void_endとする。
【００６６】
（手順６）  位置void_endを、ロボットi_move_11とロボットi_move12以外のロボットで埋めていくことで、尾部ロボット群G_tailに所属するロボットのうち、もっとも位置void_endから離れた位置のロボットを現在位置より、1マス分位置void_endに近づける。
【００６７】
以上、手順１から手順６により、頭部ロボット単位j_newの下側のマスをロボットで埋める。同様の処理を、手順７から手順１２で行い、頭部ロボット単位j_newの上側のマスをロボットで埋める。頭部ロボット単位j_newの上側のマスにおいて同様の処理を行えばよいため、図を省略する。
【００６８】
（手順７）  ロボットi_move_201,i_move202の両方が存在する場合は（図１１参照）、モード１の各ロボット動作決定用動作計画を終了する。頭部ロボット単位j_newが4台のロボットで埋まったことを意味する。
【００６９】
その他の場合で、ロボットi_move_201が存在する場合は、ロボットi_move_21とロボットi_move22とロボットi_move201をa_head方向に移動する。その他の場合で、ロボットi_move_201が存在しない場合は、ロボットi_move_21とロボットi_move22をa_head方向に移動する。
【００７０】
（手順８）  手順７で生じたボイド（ロボットi_move22の元あった位置）を位置void_endとする。
【００７１】
（手順９）  位置void_endを、ロボットi_move_21とロボットi_move22以外のロボットで埋めていくことで、尾部ロボット群G_tailに所属するロボットのうち、もっともを位置void_endから離れた位置のロボットを現在位置より、1マス分位置void_endに近づける。
【００７２】
（手順１０）  ロボットi_move_201かロボットi_move_202が存在する場合は、終了する。どちらも存在しない場合は、ロボットi_move_21とロボットi_move22と、「ロボットi_move22に、行動a_headの移動方向と逆の方向で接するロボット」を、a_head方向に移動する。
【００７３】
（手順１１）  手順１０で生じたボイド（手順７実行前にロボットi_move22の元あった位置）を位置void_endとする。
【００７４】
（手順１２）  位置void_endを、ロボットi_move_21とロボットi_move22以外のロボットで埋めていくことで、尾部ロボット群G_tailに所属するロボットのうち、もっともを位置void_endから離れた位置のロボットを現在位置より、1マス分位置void_endに近づける。
【００７５】
ロボット単位j_headがロボット単位群の移動の先頭に位置する場合には、通常、頭部ロボット単位j_newに他のロボットは存在しない（言い換えると、図１１においては破線で示した４つのロボットi_move_101,i_move_102,i_move_201,i_move202が存在しない）が、開始位置の隊列によって（図１５参照）、ロボット単位j_headの移動方向に、ロボット単位を構成しない端数のロボットi_move_101,i_move_102,i_move_201,i_move202の多くとも何れか３つが存在する場合がある。その場合、手順１〜手順１２を行うことで、ロボットi_move_101,i_move_102,i_move_201,i_move202を頭部ロボット単位の一部として取り込む。つまり、ロボットi_move_101,i_move_102,i_move_201,i_move202の多くとも何れか３つが存在する場合、ロボット単位j_headを構成していた4台のロボットi_move_11,ロボットi_move_12,ロボットi_move_21,ロボットi_move_22がそのまま頭部ロボット単位j_newを構成するのではなく、存在するロボットi_move_101,i_move_102,i_move_201,i_move202の多くとも何れか３つと、4台のロボットi_move_11,ロボットi_move_12,ロボットi_move_21,ロボットi_move_22の何れか（足らない部分を補充するもの）とで、頭部ロボット単位j_newを構成する。例えば、図１５の場合には、ロボットi_move_201,i_move202と、ロボットi_move_11,ロボットi_move_12とで頭部ロボット単位j_newを構成する。
【００７６】
以上の処理のうち、手順３，６，９，１２は、共通の処理である。以下、この処理をボイド制御処理Robot_Void_Controlともいい、この処理について説明する。
【００７７】
(1)前回、本処理Robot_Void_Controlが実行された際のi_tail値を変数pre_i_tailに格納する(pre_i_tail←i_tail)。本処理が実行されるのがこれが最初ならば、pre_i_tail←-1とする。
【００７８】
(2)各ロボットが位置void_endからどれだけの距離離れているかを計算する。以下、この処理をロボット序列計算処理Robot_Joretu_Decisionともいう。ロボット序列計算処理Robot_Joretu_Decisionでは、各位置の序列変数値Joretu[Xr][Yr]を計算する。ロボット序列計算処理Robot_Joretu_Decisionについては後述する。
【００７９】
(3)(a)pre_i_tailが-1以外の値のとき（本処理を行うのが2回目以降のとき）で、ロボットpre_i_tailが一時刻ステップ前に所属していたロボット単位の位置に所属していて、かつG外にあるロボットがある場合は、その中で最もvoid_endから離れているロボット（joretu値のもっとも大きい位置にあるロボット）を選択し、ロボットi_tailとする（選択したロボットの番号をi_tailに代入する）。(b)pre_i_tailが-1以外の値のときで、ロボットpre_i_tailが一時刻ステップ前に所属していたロボット単位の位置に一つもロボットが所属していなく、他にロボット単位位置内に４つのロボットが充填されていないロボット単位位置があるときは、そのようなロボット単位内にありかつ、G外にあり、その中で最もvoid_endから離れているロボット（joretu値のもっとも大きい位置にあるロボット）ロボットを選択し、ロボットi_tailとする。(b)のような選択を行うことで、4つのロボットが充填されているロボット単位を構成するようにし、ロボット単位を構成しない端数のロボット数が４未満となるようにしている。(c)pre_i_tailが-1以外の値のときで、ロボットpre_i_tailが一時刻ステップ前に所属していたロボット単位の位置に一つもロボットが所属してなく、他に４つのロボットが充填されていないロボット単位位置がない場合は、尾部ロボット群G_tailに所属するロボットのうち、G外にあるものの中で、最もvoid_endから離れているロボット（joretu値のもっとも大きい位置にあるロボット）を選択し、ロボットi_tailとする。(d)pre_i_tailが-1のとき（本処理を行うのが1回目のとき）、尾部ロボット群G_tailに所属するロボットのうち、G外にあるものの中で、最もvoid_endから離れているロボット（joretu値のもっとも大きい位置にあるロボット）を選択し、ロボットi_tailとする。例えば、図１６は、図１１の状態において、モード１の手順１でロボットi_move_11とi_move_12とがa_head方向に移動し、ボイドが位置void_endに存在し、ロボットi_tailが設定された例を示す。
【００８０】
(4)ロボットi_tailを用いて以下の位置void_startを求める。ロボットi_tailの位置から、隣接したロボットをたどって同じ方向に2マス以上移動可能であり、2マス以上移動した先にあるロボットの所属するロボット単位が、ロボット単位j_headではなく、かつ、内に４つのロボットが所属しているという条件を満たす方向を探す。その方向と同じ方向に移動する行動をa_taiｌとする(図１６参照)。続いて、行動a_tailの方向に2マス以上移動した先にあるロボットの所属するロボット単位の番号j_startを特定する。言い換えると、ロボットi_tailの位置から、同じ方向dに2台以上ロボットが連続して隣接しており、その方向dにおいて、ロボットi_tailから2マス以上離れたマス（２つ以上離れた位置）にあり、連続して隣接するロボットの何れかが所属するロボット単位が、ロボット単位j_headではなく、かつ、内に４つのロボットが所属しているという条件を満たすとき、方向dに移動する行動をa_taiｌとする。上述の条件（ロボットi_tailから2つ以上離れた位置にあり、連続して隣接するロボットの何れかが所属し、ロボット単位j_headではなく、かつ、内に４つのロボットが所属しているという条件）を満たすロボット単位の番号j_startを特定する。なお、上述の条件を満たすロボット単位は、複数個存在しうるので、その中から任意のロボット単位を、ロボット単位j_startとして特定しうる。
【００８１】
行動a_tailとロボット単位j_startの位置(Xr_unit[j_start],Yr_unit[j_start])とから、以下のようにから位置void_startを設定する。
a_tail=1のとき：void_startのX座標を2 ×Xr_unit[j_start] + 1、Y座標をYr[i_tail]とする。
a_tail=2のとき：void_startのX座標をXr[i_tail]、Y座標を2 × Yr_unit[j_start] + 1、とする。
a_tail=3のとき：void_startのX座標を2 × Xr_unit[j_start] 、Y座標をYr[i_tail]とする。
a_tail=4のとき：void_startのX座標をXr[i_tail]、Y座標を2 × Yr_unit[j_start] 、とする。
【００８２】
(5)位置void_startから、位置void_endにいたるボイドの移動経路を計算する。以下、この処理をボイド経路計算処理Void_Trajectory_Decisionともいう。
【００８３】
(6)  (5)で計算されたボイドの移動経路を、void_endから_void_startに逆にたどり、ボイドを埋めていく。以下、この処理をボイド移動処理Void_Motionともいう。
【００８４】
なお、処理(4)は、尾部ロボット単位に属するロボットを動かす際に、ロボットの接続状態を維持するためには、「ボイドの位置が、尾部ロボット単位に隣接するロボット単位に含まれるロボットのうち、尾部ロボット単位に接するロボットの位置であってはならない」ことを考慮したものである。よって、制御システムは、尾部ロボット単位に隣接するロボット単位に含まれるロボットのうち、尾部ロボット単位に接するロボットの位置にボイドが存在しないように、ｐ台のロボットの行動を制御する。なお、前述の通り、各ロボット動作用動作計画においては、図１６の端数のロボットi_tailは、尾部ロボット単位に所属するロボットとして扱われる。図１６において、ボイドが移動経路NGを用いた場合、ロボットi_tailが上下左右方向において隣接するロボットがなくなってしまい、p台のロボット全てが一つの群れを成すことができず、ロボット同士の接続を維持することができない。そこで、位置void_endにあるボイドを一旦、位置void_startに移動させ、その後、一気にロボットi_tailの位置に移動させるように制御する。このような行動制御を行うことで、p台のロボット全てが一つの群れを成し、ロボット同士の接続を維持することができる。以下、このような制御を実現するためのロボット序列計算処理Robot_Joretu_Decision、ボイド経路計算処理Void_Trajectory_Decision、ボイド移動処理Void_Motionについて説明する。
【００８５】
(ロボット序列計算処理Robot_Joretu_Decision)
ロボット序列計算処理Robot_Joretu_Decisionは、ダイクストラ法などを用いることができる。例えば以下のとおりである。
【００８６】
(1)各ロボットにて、上下左右４方向に隣接するロボットの番号を調べる。ロボットiの行動aの移動方向にロボットi_nextが隣接して存在する場合、next[a][i]変数の値をi_nextに設定する。ロボットが存在しないときは、next[a][i]変数の値をp(ロボットの台数を表す)に設定する。
【００８７】
(2)状態空間内（Xr,Yr）各位置の序列変数値Joretu[Xr][Yr]の値をpに初期化する(Joretu[Xr][Yr]←p)。
【００８８】
(3)void_endの位置の序列変数値Joretuの値を0とする(Joretu[Xr][Yr]←0)。さらに、本処理を実行する直前に行動a_headによって移動した全てのロボットの位置の序列変数値Joretuの値を-1に初期化する。さらに、それが所属するロボット単位が、4台のロボットで充填されていないロボットの位置の序列変数値Joretuの値を-1に初期化する。さらに、void_startの位置から行動a_tailの逆向きに隣接するロボット位置のJoretu値を-1にする。
【００８９】
(4)void_endの位置と、void_endから、行動a_headの移動方向に隣接してたどれるロボットの位置以外の、各ロボットiの、全行動aについて、next[a][j]の値がpではない場合の、Joretu[Xr[next[a][i]]][Yr[next[a][i]]]の値を調べ、Joretu[Xr[next[a][i]]][Yr[next[a][i]]]の値が-1でない場合で、かつ、その最小値に１を加えた値が、現在のJoretu[Xr[i]][Yr[i]]よりも小さい場合は、その値をJoretu[Xr[i]][Yr[i]]に代入する（Joretu[Xr[i]][Yr[i]]←Joretu[Xr[next[a][i]]][Yr[next[a][i]]]+1）。
【００９０】
(5)  (4)の処理にて、Joretu値の更新がなくなるまで、(4)を繰り返す。
【００９１】
この処理により、(a)行動a_headによって移動した全てのロボットの位置、(b)そのロボットが所属するロボット単位が4台のロボットで充填されていない場合には、そのロボット単位に所属する他のロボットの位置、(c)void_startの位置から行動a_tailの逆向きに隣接するロボットの位置を除き、位置void_endから離れた位置の序列変数値Joretu[Xr[i]][Yr[i]]ほど大きな値となるように更新される。図１６の角括弧内の数値は、更新がなくなったときの序列変数値Joretuの値の例を示す。
【００９２】
(ボイド経路計算処理Void_Trajectory_Decision)
ボイド経路計算処理Void_Trajectory_Decisionは、以下のとおりである。
【００９３】
(1)位置void_startの位置をボイド軌道(X,Y)=(void_trj_x[h], void_trj_y[h])(h=0,1,2,3…)の最初の位置とする。
(2)軌道番号h_trj←0とする。
(3)現ボイド軌道位置（void_trj_x[h_trj],void_trj_y[h_trj]）から、全方向にて隣接する位置にあるロボットiのうち、そのロボットiの位置における序列値Joretu[Xr[i]][Yr[i]]が、-1以外であって、かつ、Joretu[void_trj_x[h_trj]][void_trj_y[h_trj]]よりも小さいロボットiの位置を次のボイド軌道位置（void_trj_x[h_trj+1],void_trj_y[h_trj+1]）とする。その際の、ボイドの移動の方向と同じ行動の番号をボイド行動履歴a_void[h_trj]に格納する。h_trjをインクリメントする。
(4)現ボイド軌道位置が、位置void_endに等しくなるまで(3)を繰り返す。
【００９４】
この処理により、位置void_endから位置void_startまでのボイドの経路を計算する。
(ボイド移動処理Void_Motion)
ボイド移動処理Void_Motionは、例えば、以下のとおりである。計算されたボイド軌道に沿って、同じ方向に動くロボットを一度に移動させている。もちろん、一度に移動させず一台ずつ動かしてもよい。
【００９５】
(1)h_trj_buffer←h_trj-1とする。
(2)h_trjをデクリメントし、a_void[h_trj]の値を、a_void_bufferに格納する。
(3)h_trj=0でなければ、h_trjをデクリメントし、a_void[h_trj]= a_void_bufferであるか否かを判定し、a_void[h_trj]= a_void_bufferのとき、(3)を繰りかえす。そうでなければ(a_void[h_trj]≠ a_void_bufferのとき)、ボイド軌道(void_trj_x[h_trj_buffer], void_trj_y[h_trj_buffer])から、(void_trj_x[h_trj+1], void_trj_y[h_trj+1])までの位置にあるロボットを皆、a_void_bufferに格納された行動値で移動させ(4)にいく。この処理により、同じ方向に動くロボットを一度に移動させている。h_trj=0のとき、ボイド軌道(void_trj_x[h_trj_buffer], void_trj_y[h_trj_buffer])から、(void_trj_x[0], void_trj_y[0])までの位置にあるロボットをa_void[0]に格納された行動値で移動させ(5)にいく。
(4)h_trjをインクリメントし、(1)に戻る。
(5)ロボットi_tailから行動a_tailの向きに隣接し、位置void_startに至るまでの位置にあるロボットを皆、行動a_tailで移動させる。なお、この移動は、一台ずつではなく、全て一緒に移動させる必要がある。この処理により位置void_startにあるボイドをロボットi_tailの位置に一気に移動させ、ロボットi_tailに隣接するロボットが無くなることを防ぐ。
【００９６】
GUがロボットで満たされるまで、移動先隊列決定用動作計画処理Next_Formation_Decisionの後、モード１（手順１〜手順１２）を使用してロボットを移動させる処理を繰り返す（図８、図１７〜図１９参照）。GUがロボットで満たされるとモード２に移行する。
【００９７】
（モード２）
続いて、モード２のGUがロボットで満たされている場合の各ロボット動作決定用動作計画の動作について述べる。
【００９８】
(i_startの選択)
モード２では、先頭のロボットを選択する際に、頭部ロボット単位は使用しない。先頭ロボットの番号をi_startとする。start_select[i]変数をロボットiの先頭ロボットとしての選択回数を記憶する変数とし、ロボットの移動開始前に０にあらかじめ初期化する（start_select[i]←0）。
【００９９】
まず、前ステップで本モード２の処理が実行されたときの先頭ロボットi_startが前ステップでの移動を行った後の位置から、前ステップでのロボットi_startの移動方向a_startの移動する方向に隣接していて、「GUに属さず、Gに属す目標位置であって、そこに他のロボットが存在していない位置」があるとき、引き続きロボットi_startを先頭ロボットとして選択する。start_select[i_start]をインクリメントする。
【０１００】
そうでない場合は、これまで、先頭ロボットとして選択されたことのないロボットで、かつ、「GUに属さず、Gに属す目標位置で、ロボットが存在していない位置」に隣接するロボットiのうちで、その隣接する目標位置に移動する行動をa_startとしたとき、以下の条件１を満たさないロボットを先頭ロボットi_startとして選択する。start_select[i_start]をインクリメントする。なお、ロボットi_startの選択は、目標位置への入口位置単位PeUに属するものから優先的に選択する。（G外に残留するロボット数が残り少なくなって4つ以下になったときに、入口位置単位PeUからi_startを選ぶと、ロボットi_startが口述するモード２内手順３で計算されるロボット単位j_start内に含まれてしまうこととなり、本実施形態ではそのような場合に対応できないからである。）
条件１：あるロボットiについて、そのロボットが所属するロボット単位ｊに行動a_startの方向で隣接するロボット単位の位置の中にGUに属さずGに属する位置が3個であり、その中で、ロボット単位jに隣接しない位置が2つ以上ある。
【０１０１】
図２０に条件１を満たす例を示す。なお、図２０のロボット単位j1のロボットi1は条件１を満たすため選択されない。一方、図２０のロボット単位j2に属するロボットi2やi3は条件２を満たさない(ロボット単位jに隣接しない位置が1つしかない)ため、選択されうる。
【０１０２】
モード２の動作は以下のとおりである。
（手順１）  ロボットi_startの選択が2回目の場合（start_select[i_start]=2）、ロボットi_startとロボットi_startと行動a_startの逆の方向で隣接するロボットと、さらにそのロボットに行動a_startの逆の方向で隣接するロボットをa_start方向に移動する。ロボットi_startの選択が１回目の場合、ロボットi_startとロボットi_startと行動a_startの逆の方向で隣接するロボットをa_start方向に移動する。なお、目標隊列エリアGが目標隊列エリア単位GUから飛び出している部分は目標隊列エリア単位GUに隣接するマス単位に含まれることを前提としているため、start_select[i_start]は１または２となる。
（手順２）  手順１で生じたボイド（手順１で最後尾で移動したロボットの元あった位置）を位置void_endとする。
（手順３）  位置void_endを、手順１にて行動a_startで移動したロボット以外のロボットで埋めていくことで、尾部ロボット単位i_tailに所属するロボットのうち、もっとも位置void_endから離れた位置のロボットを現在位置より、1マス分位置void_endに近づける。
【０１０３】
手順３はモード１と同じものである。
【０１０４】
以上の処理を、G内にロボットが充填されるまで繰り返す（図１９、図２１、図２２参照）。
【０１０５】
＜第一実施形態に係る行動制御システム１００＞
第一実施形態に係る行動制御システム１００は、以上に説明した各処理によって構成される全体動作について以下にまとめる。
【０１０６】
(1)移動先隊列決定用動作計画のために使用する価値関数Q（s,a）をMDPの動的計画法で計算する。
(2)開始位置で、４つのロボットが収まっているロボット単位位置を特定し、Gaのロボット単位の要素として設定する。
(3)以下(4)，(5)を全G内にロボットが充填されるまで繰り返す。
(4)GUがロボットで充填されていない場合、移動先隊列決定用動作計画処理Next_Formation_Decisionを実行する。充填されているならなにもしない。
(5)GUがロボットで充填されていない場合、各ロボット動作決定用動作計画処理のモード１を実行する。GUがロボットで充填されている場合、モード２を実行する。
【０１０７】
以下、これらの処理を実行する構成について説明する。
【０１０８】
図２３は第一実施形態に係る行動制御システム１００の機能ブロック図を、図２４はその処理フローの例を示す。行動制御システム１００は、図２３に示すように、動作計画部１１０と、行動選択部１２０と、隣接状態判定部１２４と、位置更新部１２３と、位置判定部１２６と、記憶部１４０と、通信部１５０と、入力部１６０とを含む。行動選択部１２０は移動先隊列決定用動作計画部１２１と各制御対象物動作用動作計画部１２２とを含む。
【０１０９】
以下では、制御の対象となる制御対象物が、ロボットである場合を例に挙げて説明する。もちろん、制御対象物は、制御の対象となり得るものであれば、ロボット以外であってもよい。
【０１１０】
本実施形態では、行動制御システム１００は、p台のロボットの行動を制御し、p台のロボットの内の１つのロボット上に実装される。なお、行動制御システム１００が実装されていないp-１台のロボットについても、通信部１５０と、隣接状態判定部１２４とを含む。
【０１１１】
＜動作計画部１１０＞
動作計画部１１０は、価値関数Q(s,a)の値を、動的計画法により、ロボットの任務行動開始前に事前に計算し（Ｓ１１０）、記憶部１４０に格納する。ここで、動作計画部１１０の計算は、一つのロボット単位を使用した強化学習（例：Q学習）に置き換えてもよい。なお、別装置で価値関数Q(s,a)を計算しておき、ロボットの任務行動開始前に事前に記憶部１４０に格納しておけば、行動制御システム１００は、動作計画部１１０を備えなくともよい。
【０１１２】
なお、価値関数Q(s,a)の計算については、[移動先隊列決定用動作計画のためのMDP状態空間]で説明した通りである。
【０１１３】
＜入力部１６０＞
入力部１６０には、p台のロボットiのそれぞれの初期位置(Xr0[i],Xr0[i])及びp個の目標位置の集合G={(Xre[0],Yre[0]),(Xre[1],Yre[1]),…,(Xre[p-1],Yre[p-1])}が入力され、記憶部１４０に記憶される。
【０１１４】
なお、目標位置は、所定の入口位置Peを含むとする。この入口位置Peについての情報も、入力部１６０から入力され、記憶部１４０に記憶されるとする。
【０１１５】
＜記憶部１４０＞
記憶部１４０には、位置s及びa∈{0,1,2,3,4}の組み合わせのそれぞれについての価値関数Q(s,a)が記憶されているとする。sの取りうる範囲は、対象となる二次元平面上の領域内のロボット単位ｊが存在しうる全ての座標である。
【０１１６】
各位置sの報酬r(s)についても、記憶部１４０に記憶されているとする。各位置sの報酬r(s)についての情報は、例えば入力部１６０から入力される。
【０１１７】
＜通信部１５０＞
行動制御システム１００が実装されているロボットも含め、全てのロボットは、通信部１５０を介して、二次元平面上の上下左右方向(以下「４方向」ともいう)において隣接する他のロボットと通信することができる。
【０１１８】
＜行動選択部１２０＞
行動選択部１２０は、記憶部１４０から価値関数Qを取り出す。
【０１１９】
行動選択部１２０は、上述の方法で説明した方法で、p台のロボットを制御する（ｓ１２０）。
【０１２０】
行動選択部１２０は、まず、p台のロボットの位置から4つのロボットが収まっているロボット単位位置を特定し、隊列Gaに含まれるロボット単位として設定する。なお、各ロボットの位置を必要とするが、各ロボットの位置の初期位置(Xr0[i],Xr0[i])については、前述の通り、入力部１６０を介して入力され記憶部１４０に記憶されているものを利用し、移動後の各ロボットの位置については、後述する位置判定部１２６で求め記憶部１４０に記憶されているものを利用すればよい。
【０１２１】
行動選択部１２０は、位置判定部１２６で求め記憶部１４０に記憶されている各ロボットの位置と、目標隊列エリア単位GUとを照合し、目標隊列エリア単位GUが全てロボットで充填されているか否かを判定する（ｓ１２０−１）。なお、目標隊列エリア単位GU及び入口位置単位PeUについては、記憶部１４０からp個の目標位置の集合G及び入口位置Peを取り出し、集合G及び入口位置Peから求めてもよいし、価値関数Q(s,a)を求める際に用いたものを用いてもよい。
【０１２２】
充填されていない場合には、行動選択部１２０の移動先隊列決定用動作計画部１２１は、価値関数Q(s,a)を用いて、移動先隊列決定用動作計画処理Next_Formation_Decision（または、簡略化された移動先隊列決定用動作計画処理）を行い（ｓ１２１）、開始位置の集合に配置されたp台のロボットを目標位置の集合に移動させる際に、頭部ロボット単位が移動の先頭を務めるように、頭部ロボット単位の位置を出力する。
【０１２３】
充填されていない場合、さらに、行動選択部１２０の各制御対象物動作用動作計画部１２２は、頭部ロボット単位の位置を受け取り、各ロボット動作用動作計画のモード１を行い（ｓ１２２−１）、頭部ロボット単位の位置に４台のロボットが位置するように、各ロボットに対して制御信号を送る。各ロボットは制御信号に従って行動する。
【０１２４】
充填されている場合、行動選択部１２０の各制御対象物動作用動作計画部１２２は、各ロボット動作用動作計画のモード２を行い（ｓ１２２−２）、目標エリア単位GUに属さず、目標エリアGに属す目標位置で、ロボットが存在していない位置に隣接するロボットを選択し、目標エリア単位GUに属さず、目標エリアGに属す目標位置の先端（そのロボット位置の最大２マス先の位置）にそのロボットが移動するように、各ロボットに対して制御信号を送る。各ロボットは制御信号に従って行動する。例えば、行動選択部１２０は、記憶部１４０に格納されている目標エリアGと目標エリア単位GUとを照合し、目標エリア単位GUに属さず、目標エリアGに属す目標位置を予め求めておき、移動後の各ロボットの位置から、目標エリア単位GUに属さず、目標エリアGに属す目標位置で、ロボットが存在していない位置に隣接するロボットを選択すればよい。
【０１２５】
なお、一回の行動制御により、モード１では１回の移動先隊列決定用動作計画処理Next_Formation_Decisionで決定された頭部ロボット単位を充填する処理が行われ、モード２では、ロボットを、目標エリア単位GUに属さず、目標エリアGに属す目標位置の先端（最大２マス）まで移動させる処理が行われる。
【０１２６】
移動先隊列決定用動作計画処理Next_Formation_Decision（または、簡略化された移動先隊列決定用動作計画処理）において行われる頭部決定処理Head_Robot_Decisionの中で用いられる行動方策Policy_Gにおいて、各ロボット単位の位置や障害物位置を必要とするが、各ロボット単位の位置ついては前述の通り、取得可能である。また、障害物の位置に関しては、価値関数Q(s,a)を学習する際に利用した障害物の位置を利用してもよいし、後述する隣接状態判定部１２４で判定した判定結果を用いて得られるものを利用してもよい。
【０１２７】
＜位置更新部１２３＞
位置更新部１２３は、各i=0,1,…,p-1について、i番目のロボットの現在の位置（Xr[i],Yr[i]）において、行動選択部１２０で決定した行動を実行した場合のロボットの移動後（行動後）の位置（Xr'[i],Yr'[i]）を計算し、計算された（Xr'[i],Yr'[i]）で記憶部１４０に格納されたi番目のロボットの位置を更新する（Ｓ１２５）。言い換えれば、位置更新部１２３は、行動選択部１２０で決定した行動に基づいて、ロボットが行動した場合に想定される位置（以下、「想定位置」ともいう）を計算し、ロボットの位置を更新し記憶部１４０に格納する。具体的には、図１０のｓ８（位置の更新）を行う。
【０１２８】
＜隣接状態判定部１２４＞
隣接状態判定部１２４は、ロボットの２次元平面上の上下左右の隣接する位置に、障害物または他のロボットが存在するか否かを判定し、（Ｓ１２１），判定結果を記憶部１４０に格納する。
【０１２９】
なお、上述の通り、行動制御システム１００が実装されていないp-１台のロボットについても、通信部１５０と、隣接状態判定部１２４とを含む。そのため、各ロボットiは隣接状態判定部１２４において、自身の上下左右方向に障害物または他のロボットがいるかどうかを判定し、通信部１５０を介して判定結果を行動制御システム１００に出力することができる。行動制御システム１００は、通信部１５０を介して各ロボットiから判定結果を受け取り、行動制御システム１００に含まれる隣接状態判定部１２４の判定結果と一緒に記憶部１４０に格納する。なお、p台のロボットは、各ロボットの隣り合う位置（４方向）に必ず、他のロボットが存在し、隣り合うロボット同士がなす群れは、一塊なので、各ロボットiは通信部１５０を介してp-1個の判定結果を直接、または、他のロボットを介して、行動制御システム１００に送信することができる。また、行動制御システム１００は、通信部１５０を介して、直接、または、他のロボットを介して、各ロボットiに選択した行動を実行するように制御信号を送信することができる。また、他の情報もp台のロボット間で送受信可能となる。
【０１３０】
なお、ロボットが移動するように制御したとしても、何らかのトラブル（感知できなかった障害物の存在や、機器の故障等）により、行動選択部１２０の制御通りに移動できるとは限らない。一方、動かなかったロボットの位置は、制御する前と変わらない。よって、少なくとも１台のロボットが動かないように制御することで、動かなかったロボットの位置を基準として、隣接状態判定部１２４による判定結果を用いて、移動するように制御されたロボットの、実際に行動した後の位置（以下「行動後位置」ともいう）（Xr"[i],Yr"[i]）を求めることができる。また、GPS等の少なくとも一台のロボットがGPSを備えれば、そのロボットを基準として、同様に移動後位置を求めることができる。
【０１３１】
＜位置判定部１２６＞
位置判定部１２６は、隣接状態判定部１２４の判定結果を用いて、行動後位置を求め、行動後位置（Xr"[i],Yr"[i]）と想定位置（Xr'[i],Yr'[i]）とが一致するか否かを判定する（Ｓ１２６）。なお、一致しない場合には、移動するように制御されたロボットが何らかのトラブルにより、制御通りに移動できなかったと考えられる。この場合、行動後位置（Xr"[i],Yr"[i]）と想定位置（Xr'[i],Yr'[i]）との少なくとも一方を補正すればよい。補正方法としては様々な手法が考えられる。例えば、移動した全てのロボットに対して、制御前の位置に戻るように指示し、行動後位置（Xr"[i],Yr"[i]）を補正してもよいし、想定位置（Xr'[i],Yr'[i]）を行動後位置（Xr"[i],Yr"[i]）に合わせて補正してもよい。
【０１３２】
各時刻ステップごとに、すべてのロボットがG内にあるかどうかを判定し（Ｓ１２７）、すべてのロボットがG内にあるときは、任務を終了する。そうでないときは、任務を継続する。
【０１３３】
例えば、図示しない目標位置到達判定部において、各i=0,1,…,p-1について、位置判定部１２６から出力された行動後位置（Xr"[i],Yr"[i]）∈Gであるか否かを判定し、全てのiについて（Xr"[i],Yr"[i]）∈Gである場合には、任務を終了する。少なくとも１つ以上のiについて（Xr"[i],Yr"[i]）∈Gを満たさない場合には、行動選択部１２０を再度実行するよう制御する。
【０１３４】
以上に述べた処理ｓ１２０〜ｓ１２７を毎時刻ステップごとに行う。
【０１３５】
＜効果＞
このような構成により、一つのロボット単位に必要な分だけのマルコフ状態空間を用意し、それを用いて動的計画法を利用して各位置でのロボット単位の行動方策を計算し、その行動方策を利用することで、ロボット群に任意の隊列形状と、任務環境内の任意の障害物形状に対応した障害物回避アルゴリズムを獲得でき、ロボット同士が接した状態を維持したうえでの多数ロボットのための隊列形成アルゴリズムを獲得することができる。すなわち、計算負荷がロボット数の階乗に比例せず、実時間で実行可能な低計画計算負荷での自己位置座標定義型隊列形成アルゴリズム獲得ができる。また、静止しているロボットに対する相対的な位置を判定することで、絶対的な位置を取得することができるため、付加的な位置計測用の装備を必要としない。または少なくとも一台のGPSを備えるロボットか、開始状態にて位置の定義されたロボットに対する相対的な位置を判定することで、絶対的な位置を取得することができるため、全てのロボットがGPS等を備えなくともよい。
【０１３６】
また、ロボット単位で制御することで、ロボットの群れの中のいずれのロボットが一台欠けても、各ロボットはお互いに一つの辺で接しあう位置関係を崩さずに済む。ロボットの移動量の誤差による隊列崩れも起こりにくい。
【０１３７】
＜変形例＞
本実施形態では、各格子（マス）は、正方形であるが、他の形状であってもよい。格子は左右方向及び上下方向に連続して配置される。また、各格子は左右方向で他の二つの格子と隣接し、上下方向で他の二つの格子と隣接する。言い換えると、各格子は、ロボットの移動できる方向と同じ方向においてのみ、他の格子と隣接する。この条件を満たせば、各格子はどのような形状であってもよい。また、「直交」とは、厳密に「垂直に交わること」を意味しなくともよく、例えば、図２５のように、各格子は、菱形であってもよく、各格子が他の二つの格子と隣接する方向の一方を上下方向とし、他方を左右方向とすればよく、このとき、上下方向と左右方向とは直交するものとする。
【０１３８】
別の言い方をすると、制御対象物は、二次元平面上の、第一方向（例えば右方向）、第一方向に対して平行でない方向である第二方向（例えば上方向）、第一方向に対して反対方向である第三方向（例えば左方向）、第二方向に対して反対方向である第四方向（例えば下方向）に移動可能であり、一回の行動制御により、現在いる領域（格子、マス）から、現在いる領域に対して、第一方向、第二方向、第三方向、第四方向において隣接する領域の何れかに移動するように制御される。また、この場合、ロボットの２次元平面上の、第一方向において隣接する位置を第一位置、第二方向において隣接する位置を第二位置、第三方向において隣接する位置を第三位置、第四方向において隣接する位置を第四位置、第一位置に第二方向において隣接する位置を第五位置、第二位置に第三方向において隣接する位置を第六位置、第三位置に第四方向において隣接する位置を第七位置、第四位置に第一方向において隣接する位置を第八位置と呼んでもよい。
【０１３９】
本実施形態では、行動制御システム１００が、p台のロボットの内の１つのロボット上に実装される例を示したが、コンピュータ上の制御対象物に対して行動制御を行ってもよい。その場合、意図的にトラブルを発生させない限り、制御した通りに制御対象物は移動するため、想定位置（Xr'[i],Yr'[i]）と移動後位置（Xr"[i],Yr"[i]）とが一致する。そのような状態で、各制御対象物i毎の理想的な行動計画を行ってもよい。その結果得られた任務を終了するまでの行動計画を実ロボットに実行させる。実ロボットは、通信部１５０と隣接状態判定部１２４を備え、各行動を終えた後に、隣接状態を判定し、判定結果を用いて、行動後位置を求め、行動後位置（Xr"[i],Yr"[i]）と想定位置（Xr'[i],Yr'[i]）とが一致するか否かを判定する。なお、一致しない場合には、移動するように制御されたロボットが何らかのトラブルにより、制御通りに移動できなかったと考えられる。その後の処理については第一実施形態と同様でもよいし、他の処理を行ってもよい。このような構成により、少なくとも制御通りに移動できなかったことを検知することができる。
【０１４０】
本実施形態では、一回の行動制御に対して、一回の位置判定を行っているが、一回の行動制御において、複数のロボットを移動させる場合には、各ロボットが移動の度に位置判定を行う構成としてもよい。
【０１４１】
本実施形態では、ロボット単位は、２×２の４台のロボットからなるが、M×N台のロボットからなってもよい。ただし、M及びNはそれぞれ２以上の整数の何れかである。なお、ロボットの台数pはロボット単位に含まれるロボットの台数M×N以上とする。このような状態で移動を行った場合にも、２×２のロボット単位のときと同様に、ロボットの群れの中のいずれのロボットが一台欠けても、各ロボットはお互いに一つの辺で接しあう位置関係を崩さずに済む。M×Nの台数を大きくすると、価値関数Q(s,a)の学習において、行動できるパターンが減るため、価値関数Q(s,a)の学習の計算量が減る。しかし、価値関数Q(s,a)の学習において、M×N個のマスを一つの単位とするマス単位の中に1つでも障害物が含まれる場合には、そのマス単位の状態sは障害物として扱うため、M×Nの台数を大きくすると、障害物の範囲が多くなり、行動できる範囲が小さくなる。そもそも一つのロボット単位に必要な分だけのマルコフ状態空間を用意し、それを用いて動的計画法を利用して各位置でのロボットの行動方策を計算すればよいため、従来技術に比べれば、十分に価値関数Q(s,a)の学習の計算量が減っている。そのため、行動できる範囲を大きく保つために２×２台のロボットを一つの単位とするロボット単位とすることが望ましい。
【０１４２】
＜第二実施形態＞
第一実施形態との違いを中心に説明する。第一実施形態の制御方法を三次元空間に拡張する。本実施形態では、
(1)ロボット隊列を3次元化する。
【０１４３】
(2)ボイドコントロールを並列処理化して隊列形成動作を高速化する。
【０１４４】
(3)動作計画の計算量をO(n2)からO(n)に軽減する。
【０１４５】
(4)頭部ロボット単位Dの選択方法を改良して、24個以上のロボット単位で構成される任意形状のロボット群への適用を保証する。
【０１４６】
本実施形態では、多数のロボットの存在を考慮しつつも、計画計算に必要な計算時間をロボットの台数の一乗に比例するように抑え、また、他のロボットの面の上でのスライディング動作しかできないロボット同士が接したまま状態を維持しつつ任意の隊列から、別の任意の隊列へ障害物のある環境にて変形動作を行うことを可能とする。
【０１４７】
また、本実施形態に拠れば、詳しくは後述するが、ロボットが変形を行う空間に含まれる格子数に比例した計算量で、ロボットの動作計画が可能であり、その動作計画の結果を利用することで、ロボット台数の2乗に比例した実行時間で、任意形状の障害物が存在する環境において、ロボットに任意の形状から任意の形状への変形をさせることが可能である。
【０１４８】
[問題設定]
多数のロボットが協調して開始位置における隊列形成状態から、各ロボットが接した状態を維持しつつ移動を行い、目標位置での隊列形成を行う任務は、例えば図２６に例示するような、互いに接する面同志をスライドさせて移動していくことが可能な立方体型のロボットの使用を想定する。図２７に示すように、壁で区切られた部屋（ただし図中、壁を省略する）においての開始位置から目標位置まで複数のロボットの移動によって実現するものである。
【０１４９】
ロボットについては、例えば図２６に示すように、ロボットの周囲縦横高さ方向（以下「上下左右前後方向」ともいう）６マスのうち一つに他のロボットが存在している状態を維持しながら移動をするものとする。この手法では１つのロボット自身が、一台のロボットのサイズ分の距離を移動することで、一回の動作の移動量を正確に測ることができるというメリットがある。また、一つの面を共有する隣り合うロボットとの相対的な位置を計測しあうことで、ロボットの群れ全体の中での各ロボットの位置も容易に知ることができる。このため、ロボットの移動量の誤差によって、隊列が崩れるといった問題を起こしにくい。また、複数のロボットを連結したように、同時に複数のロボットを移動させていくことが可能である。
【０１５０】
なお、ロボットは、隣の位置に他のロボットが存在しているか否か、障害物があるか否か、そして、自身が目標位置上にいるかどうかを知ることができるものとする。
【０１５１】
任務を行うロボットは、p台（p≧192=24×8）であり、各ロボットは、隣接するロボットと一面以上を共有しつつ、三次元空間におけるX-Y-Z軸方向に移動可能とする。図２６の各立方体は、それぞれのロボットの位置を示すものである。各立方体にはロボットは一台しか存在することができない。それぞれのロボットは、移動しようとする方向に障害物か他のロボットがある場合には、静止をするものと仮定する。なお、ロボットが存在しうる立方体状の空間をマス、または、格子ともいう。図２７において、グレーに塗りつぶされたマスはロボットが存在する位置を示し、実線で囲まれた白抜きのマスは障害物が存在する位置を示す。図２７Ａのロボットが存在する位置はロボットの開始位置の集合を示し、図２７Ｂのロボットが存在する位置はロボットの目標位置の集合を示す。目標位置の集合で表される領域を目標隊列エリアともいう。このように、各開始位置及び各目標位置は、それぞれ縦横高さ方向の少なくとも何れかの方向において他の開始位置及び目標位置と隣接し、ロボットの開始位置及び目標位置での隊列形状はそれぞれ一塊の任意の形状である。
【０１５２】
[ロボットの座標設定]
それぞれのロボットi（iはロボット番号を表すi=0,1,2,3,,,p-1）の初期位置を（Xr0[i],Yr0[i],Zr0[i]）とし、目標位置を（Xre[i],Yre[i],Zre[i]）とするとき、本問題は、初期位置に配置されたロボットが、目標位置まで移動するための行動計画を求めることと定義できる。目標位置（Xre[i],Yre[i],Zre[i]）の集合をGとする。
【０１５３】
[任務空間の定義]
iをロボット番号としたとき、ロボットiの各状態（ロボットの位置と行動）は離散値で表現される。部屋をX,Y,Zの直交座標系からなる3次元空間で表すと、X軸、Y軸、Z軸をそれぞれ離散化表現した値により各位置を表現する。つまり、部屋（３次元空間）は格子で区切られ、各格子が各位置に対応する。また、各格子において、障害物の「ある／なし」が予め設定されている。
【０１５４】
[ロボット動作の定義]
また、行動主体は部屋に配置されている各ロボットとなる。ロボットi（iはロボット番号）の行動aは、静止、縦横高さ方向への１格子分の移動、の計７種類のうちのいずれかを取る。例えば、a∈{0,1,2,3,4,5,6}として、
0: 静止
1: 三次元空間内でX軸正方向に１格子だけ移動する
2: 三次元空間内でY軸正方向に１格子だけ移動する
3: 三次元空間内でX軸負方向に１格子だけ移動する
4: 三次元空間内でY軸負方向に１格子だけ移動する
5: 三次元空間内でZ軸正方向に１格子だけ移動する
6: 三次元空間内でZ軸負方向に１格子だけ移動する
とする。
【０１５５】
[探索計算上の問題点]
このような任務環境における状態空間は、ロボット数×3の次元数の状態を持ち、かつ選択可能な行動数は、ロボットの行動（＝７通り）のロボット数乗だけ存在する。例えば、ロボット数が５０で、部屋の縦横高さ方向の格子数がそれぞれ２０であるとすれば状態数は２０の150乗個にもなり、探索計算に要する資源の量は膨大なものとなる。さらにロボット数が１台増えるごとに、その状態数は8000倍増加していくことになる。本実施形態の[問題設定]の項で説明したように、ロボット同士が接しているという拘束条件を取り入れる場合、ロボットのお互いの移動を考慮したうえで探索計算行わなければならないために、根本的な計算量の削減は難しく、複数ロボットを使用する場合の大きな問題となっている。
【０１５６】
[二つの動作計画の導入]
そこで、第一実施形態の場合と同様に二つの動作計画を導入する。本実施形態で必要とされる探索計算は、大きく二つにわけられる。ここでそのための準備として、ある隊列Gaをなしているロボットが、次になすべき隊列の形状としてGbを考える。隊列Gaと隊列Gbの間には、隊列Gaにて存在し、隊列Gbにて存在しない位置にあるロボットと、隊列Gbにて存在し隊列Gaにて存在しない位置にあるロボットがある。前者を尾部ロボットとし、後者を頭部ロボットとする。本実施形態では、ちょうど、頭部ロボット位置にあるロボットが、ロボット群の移動において先頭を務め、尾部ロボットが、移動の最後尾を務めるロボットになるように、隊列Gaと隊列Gbを定義する。
【０１５７】
この定義の元、一つ目の探索計算は、隊列Gaをなすロボットの群が、障害物を回避しつつも、目標位置まで移動するためには、次の隊列Gbとしてどの隊列を選択すればよいかを決定するための（図２８）動作計画計算（移動先隊列決定用動作計画）である。この探索計算は、事実上、頭部ロボット位置に移動するロボットとして、隊列Gaのどのロボットを選択するかと、隊列Gaにおける尾部ロボットを決定するための計算である。
【０１５８】
二つ目の探索計算は、ロボットが互いに接した位置関係を維持しつつも、隊列Gaから隊列Gbへ変形する際の各ロボットの動作を決定するための動作計画計算（各ロボット動作用動作計画）である。これは、事実上、移動先隊列決定用動作計画により決定済みの頭部ロボット及び尾部ロボットに対し、尾部ロボットの位置からロボットを追い出し、隊列Gbにおける頭部ロボットの位置へロボットを誘導するための探索計算である。
【０１５９】
本実施形態では、これらの探索計算を、目標位置の集合G内に一点の入口位置を設定し、その入口位置からの各ロボット位置の全体ロボット構造内でのマンハッタン距離を計算することで行う。
【０１６０】
[ボイド制御]
上記二つの探索計算負荷の軽減のため、本実施形態においても、ボイド制御の考え方を導入する。まず、ここでいうボイドとは、あるロボットが別の位置に移動した後に、元いた位置にできる空隙のことである。こうした群ロボットの隊列形成問題においては、複数のロボットの動作に着目するがゆえに、その探索計算量が爆発してしまうが、視点を変えて、ボイドの動きに着目すれば、多数のロボットの動作計画の問題を単一のボイドの動作計画として考えることができ、探索計算負荷の軽減に適している。
【０１６１】
まず、移動先群決定用動作計画において、ロボット群の移動の先頭を務める頭部ロボットの動作について考える。本実施形態では、目標位置の集合Gに一か所の入口位置Peを設けて、他の位置からは頭部ロボットがGに入ることはできないこととする。また、一度G内に入った全てのロボットは、二度とG外には出られないこととする。この条件のもと、G外にいる頭部ロボットが入口位置Peに至るまでのロボットの経路決定問題は、一台のロボットを入口位置Peまで誘導するための探索問題を解けばよく、得られた解を頭部ロボットの選択と誘導のために使用すればよい。目標位置の集合G内の頭部ロボットの動作については、ボイドの動きに着目して、ボイドの誘導について同様のことを行う。すなわち、目標位置の集合G内の頭部ロボットに望まれる動作とは、適切に頭部ロボットが入口位置Peから遠ざかり、目標位置の集合G内の各場所に散らばっていきつつ目標位置の集合Gを埋めていくことであるが、これをボイドの動きとしてみれば、ロボットが入口位置Peから、目標位置の集合G内に入るたびに、ボイドはそれに伴って、入口位置Peから目標位置の集合Gの外に出ていくのである。このとき、目標位置の集合G内のボイドは、すべて一点の入口位置Peに向かって移動していくのが理想的な動作である。つまり、目標位置の集合G内の頭部ロボットを目標位置の集合Gに適切に散らばるように誘導するためには、目標位置の集合G内に位置する各ボイドが入口位置Peに至るための経路を探索計算すればよく、そうして求められたボイドの動作を頭部ロボットを動かすことで実現するようにすればよい。この考え方ならば、すべてのロボットが、一点、入口位置Peを目指して動作するための動作計画を一回行えばよいので、計算負荷が劇的に少なくなる。
【０１６２】
続いて、隊列Gaを維持しているロボット群が、隊列Gbに変形することを考える。このとき、ロボット群が隊列Gaから隊列Gbに変形する動作とは、頭部ロボットの位置にいた一つのボイドが、尾部ロボットの位置に移動していくプロセスとしてとらえることができる（図２８及び図２９参照）。このようなボイドの動作は、頭部ロボット位置をスタート位置とし、尾部ロボット位置をゴール位置とした、一つのボイドの動作計画によって計算可能であり、計算負荷も小さい。この計算において考慮すべきボイドの移動の拘束条件としては、ボイドが移動する際に、ロボットが存在する位置をたどっていくという制限を設けるだけでよい。
【０１６３】
[8マスロボット単位の導入]
さらに、本実施形態では、図３０に示すように、８つの田の字状に隣接したロボットを一つの単位とし（ロボット単位）、ロボットは、この田の字型のロボット単位を維持しつつ移動を行うとする。言い換えると、８台毎に１つのロボット単位を構成し、１つのロボット単位を構成する８台のロボットはそれぞれ３つの方向において１つのロボット単位を構成する他のロボットと隣接した状態を維持しつつ移動を行う。このロボット単位の集団は、互いにロボット単位ごとに一面を共有し、接しながら移動をするように制御される。
【０１６４】
このような８つのロボットを一つの単位とした移動を行う理由としては、このような状態で移動を行う限り、各ロボット単位の中のいずれのロボットが一台のみ欠けても、各ロボット単位はお互いに一つの面で接しあう位置関係を崩さずに済むからである。すなわちこれは、隊列形態の維持を考量しなければならない各ロボット動作用動作計画において、ロボット同士の接続を考慮するための計算負荷を軽減することにつながるからである。各ロボット単位内のボイドが１つ以内であれば、全ロボット単位内にボイドが存在してもよいことになるので、一度に複数のボイドをロボット群の中に並列で存在させて、ロボットの隊列変形動作を高速化することも可能である。
【０１６５】
先に述べた移動先隊列決定用動作計画は、８台のロボットによるロボット単位がなす群れの移動について行う。先に述べた頭部ロボット、尾部ロボットは、それぞれ８台のロボットで構成される頭部ロボット単位、尾部ロボット単位となる。各ロボット動作用動作計画は、頭部ロボット単位に含まれる８つのロボットの位置に、ロボットを誘導し、尾部ロボット単位の位置に含まれるロボットから、８つのロボットを追い払うための動作を探索計算する。
【０１６６】
ここでは８台のロボットがなすロボット単位が一つのマスの単位（本実施形態では、以下、この単位を「マス単位」または「位置単位」ともいう）であるとし、一つのマス単位を一状態として状態空間を組む。ロボット単位の位置を（Xr_unit[j],Yr_unit[j], Zr_unit[j]）（j=0,1,2,…j_max-1）としたとき、そのロボット単位jに所属するロボットをi1,i2,i3,i4,i5,i6,i7,i8とすれば、
Xri1 = 2 x Xr_unit[j] 
Yri1 = 2 x Yr_unit[j] 
Zri1 = 2 x Zr_unit[j] 
Xri2 = 2 x Xr_unit[j] + 1
Yri2 = 2 x Yr_unit[j] 
Zri2 = 2 x Zr_unit[j] 
Xri3 = 2 x Xr_unit[j]
Yri3 = 2 x Yr_unit[j] + 1
Zri3 = 2 x Zr_unit[j] 
Xri4 = 2 x Xr_unit[j] + 1
Yri4 = 2 x Yr_unit[j] + 1
Zri4 = 2 x Zr_unit[j] 
Xri5 = 2 x Xr_unit[j] 
Yri5 = 2 x Yr_unit[j] 
Zri5 = 2 x Zr_unit[j] + 1
Xri6 = 2 x Xr_unit[j] + 1
Yri6 = 2 x Yr_unit[j] 
Zri6 = 2 x Zr_unit[j] + 1
Xri7 = 2 x Xr_unit[j]
Yri7 = 2 x Yr_unit[j] + 1
Zri7 = 2 x Zr_unit[j] + 1
Xri8 = 2 x Xr_unit[j] + 1
Yri8 = 2 x Yr_unit[j] + 1
Zri8 = 2 x Zr_unit[j] + 1
である。
【０１６７】
頭部ロボット単位決定用の開始位置の集合をSU、目標位置の集合をGUとする。開始位置の集合SU,目標位置の集合GUは、ロボット単位と同様に8つのロボット位置が一単位となったマスで構成される。GU内には一つの入口位置単位PeUが設けられ、各ロボットは、PeU内の位置を経由してGU内に入る。なお、移動先隊列決定用動作計画にて使用するロボット単位の総数は、開始位置の集合SU及び目標位置の集合GU内のロボット単位の数と同じでなければならない。よって、ロボットの全体数pを8の倍数とし、開始位置の集合SU及び目標位置の集合GUにおいて、全てのロボット単位は8台のロボットが充填され、端数のロボットは生じないものとする。また目標位置の集合GU及び開始位置の集合SUはそれぞれR個の位置単位からなる一塊の任意の形状を成す。
【０１６８】
[移動先隊列決定用動作計画]
本実施形態では、ロボットが動作を開始する前にあらかじめ、２つの動作計画のために使用する任務空間内の各位置単位の入口位置単位PeUからのマンハッタン距離の計算を行う。そのために、まず、任務空間内の各位置単位（X,Y,Z）にて、入口位置単位PeUからの各位置単位へのマンハッタン距離δ[X][Y][Z]を以下の計算手続きで求める。なお、以下において、説明を簡単にするため「位置単位」を単に「位置」ともいい、「入口位置単位PeU」を単に「入口位置Pe」ともいう。
【０１６９】
[マンハッタン距離δの計算]
(1)各位置（X,Y,Z）において、next[a][X][Y][Z]を用意し、隣接する行動aの方向に障害物があるか、もしくは位置（X,Y,Z）が入口位置Pe以外の目標位置の集合GU内の位置の場合に、隣接する行動aの方向の位置が目標位置の集合GUの外であるか、もしくは位置（X,Y,Z）が目標位置の集合GU外の場合に、隣接する行動aの方向の位置が入口位置Pe以外の目標位置の集合GU内の位置である場合には、next[a][X][Y][Z]←0とし、それ以外の場合はnext[a][X][Y][Z]←１とする。すなわち、next[a][X][Y][Z]=0は位置（X,Y,Z）において行動aを実行できないことを、next[a][X][Y][Z]=1は位置（X,Y,Z）において行動aを実行できることを意味する。
(2)状態空間内の各位置（X,Y,Z）のマンハッタン距離δ[X][Y][Z]を状態空間内の格子数より大きな値s_maxに初期化する。
(3)入口位置Peのマンハッタン距離δを0に初期化する。
(4)入口位置Pe以外の、各位置（X,Y,Z）の全行動aについて、next[a][X][Y][Z]の値が0ではない場合の、行動aによって位置(X,Y,Z)から移動した先の位置（X’,Y’,Z’）でのマンハッタン距離δ[X’][Y’][Z’]を調べ、その最小値に１を加えた値が、現在のδ[X][Y][Z]よりも小さい場合は、その値をδ[X][Y][Z]に代入する。
(5)上述の(4)の処理にて、δ[X][Y][Z]値の更新がなくなるまで、(4)を繰り返す。
【０１７０】
以上の処理で計算したマンハッタン距離δ[X][Y][Z]を使用し、続いて開始位置の集合SUと目標位置の集合GUをつなぐパスPを決定する。パスPの決定は以下の処理によってなされる。パスPをなす位置をp[ip](ip=0,1,2,3…)とする。
【０１７１】
[パスPの決定]
(1)開始位置の集合SU内にて、最もマンハッタン距離δ[X][Y][Z]値の小さな位置をPsとする。
(2)位置Psに隣接し、位置Psにおけるマンハッタン距離δよりも１だけ小さなマンハッタン距離δを持つ開始位置の集合SUの外の位置をパスPの始点p[0]とする。
(3)ip←0とする。
(4)位置p[ip]に隣接する位置の中で、位置p[ip]におけるマンハッタン距離δよりも１だけ小さなマンハッタン距離δを持つ位置をp[ip+1]とする。もし、p[ip+1]が入口位置Peに一致しないならば、ipをインクリメントし、(4)を繰りかえす。一致する場合は(5)へ移行する。
(5)目標位置の集合GU及びパスPの何れにも含まれない全ての位置のマンハッタン距離δをs_maxに再設定する。
(6)開始位置の集合SU内の全ての位置(X,Y,Z)の全行動aについて、next[a][X][Y][Z]の値が0ではない場合の、行動aによって位置(X,Y,Z)から移動した先の位置（X’,Y’,Z’）でのマンハッタン距離δ[X’][Y’][Z’]を調べ、その最小値に１を加えた値が、現在のδ[X][Y][Z]よりも小さい場合は、その値をδ[X][Y][Z]に代入する。
(7)上述の(6)の処理にて、δ[X][Y][Z]値の更新がなくなるまで、(6)を繰り返す。
(8)目標位置の集合GU内の全ての点のマンハッタン距離δの符号を負にする。この処理により、目標位置の集合GU内では、入口位置Peより離れるほどマンハッタン距離δが小さくなる。
【０１７２】
以上の処理で計算されたマンハッタン距離δは、SU+P+GUの中のみでのロボットの移動を考慮したマンハッタン距離の値となる。マンハッタン距離δを使用して、ある隊列Gaをなすロボット単位の群が、つぎに移動すべき隊列Gbの頭部ロボットを決定する方法は以下のとおりである。本処理を、頭部決定処理Head_Robot_Decisionとする。。なお、以上の処理で計算されたマンハッタン距離δが第一実施形態の価値関数に相当し、ロボット単位がそのロボット単位の現在の位置単位において各行動を取ったときの適切さを表す。具体的には、マンハッタン距離δが小さくなる方向に移動するようにロボット単位を制御する。よって、第一実施形態の価値関数に相当する価値関数（ロボット単位がそのロボット単位の現在の位置単位において各行動を取ったときの適切さを表す１個の価値関数）が、ある位置単位から入口位置単位までのマンハッタン距離を用いて得られると言える。
【０１７３】
[Head_Robot_Decision]
(1)各ロボット単位の位置（Xr_unit[j],Yr_unit[j],Zr_unit[j]）において、位置（Xr_unit[j],Yr_unit[j],Zr_unit[j]）に隣接し、かつロボットが存在しておらず、かつパスP及び目標位置の集合GUの何れかに属する位置の中で、マンハッタン距離δ[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]の値より1小さい、マンハッタン距離δをもつ位置を求め、その位置のマンハッタン距離δをδ_neighbor_max[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]とする。
(2)全ロボット単位中で最大のδ_neighbor_max[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]の値を持つロボット単位H(なお、ロボット単位Hの位置を（Xrh,Yrh,Zrh）とする)を選択し、ロボット単位Hに隣接し、かつロボットが存在しておらず、かつパスP及び目標位置の集合GUの何れかに属する位置の中で、マンハッタン距離δがロボット単位Hのそれより１小さいマンハッタン距離δをもつ位置を頭部ロボット単位Dの位置とする。ロボット単位Hから頭部ロボット単位Dの位置に向かう行動の方向をa_headとする。
【０１７４】
以上の処理では、目標位置の集合GU外にしかロボット単位が存在しないときに、ロボットの群れがパスPを通して入口位置Peに近づいていくか、もしくは、目標位置の集合GU内にロボット単位が存在するときには、入口位置Peに近い位置から優先的にロボットを埋めていけるように、頭部ロボット単位Dを選択している。
【０１７５】
続いて、尾部ロボット単位位置を決定するための手法Tail_Robot_Decisionを述べる。
【０１７６】
[Tail_Robot_Decision]
(1)各ロボット単位位置（Xr_unit[j],Yr_unit[j],Zr_unit[j]）において、
δ'[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]
=δ[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]-δ[Xrh][Yrh][Zrh]
を計算する。
(2)各ロボット単位位置（Xr_unit[j],Yr_unit[j],Zr_unit[j]）において、隣接する全てのロボット単位N（なお、ロボット単位Nの位置を(Xrn,Yrn,Zrn)とする）について、δ'[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]≧δ'[Xrn][Yrn][Zrn]を満たし、かつ、δ'[Xr_unit[j]][Yr_unit[j]][Zr_unit[j]]≧3であるロボット単位の何れか一つを尾部ロボット単位Tとして選択する。つまり、尾部ロボット単位Tは、隣接する全てのロボット単位N以上にロボット単位Hから離れており、かつ、ロボット単位Hから3マス単位以上離れている（ロボット単位Hと尾部ロボット単位Tとのマンハッタン距離が３マス単位以上離れている）。
【０１７７】
以上の処理では、隊列Gaより取り払ったとしても、隊列Gaの連続性を失わないロボット単位を尾部ロボット単位として設定している。
【０１７８】
以上の処理をまとめて、以下のように、移動先隊列決定用動作計画処理（Next_Formation_Decision）が行われる。
(1)頭部決定処理Head_Robot_Decisionを行う。
(2)尾部ロボット決定処理Tail_robot_Decisionを行う。
(3)上述の(2)にて特定した尾部ロボット単位Tを、現在の隊列Gaから削除し、隊列Gaに頭部ロボット単位Dを追加し、隊列Gbとする。
【０１７９】
[各ロボット動作決定用動作計画]
移動先隊列決定用動作計画において頭部ロボット単位Dと尾部ロボット単位Tが決定され、次の隊列Gbが決定されたので、現隊列Gaから次隊列Gbへの変形を各ロボットの移動によって実現するための探索計算を各ロボット動作決定用動作計画にて行う。
【０１８０】
本実施形態では、８つのロボットを組にしたロボット単位を維持しつつロボット群が移動を行うようにしているので、ボイド制御を行う際の、各ロボットの接続維持を考える際には、尾部ロボット単位Tと頭部ロボット単位D付近でのボイドの動きにさえ気を配れば、それ以外は、ボイドが各ロボット単位内に１つ以内であるようにすればよい。
【０１８１】
以下、各ロボット動作決定用動作計画の動作について述べる。ロボット動作決定用動作計画においては、ロボット単位Hから頭部ロボット単位Dへロボット単位を移動させるたびに、８つのボイドが発生するので、まずは、それら発生した各々のボイドについてそのボイドがロボット単位Hから尾部ロボット単位Tまでたどるべき経路を計算する。
【０１８２】
まず、ロボット単位Hに所属するロボットのうち、頭部ロボット単位Dに接した位置にある４つのロボットをロボットi_move_11,i_move_21,i_move_31,i_move_41とし、ロボットi_move_11,i_move_21,i_move_31,i_move_41と行動a_headの移動方向の逆方向に接しているロボットをそれぞれ、ロボットi_move_12,i_move_22, i_move_32,i_move_42と順序付けする。
【０１８３】
ロボット単位Hから頭部ロボット単位Dへの移動においては、ロボット単位H内のロボットi_move_r1(rは1,2,3,4の何れか)とロボットi_move_r2がペアとなって、a_head方向にスライドすることで、ロボットが移動する。そのため、ロボット単位H内にて発生するボイドの位置は、かならずロボットi_move_12,i_move_22, i_move_32,i_move_42のいずれかとなる。ロボットが開始位置の集合SUから目標位置の集合GUへの隊列形成動作を開始してからの発生ボイドの通し番号をiv(=0,1,2,3…)で管理し、フル充填されたロボット単位Hから頭部ロボット単位Dへのロボットの移動が開始されたときに、それまでに発生しているボイドの数をiv_prevとすれば、iv_prevは、(8の倍数-1)である。ロボット単位Hから頭部ロボット単位Dへの移動で発生するボイドをvoid[iv_prev+k](k=1,2,3,4,5,6,7,8)とする。各ボイドの軌道を( void_trj_x[iv_prev+k][t], void_trj_y[iv_prev+k][t] , void_trj_z[iv_prev+k][t] ) (t=0,1,2,3…)で表現する。
【０１８４】
各ボイドの軌道計算処理（Void_Trajectory_Decision）は、以下の手順で行われる。
【０１８５】
[Void_Trajectory_Decision]
(1)各ボイドの発生位置を以下のようにする。
void[iv_prev+1]、void[iv_prev+2]の発生位置→ロボットi_move_12の位置
void[iv_prev+3]、void[iv_prev+4]の発生位置→ロボットi_move_22の位置
void[iv_prev+5]、void[iv_prev+6]の発生位置→ロボットi_move_32の位置
void[iv_prev+7]、void[iv_prev+8]の発生位置→ロボットi_move_42の位置
(2)各ボイドの発生位置を各ボイドの軌道の終点void_end[iv_prev]とする。
(3)上述の(1)で発生位置を設定した８つのボイドがロボット単位Hの位置から尾部ロボット単位Tの位置までたどるべき位置単位の道筋を(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])  (tu=0,1,2,3…)とし、後述するVoid_Unit_Trajectory_Decisionにて(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])を決定する。tuの値は、Tから近い方の道筋上の点で０としてHに近づくにつれて大きくなるようにボイドの動きと逆向きに設定する。
(4)(void_unit_trj_x[1], void_unit_trj_y[1], void_unit_trj_z[1])をT'、 (void_unit_trj_x[2], void_unit_trj_y[2], void_unit_trj_z[2])をT"とする。T'は尾部ロボット単位Tに隣接するロボット単位であり、T"はロボット単位T'に隣接するロボット単位である。
(5)ロボット単位T'内にあり、尾部ロボット単位T内の位置に接しない位置にある４つのロボットをロボットi_tail_0,i_tail_1,i_tail_2,i_tail_3とし、各ボイドの目標位置を以下のように設定する。
void[iv_prev+1]、void[iv_prev+2]の目標位置→ロボットi_tail_0の位置
void[iv_prev+3]、void[iv_prev+4]の目標位置→ロボットi_tail_1の位置
void[iv_prev+5]、void[iv_prev+6]の目標位置→ロボットi_tail_2の位置
void[iv_prev+7]、void[iv_prev+8]の目標位置→ロボットi_tail_3の位置
(6)ロボット単位T"内における各ボイドの発生位置と同じ位置（ロボット単位Hをロボット単位T"の位置に平行移動させた場合のロボット単位H内の各ボイドの発生位置）から、ロボット単位T'内の各ボイド目標位置までの軌道( void_trj_x[iv_prev+k][t], void_trj_y[iv_prev+k][t] , void_trj_z[iv_prev+k][t] )を後述するVoid_Local_Trajectroy_Decisionで決定する。tの値は、ロボット単位T'内の目標位置で０としてロボット単位T"内各ボイド発生位置に近づくにつれて大きくなるようにボイドの動きと逆向きに設定する。
(7)上述の(6)で決定された軌道( void_trj_x[iv_prev+k][t], void_trj_y[iv_prev+k][t] , void_trj_z[iv_prev+k][t] )の終点(t=tsとする。)から、ロボット単位Hの位置内のボイド発生位置に至る軌道を(8)以下の処理で設定する。
(8)it←2とする。
(9)(void_unit_trj_x[2+it/2-1], void_unit_trj_y[2+it/2-1], void_unit_trj_z[2+it/2-1])がロボット単位Hの位置に一致していないならば、(void_unit_trj_x[2+(it)/2-1], void_unit_trj_y[2+(it)/2-1], void_unit_trj_z[2+(it)/2-1])から(void_unit_trj_x[2+it/2], void_unit_trj_y[2+it/2], void_unit_trj_z[2+it/2])へ移動する方向に、( void_trj_x[iv_prev+k][ts+it-2], void_trj_y[iv_prev+k][ts+it-2] , void_trj_z[iv_prev+k][ts+it-2] )から１ステップ移動した位置を( void_trj_x[iv_prev+k][ts+it-1], void_trj_y[iv_prev+k][t+it-1] , void_trj_z[iv_prev+k][t+it-1] )とし、２ステップ移動した位置を( void_trj_x[iv_prev+k][ts+it], void_trj_y[iv_prev+k][ts+it] , void_trj_z[iv_prev+k][ts+it] )とし、itを2回インクリメントする。(void_unit_trj_x[2+it/2-1], void_unit_trj_y[2+it/2-1], void_unit_trj_z[2+it/2-1])がロボット単位Hの位置に一致するまで(9)を繰り返す。(void_unit_trj_x[2+it/2-1], void_unit_trj_y[2+it/2-1], void_unit_trj_z[2+it/2-1])がロボット単位Hの位置に一致しているならば、軌道内点数trj_num[iv_prev+k]←ts+it-2として終了する。
【０１８６】
[Void_Local_Trajectroy_Decision]
Void_Local_Trajectroy_Decisionの処理は、以下のとおりである。まず、ロボットが動作を開始する前に、あらかじめ、以下の6つの位置関係にある尾部ロボット単位T及びロボット単位T'において、ロボット単位T'に5通りのロボット単位T"[kt](kt=1,2,3,4,5)が接しているとして、ロボット単位T'内の尾部ロボット単位Tに接しない位置とロボット単位T"の全ての位置について、ロボット単位T'内の尾部ロボット単位Tに接しない4つの位置からのマンハッタン距離δlocal[vs][al](X,Y,Z)(vs=0,1,2,3。 al=1,2,3,4,5,6)を全て計算する。ここでは、ロボット単位ではなく、ロボットのマンハッタン距離を求める。なお、alはロボット単位Tの位置からロボット単位T'の位置に向かう６つの方向の行動であり、vsはロボット単位T'内の尾部ロボット単位Tに接しない4つのロボット(その位置)のインデックスである。
【０１８７】
(1)al=1, T=(0,0,0), T'=(1,0,0), T"[1]=(1,1,0),  T"[2]=(1,-1,0) , T"[3]=(2,0,0), T"[4]=(1,0,1), T"[5]=(1,0,-1)
(2)al=2, T=(0,0,0), T'=(0,1,0) , T"[1]=(1,1,0),  T"[2]=(-1,1,0) ,T"[3]=(0,2,0), T"[4]=(0,1,1), T"[5]=(0,1,-1)
(3)al=3, T=(0,0,0),T'=(-1,0,0) ,T"[1]=(-1,1,0),  T"[2]=(-1,-1,0) , T"[3]=(-2,0,0),  T"[4]=(-1,0,1), T"[5]=(-1,0,-1)
(4)al=4, T=(0,0,0),T'=(0,-1,0) ,T"[1]=(1,-1,0), T"[2]=(-1,-1,0) , T"[3]=(0,-2,0),  T"[4]=(0,-1,1), T"[5]=(0,-1,-1)
(5)al=5, T=(0,0,0),T'=(0,0,1) ,T"[1]=(0,1,1), T"[2]=(0,-1,1) , T"[3]=(0,0,2), T"[4]=(1,0,1), T"[5]=(-1,0,1)
(6)al=6, T=(0,0,0),T'=(0,0,-1) ,T"[1]=(0,1,-1), T"[2]=(0,-1,-1) , T"[3]=(0,0,-2), T"[4]=(1,0,-1), T"[5]=(-1,0,-1)
以下、δlocal[vs][al](X,Y,Z)の計算方法を示す。
【０１８８】
[Calculate_delta_local]
(1)ロボット単位T'内の尾部ロボット単位Tに接しない位置とロボット単位T"の全ての位置（X,Y,Z）において、next_local[al][a][X][Y][Z]を用意し、位置（X,Y,Z）に隣接するロボット単位T'内の尾部ロボット単位Tに接しない位置か、ロボット単位T"内の位置があるならば、next_local[al][a][X][Y][Z]←１とし、それ以外の場合はnext_local[al][a][X][Y][Z]←0とする。
(2)ロボット単位T'内の尾部ロボット単位Tに接しない位置とロボット単位T"の全ての位置(X,Y,Z）について、各位置(X,Y,Z）のδlocal[vs][al](X,Y,Z)値を44(T'内4つ、T"内8x5つの位置の数)より大きな値s_maxに初期化する。
(3)各vs,alについて、以下の位置を目標位置target_local[vs][al]とし、目標位置でのマンハッタン距離δlocal[vs][al] (24通り)を0に初期化する。
target_local[0][1]＝（3,0,0）
target_local[1][1]＝（3,0,1）
target_local[2][1]＝（3,1,0）
target_local[3][1]＝（3,1,1）
target_local[0][2]＝（0,3,0）
target_local[1][2]＝（0,3,1）
target_local[2][2]＝（1,3,0）
target_local[3][2]＝（1,3,1）
target_local[0][3]＝（-2,0,0）
target_local[1][3]＝（-2,0,1）
target_local[2][3]＝（-2,1,0）
target_local[3][3]＝（-2,1,1）
target_local[0][4]＝（0,-2,0）
target_local[1][4]＝（0,-2,1）
target_local[2][4]＝（1,-2,0）
target_local[3][4]＝（1,-2,1）
target_local[0][5]＝（0,0,3）
target_local[1][5]＝（0,1,3）
target_local[2][5]＝（1,0,3）
target_local[3][5]＝（1,1,3）
target_local[0][6]＝（0,0,-2）
target_local[1][6]＝（0,1,-2）
target_local[2][6]＝（1,0,-2）
target_local[3][6]＝（1,1,-2）
(4)目標位置target_local[vs][al]以外の、各位置（X,Y,Z）の全行動aについて、next_local[al][a][X][Y][Z]の値が0ではない場合の、δlocal[vs][al](X,Y,Z)の値を調べ、その最小値に１を加えた値が、現在のδlocal[vs][al](X,Y,Z)よりも小さい場合は、その値をδlocal[vs][al](X,Y,Z)に代入する。δlocal[vs][al](X,Y,Z)値の更新がなくなるまで、(4)を繰り返す。
【０１８９】
Void_Local_Trajectory_Decisionの処理は以下のとおりである。
【０１９０】
[Void_Local_Trajectroy_Decision]
(1)ロボット単位T'の位置を（XT',YT',ZT'）、ロボット単位T"の位置を（XT",YT",ZT"）として、T->T’に向かう方向の行動をal値とする。。i_tail_0の位置をtarget_local[0][al](vs=0とする), i_tail_1の位置をtarget_local[1][al] (vs=1とする), i_tail_2の位置をtarget_local[2][al] (vs=2とする), i_tail_3の位置をtarget_local[3][al] (vs=3とする)とする。
(2)各ボイドvoid[iv_prev+k]の発生位置を(xv[iv_prev+k],yv[iv_prev+ｋ],zv[iv_prev+k])として、ロボット単位T"内の位置vt"を以下のように計算する。
【０１９１】
ロボット単位T'からロボット単位T"への移動量ベクトルの値を(Xdt,Ydt,Zdt)= (XT",YT",ZT")-(XT',YT',ZT')として、
If al=1, 
vt"←(xv[iv_prev+k]-xrh*2+2+Xdt*2, yv[iv_prev+k]-yrh*2+Ydt*2, zv[iv_prev+k]-zrh*2+Zdt*2)
If al=2, 
vt"←(xv[iv_prev+k]-xrh*2+Xdt*2, yv[iv_prev+k]-yrh*2+2+Ydt*2, zv[iv_prev+k]-zrh*2+Zdt*2)
If al=3, 
vt"←(xv[iv_prev+k]-xrh*2-2+Xdt*2, yv[iv_prev+k]-yrh*2+Ydt*2, zv[iv_prev+k]-zrh*2+Zdt*2)
If al=4, 
vt"←(xv[iv_prev+k]-xrh*2+Xdt*2, yv[iv_prev+k]-yrh*2-2+Ydt*2, zv[iv_prev+k]-zrh*2+Zdt*2)
If al=5, 
vt"←(xv[iv_prev+k]-xrh*2+Xdt*2, yv[iv_prev+k]-yrh*2+Ydt*2, zv[iv_prev+k]-zrh*2+2+Zdt*2)
If al=6, 
vt"←(xv[iv_prev+ｋ]-xrh*2+Xdt*2, yv[iv_prev+ｋ]-yrh*2+Ydt*2, zv[iv_prev+ｋ]-zrh*2-2+Zdt*2)
(3)tl←0とし、vt"の位置を(void_local_x[iv_prev+k][tl], void_local_y[iv_prev+k][tl], void_local_z[iv_prev+k][tl])とする。
(4)位置(void_local_x[iv_prev+k][tl], void_local_y[iv_prev+k][tl], void_local_z[iv_prev+k][tl])が、target_local[vs][al]に一致しないとき、
位置(void_local_x[iv_prev+k][tl], void_local_y[iv_prev+k][tl], void_local_z[iv_prev+k][tl])に隣接し、δlocal[vs][al]の値が(void_local_x[iv_prev+k][tl], void_local_y[iv_prev+k][tl], void_local_z[iv_prev+k][tl])の位置のδlocal[vs][al]の値より小さい位置を(void_local_x[iv_prev+k][tl+1], void_local_y[iv_prev+k][tl+1], void_local_z[iv_prev+k][tl+1])とし、tlをインクリメントする。(void_local_x[iv_prev+k][tl], void_local_y[iv_prev+k][tl], void_local_z[iv_prev+k][tl])が、target_local[vs][al]に一致するまで(4)を繰り返す。位置(void_local_x[iv_prev+k][tl], void_local_y[iv_prev+k][tl], void_local_z[iv_prev+k][tl])が、target_local[vs][al]に一致するとき、(5)へ移行する。
(5)( void_trj_x[iv_prev+k][t], void_trj_y[iv_prev+k][t] , void_trj_z[iv_prev+k][t] )← (void_local_x[iv_prev+k][tl-t], void_local_y[iv_prev+k][tl-t], void_local_z[iv_prev+k][tl-t])とし、ts←tlとする。
【０１９２】
Void_Unit_Trajectory_Decisionの処理は以下のとおりである。
【０１９３】
[Void_Unit_Trajectory_Decision]
(1)尾部ロボット単位Tの位置を(void_unit_trj_x[0], void_unit_trj_y[0], void_unit_trj_z[0])とする。tu←１とし、尾部ロボット単位Tよりも小さなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])とする。
(2)もし、(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])が入口位置Peでもロボット単位Hでなければ、tuをインクリメントし、位置(void_unit_trj_x[tu-1], void_unit_trj_y[tu-1], void_unit_trj_z[tu-1])にあるロボット単位よりも小さなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])とする。(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])が入口位置Peまたはロボット単位Hの位置になるまで(2)を繰り返す。
【０１９４】
もし、(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])が入口位置Pe(Hでなく)の場合は、(3)へ移行する。
【０１９５】
もし、(void_unit_trj_x[tu], void_unit_trj_y[tu], void_unit_trj_z[tu])がロボット単位Hの位置の場合は、Void_Unit_Trajectory_Decisionを終了する。
(3)ロボット単位Hの位置を(void_unit_trj_rev_x[0], void_unit_trj_rev_y[0], void_unit_trj_rev_z[0])とする。tr←１とし、ロボット単位Hよりも大きなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])とする。
(4)もし、(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])が入口位置Peでなければ、trをインクリメントし、位置(void_unit_trj_rev_x[tr-1], void_unit_trj_rev_y[tr-1], void_unit_trj_rev_z[tr-1]) にあるロボット単位よりも大きなマンハッタン距離δを持つ隣接のロボット単位の位置を(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])とする。(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])が入口位置Peになるまで(4)を繰り返す。
【０１９６】
もし、(void_unit_trj_rev_x[tr], void_unit_trj_rev_y[tr], void_unit_trj_rev_z[tr])が入口位置Peの場合は、(5)へ移行する。
(5)it=1,,,trとして、(void_unit_trj_x[tu+it], void_unit_trj_y[tu+it], void_unit_trj_z[tu+it])←(void_unit_trj_rev_x[tr-it], void_unit_trj_rev_y[tr-it], void_unit_trj_rev_z[tr-it])とする。
【０１９７】
[ボイド移動制御]
以下、上記の各ロボット動作決定用動作計画を使用して、ボイドをロボット単位Hの位置から尾部ロボット単位Tの位置に移動させる制御方法を示す。図３１に示すように、ロボット単位H内の頭部ロボット単位Dに接する位置のロボットと、ロボット単位T'内の尾部ロボット単位Tに接する位置にあるロボット位置に空白が生じないように、ロボット単位Hでのボイド発生と尾部ロボット単位Tでのボイド追い出しをしていることで、ロボット群全体の接続は保たれている。ロボット単位Hとロボット単位T'が直接、接しないように、尾部ロボット単位Tの選択アルゴリズムにおいて、尾部ロボット単位Tの位置のδ'(ロボット単位Hと尾部ロボット単位Tとのマンハッタン距離)が3以上という条件を設定している。本制御方法で、各ロボット単位内において、ボイドが一つ以内に収まるように制御されている。
【０１９８】
以下を目標位置の集合GUが満たされるまで、繰り返す。
【０１９９】
[Void_Control]
(1)Void_Trajectory_Decisionを実行する。trj_cnt[iv_prev+1],,, trj_cnt[iv_prev+8],を-1にする。iv_prevの値を8回インクリメントする。
(2)以下をvoid[iv_prev]がロボット単位Hの外に出るまで繰り返す。
【０２００】
発生番号の大きいもの（iv=iv_prev）から以下の処理をする。
【０２０１】
(2-i)trj_cnt[iv]=-10のとき→void[iv]について何もしない。
【０２０２】
(2-ii)trj_cnt[iv]< trj_num[iv] && trj_cnt[iv]>=0のとき→
i= trj_cnt[iv]からtrj_num[iv]まで以下を行う：
位置nv(void_trj_x[trj_num[iv]-i-1],void_trj_y[trj_num[iv]-i-1], void_trj_z[trj_num[iv]-i-1])が含まれるロボット単位Nvに他のvoidがないこと、自分より番号の小さいvoidが、すべてロボット単位Nvよりもマンハッタン距離δの大きいロボット単位に所属していることを確認する。確認できたなら、nvの位置にあるロボットを位置(void_trj_x[trj_num[iv]-i],void_trj_y[trj_num[iv]-i],void_trj_z[trj_num[iv]-i])に移動させる。
【０２０３】
trj_cnt[iv]をインクリメントし、確認できなくなるまで処理を繰り返し、確認できないならなにもせず、ループ終了する。
【０２０４】
(2-iii)trj_cnt[iv]＝trj_num[iv]のとき→
現在のvoid[iv]の位置から、alの方向の逆方向に隣接していて、たどれるロボットを全て、al方向に1ステップ移動させて、trj_cnt[iv]←‐10とする。
【０２０５】
(2-iv)trj_cnt[iv]=‐1のとき→
ロボット単位Hが８つのロボットで満たされている場合、void[iv]の発生位置にあるロボットと、そのロボットに行動a_headの方向で隣接しているロボット、さらにその先にa_headの方向で隣接しているロボットがあればそのロボットを皆まとめて、a_headの方向に1ステップ移動させる。trj_cnt[iv]←0とする。満たされてない場合なにもしない。
【０２０６】
以上の手法によるロボットの隊列形成は、24個以上のロボット単位で構成される任意の形状の開始位置の集合SU、、目標位置の集合GUのロボット群に適用可能である。
【０２０７】
＜第二実施形態に係る行動制御システム２００＞
第二実施形態に係る行動制御システム２００は、以上に説明した各処理によって構成される全体動作について以下にまとめる。
(1)移動先隊列決定用動作計画のために使用するマンハッタン距離δ（各位置単位から入口位置単位PeUまでのマンハッタン距離）を計算する。尾部ロボット単位近辺のロボット動作計画に使用するマンハッタン距離δlocalをCalculate_delta_localを実行し計算する。
(2)以下(3),(4)を全GU内にロボットが充填されるまで繰り返す。
(3)移動先隊列決定用動作計画処理Next_Formation_Decisionを実行する。
(4)各ロボット動作決定用動作計画処理を実行する。
【０２０８】
以下、これらの処理を実行する構成について説明する。
【０２０９】
図３２は第一実施形態に係る行動制御システム２００の機能ブロック図を、図３３はその処理フローの例を示す。行動制御システム２００は、図３２に示すように、動作計画部２１０と、行動選択部２２０と、隣接状態判定部１２４と、位置更新部１２３と、位置判定部１２６と、記憶部２４０と、通信部１５０と、入力部１６０とを含む。行動選択部２２０は移動先隊列決定用動作計画部２２１と各制御対象物動作用動作計画部２２２とを含む。第一実施形態と異なる部分である動作計画部２１０と、行動選択部２２０と、記憶部２４０を中心に説明する。他の部分については、第一実施形態と同様の処理を行う。ただし、通信部１５０及び隣接状態判定部１２４では、二次元平面上の上下左右方向ではなく、三次元空間上の上下左右前後方向(以下「６方向」ともいう)において、通信を行ったり、隣接状態を判定したりする。
【０２１０】
本実施形態では、行動制御システム２００は、p(pは、192以上の整数の何れかであって、８の倍数)台のロボットの行動を制御し、p台のロボットの内の１つのロボット上に実装される。
【０２１１】
＜動作計画部２１０＞
動作計画部２１０は、上述の[マンハッタン距離δの計算]及び[パスPの決定]で説明した方法により、開始位置の集合SU、目標位置の集合GU及びパスPの何れかの各位置から入口位置Peまでのマンハッタン距離δを、ロボットの任務行動開始前に事前に計算し（Ｓ２１０）、記憶部１４０に格納する。ただし、目標位置の集合の各位置から入口位置Peまでのマンハッタン距離δは、その符号を負とする。また、開始位置の集合SU、目標位置の集合GU及びパスPの何れにも含まれない全ての位置のマンハッタン距離δをs_max（状態空間内の格子数より大きな値）として記憶部１４０に格納する。また、同様にロボットの任務行動開始前にCalculate_delta_localを実行し、尾部ロボット単位近辺のロボット動作計画に使用するマンハッタン距離δlocalを計算する。なお、別装置でマンハッタン距離δを計算しておき、ロボットの任務行動開始前に事前に記憶部１４０に格納しておけば、行動制御システム１００は、動作計画部２１０を備えなくともよい。
【０２１２】
＜記憶部２４０＞
記憶部２４０には、各位置sから入口位置Peまでのマンハッタン距離δと、尾部ロボット単位近辺のロボット動作計画用マンハッタン距離δlocalが記憶されているとする。sの取りうる範囲は、対象となる三次元空間上の領域内のロボット単位が存在しうる全ての座標である。
【０２１３】
＜行動選択部２２０＞
行動選択部２２０は、記憶部２４０からマンハッタン距離δ、δlocalを取り出す。
【０２１４】
行動選択部２２０は、上述の方法で説明した方法で、p台のロボットを制御する（ｓ２２０）。
【０２１５】
行動選択部２２０の移動先隊列決定用動作計画部２２１は、マンハッタン距離δを用いて、移動先隊列決定用動作計画処理Next_Formation_Decisionを行い（ｓ２２１）、開始位置の集合に配置されたp台のロボットを目標位置の集合に移動させる際に、頭部ロボット単位が移動の先頭を務めるように、各位置単位におけるマンハッタン距離δを用いてある時刻の隊列Gaに対して隊列Gbを決定し、頭部ロボット単位及び尾部ロボット単位の位置を出力する。
【０２１６】
さらに、行動選択部２２０の各制御対象物動作用動作計画部２２２は、頭部ロボット単位及び尾部ロボット単位の位置を受け取り、マンハッタン距離δlocalを使って各ロボット動作用動作計画を行い（ｓ２２２−１）、頭部ロボット単位の位置に８台のロボットが位置するように、各ロボットに対して制御信号を送り、各ロボットの動作を制御する。各ロボットは制御信号に従って行動する。
【０２１７】
各ロボットは制御信号に従って行動する。
【０２１８】
なお、一回の行動制御により、１回の移動先隊列決定用動作計画処理Next_Formation_Decisionで決定された頭部ロボット単位を充填する処理が行われる。
【０２１９】
移動先隊列決定用動作計画処理Next_Formation_Decisionにおいて行われる頭部決定処理Head_Robot_Decisionの中で、各ロボット単位の位置や障害物位置を必要とするが、各ロボット単位の位置ついては前述の通り、取得可能である。また、障害物の位置に関しては、マンハッタン距離δを計算する際に利用した障害物の位置を利用してもよいし、隣接状態判定部１２４で判定した判定結果を用いて得られるものを利用してもよい。
【０２２０】
本実施形態により制御され、図２７Ａの開始位置の集合から図２７Ｂの目標位置の集合に変形する際のロボット群の遷移状態の例を図３４に示す。
【０２２１】
＜効果＞
このような構成により、第一実施形態と同様の効果を得ることができる。また、2次元平面上だけでなく、三次元空間上での制御対象物の制御が可能となる。
【０２２２】
＜変形例＞
本実施形態では、各格子（マス）は、立方体であるが、他の形状であってもよい。格子は左右方向、上下方向及び前後方向に連続して配置される。また、各格子は左右方向で他の二つの格子と隣接し、上下方向で他の二つの格子と隣接し、前後方向で他の二つの格子と隣接する。言い換えると、各格子は、ロボットの移動できる方向と同じ方向においてのみ、他の格子と隣接する。この条件を満たせば、各格子はどのような形状であってもよい。また、「直交」とは、厳密に「垂直に交わること」を意味しなくともよく、例えば、各格子は、平行六面体であってもよく、各格子が他の二つの格子と隣接する方向の一方を上下方向とし、他方を左右方向とすればよく、上下方向及び左右方向とからなる平面に対して平行でない方向を前後方向とすればよい。
【０２２３】
別の言い方をすると、制御対象物は、三次元空間上の、第一方向（例えば右方向）、第一方向に対して平行でない方向である第二方向（例えば上方向）、第一方向に対して反対方向である第三方向（例えば左方向）、第二方向に対して反対方向である第四方向（例えば下方向）、第一方向及び第二方向の成す平面に対して平行でない方向を第五方向（例えば前方向）、第五方向に対して反対方向である第六方向に移動可能であり、一回の行動制御により、現在いる領域（格子、マス）から、現在いる領域に対して、第一方向、第二方向、第三方向、第四方向、第五方向、第六方向において隣接する領域の何れかに移動するように制御される。また、この場合、ロボットの２次元平面上の、第一方向において隣接する位置を第一位置、第二方向において隣接する位置を第二位置、第三方向において隣接する位置を第三位置、第四方向において隣接する位置を第四位置、第五方向において隣接する位置を第五位置、第六方向において隣接する位置を第六位置と呼んでもよい。
【０２２４】
本実施形態では、行動制御システム１００が、p台のロボットの内の１つのロボット上に実装される例を示したが、コンピュータ上の制御対象物に対して行動制御を行ってもよい。その場合、意図的にトラブルを発生させない限り、制御した通りに制御対象物は移動するため、想定位置（Xr'[i],Yr'[i]）と移動後位置（Xr"[i],Yr"[i]）とが一致する。そのような状態で、各制御対象物i毎の理想的な行動計画を行ってもよい。その結果得られた任務を終了するまでの行動計画を実ロボットに実行させる。実ロボットは、通信部１５０と隣接状態判定部１２４を備え、各行動を終えた後に、隣接状態を判定し、判定結果を用いて、行動後位置を求め、行動後位置（Xr"[i],Yr"[i]）と想定位置（Xr'[i],Yr'[i]）とが一致するか否かを判定する。なお、一致しない場合には、移動するように制御されたロボットが何らかのトラブルにより、制御通りに移動できなかったと考えられる。その後の処理については第一実施形態と同様でもよいし、他の処理を行ってもよい。このような構成により、少なくとも制御通りに移動できなかったことを検知することができる。
【０２２５】
本実施形態では、一回の行動制御に対して、一回の位置判定を行っているが、一回の行動制御において、複数のロボットを移動させる場合には、各ロボットが移動の度に位置判定を行う構成としてもよい。
【０２２６】
本実施形態では、ロボット単位は、２×２×２の８台のロボットからなるが、M×N×Q台のロボットからなってもよい。ただし、M、N及びQはそれぞれ２以上の整数の何れかである。なお、ロボットの台数pはロボット単位に含まれるロボットの台数M×N×Qの24以上の倍数とする。つまり、p=M×N×Q×Rであり、Rは24以上の整数の何れかである。このような状態で移動を行った場合にも、２×２×２のロボット単位のときと同様に、ロボットの群れの中のいずれのロボットが一台欠けても、各ロボットはお互いに一つの辺で接しあう位置関係を崩さずに済む。M×N×Qの台数を大きくすると、ロボット単位の個数が減り、行動できるパターンが減るため、マンハッタン距離δの計算量が減る。しかし、M×N×Q個のマスを一つの単位とするマス単位の中に1つでも障害物が含まれる場合には、そのマス単位には移動できないものとして扱うため、M×N×Qの台数を大きくすると、移動できない範囲が多くなり、行動できる範囲が小さくなる。そもそも動作計画において、各位置から入口位置Peまでのマンハッタン距離を調べさえすればよいため、従来技術に比べれば、十分に計算量が減っている。そのため、行動できる範囲を大きく保つために２×２×２台のロボットを一つの単位とするロボット単位とすることが望ましい。
【０２２７】
＜その他の変形例＞
本発明は上記の実施形態及び変形例に限定されるものではない。例えば、上述の各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。その他、本発明の趣旨を逸脱しない範囲で適宜変更が可能である。
【０２２８】
＜プログラム及び記録媒体＞
また、上記の実施形態及び変形例で説明した各装置における各種の処理機能をコンピュータによって実現してもよい。その場合、各装置が有すべき機能の処理内容はプログラムによって記述される。そして、このプログラムをコンピュータで実行することにより、上記各装置における各種の処理機能がコンピュータ上で実現される。
【０２２９】
この処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、例えば、磁気記録装置、光ディスク、光磁気記録媒体、半導体メモリ等どのようなものでもよい。
【０２３０】
また、このプログラムの流通は、例えば、そのプログラムを記録したＤＶＤ、ＣＤ−ＲＯＭ等の可搬型記録媒体を販売、譲渡、貸与等することによって行う。さらに、このプログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することにより、このプログラムを流通させてもよい。
【０２３１】
このようなプログラムを実行するコンピュータは、例えば、まず、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、一旦、自己の記憶部に格納する。そして、処理の実行時、このコンピュータは、自己の記憶部に格納されたプログラムを読み取り、読み取ったプログラムに従った処理を実行する。また、このプログラムの別の実施形態として、コンピュータが可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することとしてもよい。さらに、このコンピュータにサーバコンピュータからプログラムが転送されるたびに、逐次、受け取ったプログラムに従った処理を実行することとしてもよい。また、サーバコンピュータから、このコンピュータへのプログラムの転送は行わず、その実行指示と結果取得のみによって処理機能を実現する、いわゆるＡＳＰ（Application Service Provider）型のサービスによって、上述の処理を実行する構成としてもよい。なお、プログラムには、電子計算機による処理の用に供する情報であってプログラムに準ずるもの（コンピュータに対する直接の指令ではないがコンピュータの処理を規定する性質を有するデータ等）を含むものとする。
【０２３２】
また、コンピュータ上で所定のプログラムを実行させることにより、各装置を構成することとしたが、これらの処理内容の少なくとも一部をハードウェア的に実現することとしてもよい。
【図１】
0006489923.tif 000002
【図２】
0006489923.tif 000003
【図３】
0006489923.tif 000004
【図４】
0006489923.tif 000005
【図５】
0006489923.tif 000006
【図６】
0006489923.tif 000007
【図７】
0006489923.tif 000008
【図８】
0006489923.tif 000009
【図９】
0006489923.tif 000010
【図１０】
0006489923.tif 000011
【図１１】
0006489923.tif 000012
【図１２】
0006489923.tif 000013
【図１３】
0006489923.tif 000014
【図１４】
0006489923.tif 000015
【図１５】
0006489923.tif 000016
【図１６】
0006489923.tif 000017
【図１７】
0006489923.tif 000018
【図１８】
0006489923.tif 000019
【図１９】
0006489923.tif 000020
【図２０】
0006489923.tif 000021
【図２１】
0006489923.tif 000022
【図２２】
0006489923.tif 000023
【図２３】
0006489923.tif 000024
【図２４】
0006489923.tif 000025
【図２５】
0006489923.tif 000026
【図２６】
0006489923.tif 000027
【図２７】
0006489923.tif 000028
【図２８】
0006489923.tif 000029
【図２９】
0006489923.tif 000030
【図３０】
0006489923.tif 000031
【図３１】
0006489923.tif 000032
【図３２】
0006489923.tif 000033
【図３３】
0006489923.tif 000034
【図３４】
0006489923.tif 000035