(57)【特許請求の範囲】
【請求項１】
計算処理システムであって、
複数の演算ノードおよび２つの前記演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行する計算実行部を備え、
前記複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、
前記計算実行部の計算結果および学習アルゴリズムを用いて、前記計算結果を変化させることなくトポロジーを変更するネットワーク更新部をさらに備える、計算処理システム。
【請求項２】
前記複数の演算ノードは、ノード変数を有する演算ノードを含み、
前記ネットワーク更新部は、前記計算結果の教師値からの誤差を計算し、前記誤差に対する前記ノード変数の寄与を計算し、前記寄与に基づいて前記ノード変数を修正する、請求項１に記載の計算処理システム。
【請求項３】
前記複数の演算ノードは、四則演算に対応する演算ノードを含む、請求項１に記載の計算処理システム。
【請求項４】
前記ネットワーク更新部は、前記ネットワークに対し、前記演算ノードの変更、追加または削除処理を行なう、請求項２に記載の計算処理システム。
【請求項５】
前記ネットワーク更新部は、出力値が所定の回数以上連続して変化しない前記演算ノードを一定の値を出力する定数ノードに変更する、請求項４に記載の計算処理システム。
【請求項６】
前記ネットワーク更新部は、前記複数の演算ノードの中から２以上の前記演算ノードをランダムに選択し、選択された前記演算ノードと接続される新たな前記演算ノードを生成する、請求項４に記載の計算処理システム。
【請求項７】
前記ネットワーク更新部は、
前記複数の演算ノードの中から第１の演算ノードと第２の演算ノードをランダムに選択し、
一定の値を出力する定数ノードを生成し、
前記第２の演算ノードから前記定数ノードに向かうエッジを生成し、
前記定数ノードおよび前記第２の演算ノードからの出力を受ける、入力されたすべてのエージェントの算術値の積をとるＭｕｌｔｉｐｌｉｃａｔｉｏｎノードを作成し、
前記Ｍｕｌｔｉｐｌｉｃａｔｉｏｎノードおよび前記第１の演算ノードからの出力を受ける、入力されたエージェントのすべての算術値の和をとるＡｄｄｉｔｉｏｎノードを作成し、
前記第１の演算ノードの接続先であった演算ノードを、前記Ａｄｄｉｔｉｏｎノードの接続先とする、請求項４に記載の計算処理システム。
【請求項８】
前記ネットワーク更新部は、
前記複数の演算ノードの中から第１の演算ノードをランダムに選択し、
過去の制御値の和が前記第１の演算ノードの過去の制御値の和よりも大きい前記複数の演算ノードの中から、第２および第３の演算ノードをランダムに選択し、
前記第２の演算ノードと前記第３の演算ノードとからの入力を受ける判断ノードを生成し、
前記第１の演算ノードの出力および前記判断ノードの第１の出力を受ける、制御値に対し演算を行なう第１のＲｅａｄノードを生成し、
前記第１の演算ノードの出力および前記判断ノードの第２の出力を受ける、制御値に対し演算を行なう第２のＲｅａｄノードを生成し、
前記第１の演算ノードの接続先であった各演算ノードに、前記第１および第２のＲｅａｄノードの演算結果を入力するエッジを生成する、請求項４に記載の計算処理システム。
【請求項９】
前記ネットワーク更新部は、各々一定の値を出力する複数の定数ノードを、結合法則により、１つの前記定数ノードに書き換える、請求項４に記載の計算処理システム。
【請求項１０】
前記ネットワーク更新部は、所定の回数以上連続して修正を受ける前記ノード変数をもつ前記演算ノードを分裂させる、請求項４に記載の計算処理システム。
【請求項１１】
前記ネットワーク更新部は、前記計算結果の関数として表わされ、前記誤差と２つのエラー係数とから定まるエネルギー誤差を計算し、前記寄与として前記ノード変数についての前記エネルギー誤差の微係数を計算し、前記変数から前記微係数に学習係数をかけた値を引いて前記変数を更新する、請求項２に記載の計算処理システム。
【請求項１２】
前記学習係数は、前記変数の更新により、前記エネルギー誤差が（１−η１ｐ）倍（η１ｐは、０より大きく１未満の実数）になるように定められた値である、請求項１１に記載の計算処理システム。
【請求項１３】
外部からの入力を受け付ける入力部と、
前記入力部が受け付けるプログラムに基づいて、前記ネットワークを作成するネットワーク作成部とをさらに備える、請求項１に記載の計算処理システム。
【請求項１４】
前記入力部が受け付けるプログラムは、高級言語で記述されたソースコードであり、
前記ネットワーク作成部は、前記ソースコードを言語非依存の中間コードに変換し、前記中間コードに基づいて前記ネットワークを作成する、請求項１３に記載の計算処理システム。
【請求項１５】
前記計算処理システムは、分散型の計算処理環境で動作する複数の計算処理装置を含み、
各前記計算処理装置が、前記計算実行部の実行する処理および前記ネットワーク更新部の行う処理を分散して処理する、請求項１に記載の計算処理システム。
【請求項１６】
計算処理システムを用いたプログラム作成方法であって、
前記計算処理システムが複数の演算ノードおよび前記演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行するステップを備え、
前記複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、
前記計算処理システムが前記計算の結果および学習アルゴリズムを用いて、前記ネットワークのトポロジーを、前記学習の結果を保存しつつ修正するステップをさらに備える、プログラム作成方法。
【請求項１７】
計算処理システムにプログラムを作成させるためのプログラム作成プログラムを記録したコンピュータ読取可能な記録媒体であって、
前記プログラム作成プログラムは、前記計算処理システムに複数の演算ノードおよび前記演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行させるステップを備え、
前記複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、
前記プログラム作成プログラムは、前記計算処理システムに前記計算の結果および学習アルゴリズムを用いて、前記ネットワークのトポロジーを、前記学習の結果を保存しつつ修正させるステップをさらに備える、コンピュータ読取可能な記録媒体。
【請求項１８】
計算処理システムにプログラムを作成させるためのプログラム作成プログラムであって、
前記計算処理システムに複数の演算ノードおよび前記演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行させるステップを備え、
前記複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、
前記計算処理システムに前記計算の結果および学習アルゴリズムを用いて、前記ネットワークのトポロジーを、前記学習の結果を保存しつつ修正させるステップをさらに備える、プログラム作成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを作成する計算処理システム、プログラム作成方法、および、プログラム作成プログラムに関する。
【背景技術】
【０００２】
現在、普及しているコンピュータの多くは、ノイマン型コンピュータである。ノイマン型コンピュータは、プログラムをデータとして記憶装置に格納し、記憶装置に格納されたプログラムを順番に読み込んで実行する。【０００３】
一方、非ノイマン型のコンピュータも存在する。非ノイマン型のコンピュータとしては、データフロー型のコンピュータ（例えば、非特許文献１参照）や、ニューロコンピュータ（例えば、非特許文献２参照）がある。【０００４】
データフロー型コンピュータは、演算を表わすノードと、演算間のデータ転送関係を表わすノード間のリンクとを含むグラフの形でプログラムを表わす。データフロー型コンピュータが、ある処理の実行を開始するのは、その処理の前提となる処理が全て終了したときである。データフロー型コンピュータは、各処理の開始タイミングを制御するために、トークンを用いている。【０００５】
ニューロコンピュータは、ニューラルネット、すなわち、互いに結合する多数のユニットを用いて計算を行なう。各ユニットは、神経細胞をモデルにした単純な演算素子である。ニューロコンピュータは、望ましい出力（教師信号と呼ばれる）との誤差を小さくするようにユニット間の結合度の調整（学習と呼ばれる）を繰り返す。学習の繰り返しの結果、ニューロコンピュータは、正しい出力を出すようになる。【０００６】
また、プログラムの作成に関し、遺伝的プログラミングが知られている（例えば、非特許文献３参照）。遺伝的プログラミングでは、演算をあらわすノードおよびノードのトポロジー（ｔｒｅｅ構造など）によりプログラムを表わす。遺伝的プログラミングでは、このようなグラフ形式のプログラムを複数準備し、交叉、突然変異、淘汰などにより適切なグラフのふるいわけを行なうことで、適切なプログラムを作成する。【０００７】
（ピア・ツー・ピア技術と分散コンピューティング技術）
なお、他の技術トレンドとして、インターネットにおける分散コンピューティング等を可能にするピア・ツー・ピア（Ｐ２Ｐ:Ｐｅｅｒ  ｔｏ  Ｐｅｅｒ）技術がある。ピア・ツー・ピアのシステムにおいては、専用のサーバのない環境で、クライエント（たとえば、パーソナルコンピュータ）同士が分散的にデータの交換や処理を行う（たとえば、非特許文献５を参照）。ピア・ツー・ピア方式は、端末数が膨大になっても回線帯域などに余裕がある限り通信が可能という特徴がある。【０００８】
ここで、分散コンピューティングとは、情報処理手法の一種である。分散コンピューティングでは、プログラム、あるいはタスク（ジョブ）の個々の部分が同時並行的に複数のコンピュータ上で実行され、それらがネットワークを介して互いに通信しあう。膨大な計算資源を必要とする計算などをネットワークを介して複数のコンピュータを利用して行うことで、一台のコンピュータで計算するよりスループットを上げることが可能になる。【０００９】
ピア・ツー・ピア技術は、このような分散コンピューティングのための１つのアーキテクチャでありうる。【００１０】
（ネットワーク仮想化）
ところで、一般に、通信ネットワークと呼ばれるシステムであれ、より特定的に、上述したようなピア・ツー・ピアシステムであれ、ネットワークは、物理的には、複数の情報通信機器（ノード）と、これらを相互接続する通信回線（リンク）から構成されている。【００１１】
しかしながら、近年では、実際には、直接接続されていない情報機器間の仮想的な通信回線を、物理的な通信回線とみなしてネットワークトポロジー（ネットワーク構成）の管理を行い、運用するシステムが実用化されている。このようなネットワークの仮想化については、たとえば、非特許文献４に記載がある。【００１２】
ここで、このように、実際には、直接接続されていない情報機器間の（仮想的な）通信回線を、物理的な通信回線とみなしてシステムトポロジーの管理を行い、運用するシステムは、オーバーレイ・システム、あるいはオーバレイ・ネットワークと呼ばれる。
【先行技術文献】
【非特許文献】
【００１３】
【非特許文献１】村岡洋一、「並列処理［ソフトウェア講座  ３７］」、照晃堂、昭和６１年４月１０日、ｐ．１０５
【非特許文献２】ＡＴＲ国際電気通信基礎技術研究所編、「ＡＴＲ先端テクノロジーシリーズ  ニューラルネットワーク応用」、オーム社、平成７年７月２０日、ｐ．２０−２１
【非特許文献３】伊庭斉志、「遺伝的プログラミング」、東京電機大学出版局、１９９６年、ｐ．１８−３０
【非特許文献４】Ｃａｍｐｂｅｌｌ,  Ａ.Ｔ.,  ＤｅＭｅｅｒ,  Ｈ.Ｇ.,  Ｋｏｕｎａｖｉｓ,  Ｍ.Ｅ.,  Ｍｉｋｉ,  Ｋ.,  Ｖｉｃｅｎｔｅ,  Ｊ.Ｂ.,  Ｖｉｌｌｅｌａ、  Ｄ.,  “Ａ  ｓｕｒｖｅｙ  ｏｆ  ｐｒｏｇｒａｍｍａｂｌｅ  ｎｅｔｗｏｒｋｓ”  Ｃｏｍｐｕｔｅｒ  Ｃｏｍｍｕｎｉｃａｔｉｏｎ  Ｒｅｖｉｅｗ  ２９(２),  ｐｐ.  ７-２３,１９９９.
【非特許文献５】Ａｎｄｒｏｕｔｓｅｌｌｉｓ-Ｔｈｅｏｔｏｋｉｓ,  Ｓ.,  Ｓｐｉｎｅｌｌｉｓ,  Ｄ.,  “Ａ  ｓｕｒｖｅｙ  ｏｆ  ｐｅｅｒ-ｔｏ-ｐｅｅｒ  ｃｏｎｔｅｎｔ  ｄｉｓｔｒｉｂｕｔｉｏｎ  ｔｅｃｈｎｏｌｏｇｉｅｓ”  ＡＣＭ  Ｃｏｍｐｕｔｉｎｇ  Ｓｕｒｖｅｙｓ  ３６(４),  ｐｐ.  ３３５-３７１,２００４.
【発明の概要】
【発明が解決しようとする課題】
【００１４】
従来のノイマン型コンピュータが実行するプログラムは、ユーザが、自らの考えたコンピュータに実行させる処理のアルゴリズムをコード化して作成したものである。よって、プログラムは、ユーザが編集しない限り、変化しない。【００１５】
そのため、ノイマン型コンピュータは、ユーザが不完全なアルゴリズムに基づくプログラムしか用意できない場合には、ユーザが所望する正しい演算結果を出力できない。例えば、状況や環境が変化する場合には、ユーザは完全なアルゴリズムを作成することができず、したがって、コンピュータは、正しい演算結果を出力することができない。なお、ここでは、入力に対して正しい演算結果を出力するアルゴリズムを、「完全な」アルゴリズムと呼んでいる。【００１６】
データフロー型コンピュータも、ノイマン型コンピュータと同様の問題を有する。すなわち、データフロー型コンピュータも、完全なプログラムをユーザが用意できなければ、正しい演算結果を出力できない。【００１７】
一方、ニューロコンピュータは、学習により計算処理を変更していくため、ニューロコンピュータによる計算には、上述の問題は発生しない。しかしながら、ニューロコンピュータを構成するネットワークは、通常、積和計算とｓｉｇｍｏｉｄ関数等とを組み合わせた演算ノードだけで構成されたネットワークであり、パターン認識などの特定の問題にのみ適用されるのが普通である。ユーザにとっては、所望の演算結果を出力するニューラルネットワークがどのようなものであるかは、必ずしも明らかではない。【００１８】
また、遺伝的プログラミングでは、プログラムは変化するものの、通常それは個体数だけ用意されたプログラム間のオペレーションを通してである。したがって、遺伝的プログラミングにおけるプログラムの変化は、プログラムを実際使用する以前に予め行なっておくのが普通であり、実際にプログラムを使用している最中にアルゴリズムを変化させる方法にはなっていない。【００１９】
本発明は、上記のような問題を解決するためになされたものであって、ユーザが所望する演算結果を出力するプログラムを作成する計算処理システム、プログラム作成方法、および、プログラム作成プログラムを提供することを課題とする。
【課題を解決するための手段】
【００２０】
本発明の１つの局面に従うと、計算処理システムであって、複数の演算ノードおよび２つの演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行する計算実行部を備え、複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、計算実行部の計算結果および学習アルゴリズムを用いて、計算結果を変化させることなくトポロジーを変更するネットワーク更新部をさらに備える。
【００２１】
好ましくは、複数の演算ノードは、ノード変数を有する演算ノードを含み、ネットワーク更新部は、計算結果の教師値からの誤差を計算し、誤差に対するノード変数の寄与を計算し、寄与に基づいてノード変数を修正する。
【００２２】
さらに好ましくは、複数の演算ノードは、四則演算に対応する演算ノードを含む。
さらに好ましくは、ネットワーク更新部は、ネットワークに対し、演算ノードの変更、追加または削除処理を行なう。【００２３】
好ましくは、ネットワーク更新部は、出力値が所定の回数以上連続して変化しない演算ノードを一定の値を出力する定数ノードに変更する。
【００２４】
好ましくは、ネットワーク更新部は、前記複数の演算ノードの中から２以上の前記演算ノードを近傍のノードの中からランダムに選択し、選択された演算ノードと接続される新たな演算ノードを生成する。
【００２５】
好ましくは、ネットワーク更新部は、複数の演算ノードの中から第１の演算ノードと第２の演算ノードを近傍のノードの中からランダムに選択し、第２の演算ノードから第１の演算ノードへのブリッジを生成する。
【００２６】
好ましくは、ネットワーク更新部は、複数の演算ノードの中から演算ノードを近傍のノードの中からランダムに選択し、選択された演算ノードについて分岐を作成する。
【００２７】
好ましくは、ネットワーク更新部は、各々一定の値を出力する複数の定数ノードを、結合法則により、１つの定数ノードに書き換える。
【００２８】
好ましくは、ネットワーク更新部は、所定の回数以上連続して修正を受けるノード変数をもつ演算ノードを分裂させる。
【００２９】
好ましくは、ネットワーク更新部は、誤差に基づいてエネルギー誤差を計算し、寄与としてノード変数についてのエネルギー誤差の微係数を計算し、変数から微係数に学習係数をかけた値を引いて変数を更新する。
【００３０】
好ましくは、学習係数は、変数の更新により、エネルギー誤差が（１−η１ｐ）倍（η１ｐは、０より大きく１未満の実数）になるように定められた値である。
【００３１】
好ましくは、計算処理システムは、外部からの入力を受け付ける入力部と、入力部が受け付けるプログラムに基づいて、ネットワークを作成するネットワーク作成部とをさらに備える。
【００３２】
好ましくは、入力部が受け付けるプログラムは、高級言語で記述されたソースコードであり、ネットワーク作成部は、ソースコードを言語非依存の中間コードに変換し、中間コードに基づいてネットワークを作成する。
【００３３】
好ましくは、計算処理システムは、分散型の計算処理環境で動作する複数の計算処理装置を含み、各計算処理装置が、計算実行部の実行する処理およびネットワーク更新部の行う処理を分散して処理する。
【００３４】
本発明の他の局面に従うと、計算処理システムを用いたプログラム作成方法であって、計算処理システムが複数の演算ノードおよび演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行するステップを備え、複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、計算処理システムが計算の結果および学習アルゴリズムを用いて、ネットワークのトポロジーを、学習の結果を保存しつつ修正するステップをさらに備える。
【００３５】
本発明のさらに他の局面に従うと、計算処理システムにプログラムを作成させるためのプログラム作成プログラムを記録したコンピュータ読取可能な記録媒体であって、プログラム作成プログラムは、コンピュータに、計算処理システムに複数の演算ノードおよび演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行させるステップを備え、複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、計算処理システムに計算の結果および学習アルゴリズムを用いて、ネットワークのトポロジーを、学習の結果を保存しつつ修正させるステップをさらに備える、プログラム作成プログラムを実行させる。
本発明のさらに他の局面に従うと、計算処理システムにプログラムを作成させるためのプログラム作成プログラムであって、計算処理システムに複数の演算ノードおよび演算ノードの間を各々つなぐ複数のエッジによりプログラムのアルゴリズム構造を表わすネットワークを用いて計算を実行させるステップを備え、複数の演算ノードは、プログラムの各種演算に対応する演算ノードとアルゴリズムの流れを表わす制御値に対する計算を行なう演算ノードとを含み、計算処理システムに計算の結果および学習アルゴリズムを用いて、ネットワークのトポロジーを、学習の結果を保存しつつ修正させるステップをさらに備える。
【発明の効果】
【００３６】
本発明によれば、プログラムに対応するネットワークを学習アルゴリズムを用いて修正する。その結果、ユーザが所望するプログラムを作成することができる。【００３７】
あるいは、本発明によれば、ユーザが不完全なアルゴリズムのプログラムしか作成できない場合であっても、ユーザが作成したプログラムを改変して、より完全なプログラムを作成することができる。
【図面の簡単な説明】
【００３８】
【図１】計算処理装置１００が行なう処理の流れを模式的に示した図である。
【図２】本実施の形態に係る計算処理装置のハードウェア構成をブロック図形式で示す図である。
【図３】本実施の形態に係る計算処理装置の機能的構成をブロック図形式で示す図である。
【図４】初期プログラムの一例を示す図である。
【図５】図４に示すソースコードに対応するＧＩＭＰＬＥ形式の中間コードを示す図である。
【図６】ソースコードに基づき作成するＡＴＮの一例を示す図である。
【図７】演算ノードの発火タイミングを説明するための図である。
【図８】ノード演算定義１３５の一例を示す図である。
【図９】ネットワーク情報１３４を示す図である。
【図１０】学習変数１３６を示す図である。
【図１１】図６のネットワークを用いた順伝播の第１演算過程を示す図である。
【図１２】図６のネットワークを用いた順伝播の第２演算過程を示す図である。
【図１３】図６のネットワークを用いた順伝播の第３演算過程を示す図である。
【図１４】図６のネットワークを用いた順伝播の第４演算過程を示す図である。
【図１５】図６のネットワークを用いた順伝播の第５演算過程を示す図である。
【図１６】図６のネットワークを用いた順伝播の第６演算過程を示す図である。
【図１７】図６のネットワークを用いた順伝播の第７演算過程を示す図である。
【図１８】図６のネットワークを用いた順伝播の第８演算過程を示す図である。
【図１９】図６のネットワークを用いた順伝播の第９演算過程を示す図である。
【図２０】図６のネットワークを用いた順伝播の第１０演算過程を示す図である。
【図２１】図６のネットワークを用いた順伝播の第１１演算過程を示す図である。
【図２２】図６のネットワークを用いた順伝播の第１２演算過程を示す図である。
【図２３】図６のネットワークを用いた順伝播の第１３演算過程を示す図である。
【図２４】図６のネットワークを用いた順伝播の第１４演算過程を示す図である。
【図２５】図６のネットワークを用いた順伝播の第１５演算過程を示す図である。
【図２６】図６のネットワークを用いた順伝播の第１６演算過程を示す図である。
【図２７】図６のネットワークを用いた順伝播の第１７演算過程を示す図である。
【図２８】図６のネットワークを用いた順伝播の第１８演算過程を示す図である。
【図２９】図６のネットワークを用いた順伝播の第１９演算過程を示す図である。
【図３０】図６のネットワークを用いた順伝播の第２０演算過程を示す図である。
【図３１】図６のネットワークを用いた順伝播の第２１演算過程を示す図である。
【図３２】図６のネットワークを用いた順伝播の第２２演算過程を示す図である。
【図３３】図６のネットワークを用いた順伝播の第２３演算過程を示す図である。
【図３４】図６のネットワークを用いた順伝播の第２４演算過程を示す図である。
【図３５】図６のネットワークを用いた順伝播の第２５演算過程を示す図である。
【図３６】図６のネットワークを用いた順伝播の第２６演算過程を示す図である。
【図３７】図６のネットワークを用いた順伝播の第２７演算過程を示す図である。
【図３８】図６のネットワークを用いた順伝播の第２８演算過程を示す図である。
【図３９】図６のネットワークを用いた順伝播の第２９演算過程を示す図である。
【図４０】図６のネットワークを用いた順伝播の第３０演算過程を示す図である。
【図４１】図６のネットワークを用いた順伝播の第３１演算過程を示す図である。
【図４２】図６のネットワークを用いた順伝播の第３２演算過程を示す図である。
【図４３】図６のネットワークを用いた順伝播を示す図である。
【図４４】図６のネットワークを用いた順伝播の第３４演算過程を示す図である。
【図４５】図６のネットワークを用いた順伝播の第３５演算過程を示す図である。
【図４６】図６のネットワークを用いた順伝播の第３６演算過程を示す図である。
【図４７】図６のネットワークを用いた順伝播の第３７演算過程を示す図である。
【図４８】図６のネットワークを用いた順伝播の第３８演算過程を示す図である。
【図４９】図６のネットワークを用いた順伝播の第３９演算過程を示す図である。
【図５０】図６のネットワークを用いた順伝播の第４０演算過程を示す図である。
【図５１】図６のネットワークを用いた順伝播の第４１演算過程を示す図である。
【図５２】チェインルールについて説明するための図である。
【図５３】エラーの微係数の逆伝播について説明するための図である。
【図５４】エラーのノード定数に関する微係数について説明するための図である。
【図５５】定数化について説明するための図である。
【図５６】定数化にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【図５７】変数生成について説明するための図である。
【図５８】変数生成にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【図５９】ブリッジについて説明するための図である。
【図６０】ブリッジにあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【図６１】分岐について説明するための図である。
【図６２】分岐にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【図６３】Ｔｕｐｌｅマージについて説明するための図である。
【図６４】Ｔｕｐｌｅマージにあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【図６５】ノードマージについて説明するための図である。
【図６６】ノードマージにあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【図６７】定数ノード分裂について説明するための図である。
【図６８】定数ノード分裂にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【図６９】ＧＩＭＰＬＥにおける命令"x=1;"に対応するネットワーク要素を示す図である。
【図７０】ＧＩＭＰＬＥにおける命令"x=y;"に対応するネットワーク要素を示す図である。
【図７１】ＧＩＭＰＬＥにおける命令"x=1+2;"に対応するネットワーク要素を示す図である。
【図７２】ＧＩＭＰＬＥにおける命令"if  (1>0)  block1  else  block2"に対応するネットワーク要素を示す図である。
【図７３】ＧＩＭＰＬＥ形式のコードの一例である。
【図７４】図７３に示すコードを変換して得られるＡＴＮを説明するための図である。
【図７５】ピア・ツー・ピア技術を用いた計算処理システム１０００を説明するための概念図である。
【発明を実施するための形態】
【００３９】
以下、図面を参照しつつ、本発明の実施の形態について説明する。以下の説明では、同一の部分には同一の符号を付してある。それらの名称および機能も同じである。したがってそれらについての詳細な説明は繰り返さない。
【００４０】
[実施の形態１]
（１．概要）
本実施の形態に係る計算処理装置１００は、外部から与えられたプログラム（以下、初期プログラムとも呼ぶ）を修正し、より適切な演算結果を出力するプログラムを作成する。計算処理装置は、大まかに分けて、次の３つの処理を行なう。
（１）プログラムのネットワークへの変換
（２）ネットワークを用いた計算の実行
（３）ネットワークの修正
以下、各処理の概要を説明する。
【００４１】
［（１）プログラムのネットワークへの変換］
計算処理装置１００は、与えられた初期プログラムに基づいて、ネットワーク型のプログラムを作成する。すなわち、計算処理装置１００は、初期プログラムのアルゴリズムの構造を表現するネットワークを作成する。
【００４２】
本実施の形態では、計算処理装置１００は、初期プログラムをＡＴＮ（Ａｌｇｏｒｉｔｈｍｉｃａｌｌｙ  Ｔｒａｎｓｉｔｉｖｅ  Ｎｅｔｗｏｒｋ；アルゴリズム可変ネットワーク）形式のネットワークに変換する。ＡＴＮ形式のネットワークは、各々が演算処理を表わす複数の演算ノードと、複数の演算ノードのうちいずれか２つの演算ノードを各々つなぐ複数のエッジとにより、アルゴリズムの構造を表わす。エッジは、演算順序を表わす方向を持つ。
【００４３】
［（２）ネットワークを用いた計算の実行］
計算処理装置１００は、作成したネットワークを用いて計算を実行する。すなわち、計算処理装置１００は、入力値に対し、エッジで表わされる順序に従って、演算ノードによる演算を施す。
【００４４】
本実施の形態では、計算処理装置１００は、演算に必要な情報を持つシャトルエージェント（以下、単にエージェントと呼ぶ）に対して、各演算ノードにより演算を施す。演算ノードは、１つまたは複数のエージェントの入力を受け付け、所定の規則に基づいて、エッジから入力されたエージェントに対し演算を行ない、演算後のエージェントをエッジに出力する。演算ノードから出力されたエージェントは、エッジの行き先の演算ノードに入力される。エージェントの詳細、および、エージェントに対する処理規則の詳細については後述する。
【００４５】
［（３）ネットワークの修正］
計算処理装置１００は、学習アルゴリズムを用いて、ネットワークを用いた計算結果に基づいてネットワークを修正する。すなわち、計算処理装置１００は、ネットワークによる計算結果が、ユーザが所望する値に近づくように、ネットワークを修正する。より詳しくは、計算処理装置１００は、演算ノードの定数値を変更する逆伝播学習と、ネットワークのトポロジーを変更するトポロジー学習とを行なう。逆伝播学習およびトポロジー学習の詳細については後述する。
【００４６】
計算処理装置１００は、（２）ネットワークを用いた計算の実行と、（３）ネットワークの修正とを繰り返すことにより、ユーザが所望する値を出力するネットワーク（したがって、プログラム）を作成することができる。
【００４７】
計算処理装置１００が行なう処理の全体の流れを、図１を参照して説明する。図１は、計算処理装置１００が行なう処理の流れを模式的に示した図である。
【００４８】
ステップＳ１において、計算処理装置１００は、まず、入力されたプログラムを変換して初期ネットワークを用意する（（１））。次に、計算処理装置１００は、モードをＦｏｒｗａｒｄモードに設定する。Ｆｏｒｗａｒｄモードにおいて、計算処理装置１００は、ネットワークによる計算を実行する一方、ネットワークの変更処理は実行しない。そして、計算処理装置１００は、演算の開始点にあるＳｔａｒｔノードに入力を代入して、Ｓｔａｒｔノードに計算を実行させる（Ｓｔａｒｔノードを発火する）（（２））。
【００４９】
計算処理装置１００は、Ｆｏｒｗａｒｄモードにおいて、エージェントがしばらく動かない場合、つまり、全てのエージェントに対する演算が終了した場合に、ステップＳ２の処理を行なう。そうでない場合、計算処理装置１００は、ステップＳ４以降の処理に進む。なお、計算処理装置１００は、カウンタを用いて、エージェントがしばらく動かないかどうかの判断を行なう。
【００５０】
ステップＳ２において、計算処理装置１００は、まず、ａｎｓノードで、演算結果＜ｘ＞、正しい結果（教師値）と演算結果との差に基づいて定まるエネルギー誤差Ｅ、エネルギー誤差Ｅの微係数Ｄｘ、Ｄｒを計算する（（１））。これらの値の詳細については後述する。
【００５１】
次に、計算処理装置１００は、モードをＢａｃｋｗａｒｄに設定する（（２））。Ｂａｃｋｗａｒｄモードにおいて、計算処理装置１００は、逆伝播学習を実行する。
【００５２】
計算処理装置１００は、ステップＳ３において、演算結果が終了基準を満たしていたら処理を終了する。本実施の形態では、計算処理装置１００は、エネルギー誤差Ｅが所定の値以下である場合に処理を終了する。演算結果が終了基準を満たしていない場合、計算処理装置１００は、以降の処理を続ける。
【００５３】
計算処理装置１００は、Ｂａｃｋｗａｒｄモードにおいて、エージェントがしばらく動かない場合、つまり、逆伝播学習において全てのエージェントについての演算が終了した場合に、ステップＳ４の処理を行なう。そうでない場合、計算処理装置１００は、ステップＳ５以降の処理に進む。なお、計算処理装置１００は、カウンタを用いて、エージェントがしばらく動かないかどうかの判断を行なう。
【００５４】
ステップＳ３において、計算処理装置１００は、まず、ネットワーク更新部２２８は、学習係数ηを計算し、学習係数ηに基づいて、ノード変数｛ｚ｝を更新する（（１））。この処理の詳細については、後述する。
【００５５】
次に、計算処理装置１００は、トポロジー学習を実行する（（２））。すなわち、ＣＯＮ，ＭＫＶ，ＢＲＧ，ＦＲＫ，ＭＧＴ，ＭＧＮ，ＤＩＶなどの所定の規則に基づいて、演算ノードおよびエッジの生成あるいは削除を実行する。
【００５６】
計算処理装置１００は、ステップＳ５において、演算ノードによるエージェントオペレーションを実行する。また、計算処理装置１００は、ステップＳ６において、全てのエージェントを次の演算ノードに移動する。１回のステップＳ５およびステップＳ６の処理が、演算の１タイムステップに相当する。
【００５７】
ステップＳ５およびステップＳ６の処理の繰り返しにより、モードがＦｏｒｗａｒｄであるときは、ネットワークによる演算が進んでいく。モードがＢａｃｋｗａｒｄであるときは、逆伝播学習が進んでいく。ある回数これらの処理が繰り返されると、ステップＳ２あるいはステップＳ３の処理が実行される。
【００５８】
計算処理装置１００が、以上のように計算と学習の処理を繰り返すうちに、プログラムは、最急降下学習や自己組織化学習の原理により、ユーザの所望のデータを出力するものに変化していく。つまり、ユーザは、ユーザ自身がコードしたプログラムのアルゴリズムが自動的に改変されていくプログラム環境を手に入れることができる。
【００５９】
（２．ハードウェア構成）
本実施の形態に係る計算処理装置１００のハードウェア構成について、図２を参照して説明する。図２は、本実施の形態に係る計算処理装置１００の構成をブロック図形式で表す図である。
【００６０】
計算処理装置１００は、コンピュータ本体１０２と、表示装置としてのモニタ１０４と、入力装置としてのキーボード１１０およびマウス１１２とを備える。モニタ１０４、キーボード１１０、およびマウス１１２は、コンピュータ本体１０２とバス１０５を介して接続される。
【００６１】
コンピュータ本体１０２は、フレキシブルディスク（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｃ、以下「ＦＤ」と呼ぶ）ドライブ１０６と、光ディスクドライブ１０８と、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１２０と、メモリ１２２と、直接アクセスメモリ装置、たとえば、ハードディスク１２４と、通信インターフェイス１２８とを含む。これらの部品は、互いにバス１０５で接続されている。
【００６２】
ＦＤドライブ１０６は、ＦＤ１１６に情報を読み書きする。光ディスクドライブ１０８は、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  Ｒｅａｄ−Ｏｎｌｙ  Ｍｅｍｏｒｙ）１１８等の光ディスク上の情報を読み込む。通信インターフェイス１２８は、外部とデータの授受を行なう。
【００６３】
なお、ＣＤ−ＲＯＭ１１８は、コンピュータ本体に対してインストールされるプログラム等の情報を記録可能な媒体であれば、他の媒体、たとえば、ＤＶＤ−ＲＯＭ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ）やメモリーカードなどでもよく、その場合は、コンピュータ本体１０２には、これらの媒体を読み取ることが可能なドライブ装置が設けられる。また、バス１０５には、カセット形式の磁気テープを着脱自在に装着してアクセスする磁気テープ装置が接続されていてもよい。
【００６４】
メモリ１２２は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）およびＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）を含む。
【００６５】
ハードディスク１２４は、初期プログラム１３１と、ネットワーク作成プログラム１３２と、ネットワーク修正プログラム１３３と、ネットワーク情報１３４と、ノード演算定義１３５と、学習変数１３６とを格納する。
【００６６】
初期プログラム１３１は、プログラム作成の基礎となるプログラムである。ハードディスク１２４は、ユーザが作成したプログラムを初期プログラム１３１として格納することができる。初期プログラム１３１は、ＦＤ１１６またはＣＤ−ＲＯＭ１１８等の記憶媒体によって供給されてもよいし、他のコンピュータにより通信インターフェイス１２８を経由して供給されてもよい。
【００６７】
ネットワーク作成プログラム１３２は、初期プログラム１３１に基づいて、初期プログラム１３１に対応するネットワークを作成する。また、ネットワーク作成プログラム１３２は、作成したネットワークに関するネットワーク情報１３４をハードディスク１２４に格納する。
【００６８】
ネットワーク修正プログラム１３３は、ネットワーク作成プログラム１３２が作成したネットワークを修正する。より詳しくは、ネットワーク修正プログラム１３３は、ネットワーク情報１３４に基づく演算の実行結果と所望の値との間のエネルギー誤差が所定の閾値以上である場合は、ネットワーク情報１３４を修正した新たなネットワークを作成する。
【００６９】
ネットワーク情報１３４は、ネットワーク作成プログラム１３２が作成したネットワークに関する情報、および、ネットワーク修正プログラム１３３がネットワークによる演算あるいはネットワークの修正の際に作成する情報を含む。
【００７０】
ノード演算定義１３５は、ネットワークに含まれる演算ノードによる演算の規則を表わす。ノード演算定義１３５は、演算ノードを特定する情報（演算コード）、演算ノードへ入力されるエッジの数（入力数）などを含む。ノード演算定義１３５の詳細については、後述する。
【００７１】
学習変数１３６は、ネットワークの修正に必要な情報である。学習変数１３６は、例えば、ユーザが計算結果として所望する教師値や、ネットワークによる演算結果と教師値との間の誤差に基づいて計算されるエネルギー誤差Ｅなどを含む。学習変数１３６の詳細については、後述する。
【００７２】
ここで、ノード演算定義１３５、学習変数１３６については、ユーザが入力装置を利用して作成したものを用いることができる。ただし、これらは、ＦＤ１１６またはＣＤ−ＲＯＭ１１８等の記憶媒体によって供給されてもよいし、他のコンピュータにより通信インターフェイス１２８を経由して供給されてもよい。
【００７３】
また、ネットワーク作成プログラム１３２およびネットワーク修正プログラム１３３は、ＦＤ１１６、またはＣＤ−ＲＯＭ１１８等の記憶媒体によって供給されてもよいし、他のコンピュータにより通信インターフェイス１２８を経由して供給されてもよい。
【００７４】
演算処理装置として機能するＣＰＵ１２０は、メモリ１２２をワーキングメモリとして、上述した各プログラムに対応した処理を実行する。
【００７５】
ネットワーク作成プログラム１３２およびネットワーク修正プログラム１３３は、上述の通り、ＣＰＵ１２０により実行されるソフトウェアである。一般的に、こうしたソフトウェアは、ＣＤ−ＲＯＭ１１８、ＦＤ１１６等の記憶媒体に格納されて流通し、光ディスクドライブ１０８またはＦＤドライブ１０６等により記憶媒体から読み取られてハードディスク１２４に一旦格納される。または、計算処理装置１００がネットワークに接続されている場合には、ネットワーク上のサーバから一旦ハードディスク１２４にコピーされる。そうしてさらにハードディスク１２４からメモリ１２２中のＲＡＭに読み出されてＣＰＵ１２０により実行される。なお、ネットワーク接続されている場合には、ハードディスク１２４に格納することなくＲＡＭに直接ロードして実行するようにしてもよい。
【００７６】
図２に示したコンピュータのハードウェア自体およびその動作原理は一般的なものである。したがって、本発明の機能を実現するに当り本質的な部分は、ＦＤ１１６、ＣＤ−ＲＯＭ１１８、ハードディスク１２４等の記憶媒体に記憶されたソフトウェアである。
【００７７】
（３．機能的構成）
図３を参照して、本実施の形態に係る計算処理装置１００の機能的構成について説明する。図３は、本実施の形態に係る計算処理装置１００の機能的構成をブロック図形式で示す図である。
【００７８】
計算処理装置１００は、外部からデータを受け付ける入力部２１０と、演算部２２０と、演算部２２０の演算結果を外部に出力する出力部２３０と、記憶部２４０とを備える。
【００７９】
演算部２２０は、記憶部２４０に格納されたデータに対して演算を実行する。演算部２２０は、ネットワーク作成部２２２と、計算実行部２２６と、ネットワーク更新部２２８とを含む。
【００８０】
ネットワーク作成部２２２は、記憶部２４０に格納されている初期プログラム１３１に基づいて、ネットワーク情報１３４を作成する。ネットワーク作成部２２２は、形式変換部２２４を含む。形式変換部２２４は、初期プログラム１３１を、プログラムの記述言語に依存しない中間的な形式に変換する。
【００８１】
計算実行部２２６は、ネットワーク情報１３４と、ノード演算定義１３５とに基づいて、ネットワークを用いた計算を実行する。計算実行部２２６が行なう処理の詳細については、後述する。
【００８２】
ネットワーク更新部２２８は、学習アルゴリズムを用いて、ネットワーク情報１３４を修正する。より詳しくは、ネットワーク更新部２２８は、定数学習部２２８ａと、トポロジー学習部２２８ｂとを含む。定数学習部２２８ａは、学習変数１３６に含まれる誤差に基づいて、ネットワークに含まれる演算ノードの定数値を修正する。トポロジー学習部２２８ｂは、所定の規則に基づいて、随時、演算ノードの生成や削除、エッジの生成や削除などのネットワークの更新処理を実行する。ネットワーク更新部２２８が行なう処理の詳細については後述する。
【００８３】
（４．ネットワークについて）
ネットワーク作成部２２２が作成するネットワークについて、具体例を挙げて説明する。ここでは、初期プログラム１３１が、図４に示すＣ言語で記述されたソースコードであるとして説明する。図４は、初期プログラム１３１の一例を示す図である。ただし、初期プログラム１３１は、Ｃ言語以外のプログラム言語で記述されたソースコードであってもよい。初期プログラム１３１は、例えば、Ｃ、Ｃ＋＋、Ｆｏｒｔｒａｎ、Ａｄａ、Ｏｂｊｅｃｔｉｖｅ−Ｃ、Ｊａｖａ（登録商標）、Ｐａｓｃａｌ、ＣＯＢＯＬなどの高級言語で記述されていてもよい。
【００８４】
ネットワークの作成にあたり、ネットワーク作成部２２２に含まれる形式変換部２２４は、ソースコードをＧＩＭＰＬＥ形式の中間コードへ変換し、中間コードをネットワークに変換する。ＧＩＭＰＬＥ形式の中間コード（以下、単にＧＩＭＰＬＥと呼ぶ）は、ソースコードをＧＣＣ（ＧＮＵ  Ｃｏｍｐｌｉｅｒ  Ｃｏｌｌｅｃｔｉｏｎ）の内部表現で記述したものである。図４に示すソースコードに対応するＧＩＭＰＬＥ形式の中間コードを、図５に示す。
【００８５】
ソースコードは、ソースコードを記述する言語に依存する。これに対し、ＧＩＭＰＬＥは、高級言語に非依存、かつ、アーキテクチャに非依存である。したがって、ネットワーク作成部２２２は、さまざまな言語で記述されたソースコードを一意的なアルゴリズムによりネットワークに変換することができる。
【００８６】
ＧＩＭＰＬＥは、高級言語コンパイラによるコンパイル処理の中間結果である。すなわち、ＧＩＭＰＬＥは、機械語のオブジェクトコード生成前のコードである。形式変換部２２４は、すでに知られている種々のＧＩＭＰＬＥの作成方法のうちの１つにしたがって、ＧＩＭＰＬＥを作成することができる。例えば、形式変換部２２４は、ＧＣＣ４．１以降の、ｇｃｃの-fdump-tree-gimpleオプションを利用して、ＧＩＭＰＬＥを作成することができる。
【００８７】
続いて、ネットワーク作成部２２２は、ＧＩＭＰＬＥに対応するネットワーク型のプログラムを作成する。本実施の形態では、ネットワーク作成部２２２は、ＡＴＮ形式のネットワークを作成する。ＧＩＭＰＬＥ形式の中間コードからＡＴＮ形式のネットワークを作成する規則については、後述する。なお、以下では、ＡＴＮ形式のネットワークを、単にＡＴＮと呼ぶことがある。
【００８８】
ただし、ＡＴＮを作成する方法は、上述のものに限られるわけではない。例えば、ネットワーク作成部２２２は、中間形式を介さずに初期プログラムからＡＴＮを作る特定の種類の初期プログラムに特化したプログラムを実行して、ＡＴＮを作成してもよい。あるいは、ネットワーク作成部２２２は、コンピュータに理解できる形で書かれたオブジェクトコードに基づいて、ＡＴＮを作成してもよい。あるいは、ユーザが手作業でＡＴＮを作成してもよい。
【００８９】
以上の手順によりネットワーク作成部２２２が、ソースコードに基づき作成するＡＴＮの一例を、図６に示す。図６では、演算ノードは、文字（Ｓ、ｃ、ｗなど）あるいは記号（＝、＋など）を囲む図形で表されている。図形内の文字あるいは記号は、ノードの演算種類を表わす。また、エッジは、実線の矢印または破線の矢印で表されている。実線の矢印は、算術値を含むエージェントの流れを表わす。破線の矢印は、制御値のみを含むエージェントの流れを表わす。図６中、枠５００で囲まれた部分は、ループ演算処理を表わす。
【００９０】
算術値は、実際の計算対象であり、それまでにシャトルエージェントが経た演算ノードによる演算結果を表わす。算術値は、任意の実数値をとる。算術値は、演算ノードに定められた演算規則にしたがって、変化する。例えば、ｙ＝ｘ＋１という演算を考える。この演算前の算術値はｘ、演算後の算術値はｘ＋１である。
【００９１】
制御値は、エージェントの存在の確からしさを表わす。本実施の形態では、制御値は、０以上１以下の値をとるものとする。計算実行中に行われる条件分岐による判定値が低いほど、その分岐に存在するエージェントの制御値は小さくなる。計算実行部２２６は、有限の時間およびメモリ資源で、計算を完了できるように、所定の閾値より小さい制御値を持つ分岐を削除する。
【００９２】
（５．演算ノードおよびエージェント）
ここから、ネットワークに含まれる演算ノード、ならびに、演算ノードの演算対象であるエージェントについて説明する。
【００９３】
演算ノードは、個々のローカルな計算処理または計算処理によりできたデータを表わす。演算ノードを接続するエッジは、レジスタ転送を表わす。エージェントは、計算対象となるあるいは計算に用いられるデータを表わす。エージェントは、演算ノードにより計算の実行のたびに生成され、演算ノードは、生成されたエージェントに、計算結果を与える。
【００９４】
エージェントによる計算は、入力ノードから出力ノードへの伝播により実現される。エージェントによる計算の原則は、次の２つである。
［原則１］  値の組（ｘ，ｒ）がエッジ付随のエージェントからエージェントへ伝播していく。
［原則２］  エージェントの持つ２進ラベルベクトルが親エージェントから子エージェントへと遺伝する。
【００９５】
ここで、値の組とは、算術値と制御値との組である。各エージェントは、値の組を持つ。演算ノードは、演算ノードに入力されたエージェントの値の組に対し、演算ノードの種類に応じた演算を施す。そして、演算ノードは、演算後の値の組を持つエージェントを出力する。演算ノードに入力されるエージェントを「親エージェント」、演算ノードが出力するエージェントを「子エージェント」と呼ぶ。
【００９６】
また、２進ラベルベクトルとは、エージェントがどのような条件分岐をたどったかを表わす。２進ラベルベクトルは、エージェントが通った分岐点の個数の情報およびエージェントが各分岐点でＴｒｕｅまたはＦａｌｓｅのいずれの分岐をたどったかについての情報を含む。以下、単に２進ラベルベクトルをラベルとも呼ぶ。
【００９７】
ラベルは、ブール関数によって表わすことができる。つまり、ラベルは、各分岐点での判断結果を表わすブール変数を、エージェントが各分岐点を通った順番と対応させてならべたブール変数の積で表わすことができる。例えば、１つ目の分岐でＦａｌｓｅと判断され、２つ目の分岐がＴｒｕｅと判断されたエージェントのラベルは、Ａ＝ｂａ’と表せる。ここで、引用符（’）は、引用符の左にあるブール変数の否定を表わす。小文字の各アルファベット（ａ，ｂ，…）またはその否定が、各分岐における判断結果を表わす。否定記号のついていない小文字は、判断結果がＴｒｕｅであることを表わす。否定記号のついている小文字は、判断結果がＦａｌｓｅであることを表わす。より新しい分岐に対応するブール変数が、ラベルの左側に配置される。
【００９８】
条件分岐を生じない演算ノードは、親エージェントのラベルと同じラベルを、子エージェントに与える。分岐を生じる演算ノードは、親エージェントのラベルに新たなブール変数を掛けた新たなラベルを子エージェントに与える。
【００９９】
演算ノードが、親エージェントに対して演算を実行して子エージェントを出力する（以下、「演算ノードが発火する」と呼ぶ）タイミングについて、図７を参照して説明する。図７は、演算ノードの発火タイミングを説明するための図である。演算ノードの発火タイミングは、演算ノードに入力されるエージェントが１つか複数かによって、異なる。
【０１００】
１入力の演算ノードは、次の規則１にしたがって発火する。
［規則１］  （１入力演算の場合）演算ノードは、単独で発火する。
【０１０１】
この規則について、図７（Ａ）を参照して説明する。図７（Ａ）は、１入力２出力の演算ノード３０４がエージェントに対して行なう演算を説明するための図である。
【０１０２】
１入力の演算ノード３０４は、演算ノード３０２が出力した親エージェント４０２を受け取ると、単独で発火する。すなわち、演算ノード３０４は、親エージェント４０２を受け付けると、子エージェント４０４および子エージェント４０６を出力する。演算ノード３０４は、親エージェント４０２の値の組（ｘ０，ｒ０）に基づいて、子エージェント４０４および子エージェント４０６の値の組（Ｘ，Ｒ）を定める。
【０１０３】
また、親エージェント４０２の２進ラベルベクトルは、子エージェント４０４，４０６に遺伝する。図７を含む以下の図面では、２進ラベルベクトルを、エージェントを表わす丸の数および色で表わすこととする。図７（Ａ）では、親エージェント４０２、子エージェント４０４，４０６の２進ラベルベクトルは、共通であり、これらを黒丸１つで表している。
【０１０４】
なお、ここでは、２出力の演算ノード３０４について説明したものの、出力数にかかわらず、上の規則１は成り立つ。
【０１０５】
一方、多入力の演算ノードは、次の規則２にしたがって発火する。
［規則２］  （多入力演算の場合）演算ノードは、演算ノードに入力する２つのエージェントのラベルＡ，ＢがＡＢ≠０を満たすならば、発火する。
【０１０６】
演算ノードに１つしかエージェントが入力されていないとき、その演算ノードは発火しない。
【０１０７】
ラベルの遺伝については、次の規則が成り立つ。
［規則３］  入力エージェントのラベルＡ，Ｂのブール積ＡＢが、子エージェントに遺伝する。
【０１０８】
また、入力エージェントの発火後のラベルについては、次の規則が成り立つ。
［規則４］  演算ノードの発火後、入力エージェントのラベルＡ，Ｂは、それぞれ、ＡＢ’とＡ’Ｂに変わる。
［規則５］  ラベル＝０のエージェントは、発火不能になる。すなわち、ラベル＝０のエージェントが演算ノードに入力しても、演算ノードは発火しない。
【０１０９】
これらの規則について、具体例を挙げて説明する。まず、簡単のため、等しいラベルをもつエージェントが演算ノードに入力する場合について、図７（Ｂ）を参照して説明する。図７（Ｂ）は、２入力２出力の演算ノード３１４が同一のラベルを有するエージェントに対して行なう演算を説明するための図である。
【０１１０】
演算ノード３１４は、演算ノード３１０および演算ノード３１２から、それぞれ、エージェント４０８およびエージェント４１０を受け取る。エージェント４０８およびエージェント４１０のラベルＡ、Ｂは、共に、ブール変数ａである。（図では黒丸１つで表わす）である。よって、ラベルＡＢ＝ａ・ａ＝ａ≠０である。したがって、演算ノード３１４は、規則２にしたがって、発火する。演算ノード３１４は、規則３にしたがって、子エージェントに、ラベルＡＢ＝ａ・ａ＝ａを与える。演算ノード３１４は、ラベルａを持つエージェント４１２およびエージェント４１４を、それぞれ、演算ノード３１６および演算ノード３１８に向けて出力する。上の計算から分かるように、一般的に、同一のラベルを持つエージェントが入力された演算ノードは、入力されたエージェントのラベルと同一のラベルを、子エージェントに与える。
【０１１１】
また、入力されたエージェントのラベルは、演算の終了後、ａ・ａ’＝０となる。したがって、規則５にしたがって、入力されたエージェントは、演算の終了後、発火不能となる。一般的に、演算ノードに同一のラベルを持つエージェントが入力した場合、入力したエージェントは、演算ノードによる演算後に発火不能となる。
【０１１２】
次に、互いに異なるラベルを持つエージェントが演算ノードに入力する場合について、図７（Ｃ）を参照して説明する。図７（Ｃ）は、２入力１出力の演算ノード３１９が互いに異なるラベルを有するエージェントに対して行なう演算を説明するための図である。
【０１１３】
演算ノード３１９には、ラベルＡ＝ｂａ’（図では、出力側から入力側に向けて［黒、白］で表わす）を持つエージェントと、ラベルＢ＝ｃｂａ’（図では、出力側から入力順に向けて［黒、白、白］で表わす）を持つエージェントとが入力する。なお、図では、否定を上付きのバーを表わしている。
【０１１４】
なお、以下の図面でも、これらのエージェントを表したのと同様の規則でラベルを表わすこととする。すなわち、否定のないブール変数を白丸、否定のあるブール変数を黒丸で表わす。出力側から入力側へ向けて、対応する分岐が新しいものから順に配置した丸の列によって、ラベルを表わす。
【０１１５】
ラベルＡ，Ｂは、ＡＢ＝ｂａ’・ｃｂａ’＝ｃｂａ’≠０を満たす。よって、規則２および規則３にしたがい、演算ノード３１９は、発火して、子エージェントに、ラベルＡＢ＝ｂａ’・ｃｂａ’＝ｃｂａ’（［黒、白、白］）を与える。つまり、互いに異なる長さのラベルを持つエージェントが入力した場合、演算ノードは、出力ノードに長い方のラベルを与える。
【０１１６】
ラベルＢは、規則４にしたがって、演算後に、
Ａ’Ｂ＝（ｂａ’）’・ｃｂａ’＝（ｂ’＋ａ）ｃｂａ’＝０
となる。したがって、規則５によれば、ラベルＢを持っていたエージェントは発火不能となる。つまり、長い方のラベルを持っていたエージェントは、発火不能となる。
【０１１７】
一方、ラベルＡは、規則４にしたがって、演算後に、
ＡＢ’＝ｂａ’・（ｃｂａ’）’＝ｂａ’（ｃ’＋ｂ’＋ａ）＝ｃ’ｂａ’
となる。このエージェントは、発火可能である。つまり、短い方のラベルを持っていたエージェントは、発火可能なエージェントとして残る。残ったエージェントは、待ち状態となる。つまり、残ったエージェントは、新たなエージェントが演算ノードに来るまで演算が施されない。図では、待ち状態にあるエージェントのラベルを斜線で表わす。左上から右下への斜線を引いた丸は、肯定のブール変数（白丸）の待ち状態に対応する。右上から左下への斜線を引いた丸は、否定のブール変数（黒丸）の待ち状態に対応する。
【０１１８】
また、発火可能なエージェントとして残ったエージェントの持つラベル（ここでは、ＡＢ’）を、「相補ラベル」と呼ぶ。このように呼ぶのは、発火可能なエージェントとして残ったエージェントの持つラベルは、子エージェントのラベルと対になっていることによる。
【０１１９】
なお、長さが２つ以上異なるラベルを持つエージェントに演算が施された場合、相補ラベルをブール変数であらわすためには、ブール変数“１”を導入する必要がある。ブール変数“１”は、対応する分岐の結果がＴｒｕｅでもＦａｌｓｅでも構わないこと（Ｄｏｎ’ｔ  ｃａｒｅ）を表わす。
【０１２０】
例えば、ラベルＡ＝ｂａ’を持つ第１のエージェントとラベルＢ＝ｄｃｂａ’を持つ第２のエージェントとが演算ノードに入力することを考える。このとき、ＡＢ＝ｄｃｂａ’は、０でないので、演算ノードは発火し、ＡＢを出力する。
【０１２１】
第２のエージェントのラベルは、Ａ’Ｂ＝０になるので、第２のエージェントは、発火不能になる。一方、相補ラベルは、
ＡＢ’＝（ｂａ’）・（ｄｃｂａ’）’＝（ｂａ’）・（ｄ’＋ｃ’＋ｂ’＋ａ）＝ｄ’１ｂａ’＋１ｃ’ｂａ’
となる。
【０１２２】
これらの規則２〜５により、分岐があるネットワークについても適切に演算が実行される。エージェントに付したラベルにより、どのエージェントとどのエージェントとの間に演算を行なうべきかを管理できる。
【０１２３】
各種の演算ノードが行なう演算について、図８を参照して説明する。図８は、ノード演算定義１３５の一例を示す図である。図８を参照して、ノード演算定義１３５は、演算ノードの演算名、演算ノードに対応付けて一意に定められた１文字コード、演算ノードへ入力するエージェントの数を表わす入力数、算術／制御パラメータ、出力算術値Ｘ、出力制御値Ｒとを含む。
【０１２４】
算術／制御パラメータは、演算ノードが算術値に対する演算を行なう場合は「Ａ（Ａｒｉｔｈｍｅｔｉｃの頭文字）」の値をとる。また、算術／制御パラメータは、演算ノードが制御値に対する演算を行なう場合は「Ｒ（Ｒｅｇｕｌａｔｉｎｇの頭文字）」の値をとる。また、算術／制御パラメータは、演算ノードが算術値および制御値の両方に対する演算を行なう場合は「Ａ／Ｒ」の値をとる。
【０１２５】
出力算術値Ｘは、演算ノードが出力するエージェントの算術値を示す。図８に示す表内の、ｘ０，ｘ１，ｘｌは、演算ノードに入力されるエージェントの算術値を示す。異なる２つの算術値を出力する演算ノードについては、２つの出力演算値をそれぞれＸ０，Ｘ１で示している。
【０１２６】
出力制御値Ｒは、演算ノードが出力するエージェントの制御値を示す。図８に示す表内の、ｒ０，ｒ１は、演算ノードに入力されるエージェントの制御値を示す。異なる２つの制御値を出力する演算ノードについては、２つの出力制御値をそれぞれＲ０，Ｒ１で示している。
【０１２７】
以下、各演算ノードについて、具体的に説明する。
Startノードは、文字Ｓで表わされる。Startノードは、演算の開始点に配置される。Startノードの入力数は０である。Startノードから出力されるエージェントは、算術値を有しない。計算の開始時点では分岐がないため、Startノードは、出力するエージェントに対し、取りうる最大の制御値Ｒ＝１を与える。
【０１２８】
Arithmetic  const.（算術定数）ノードは、文字ｃで表わされる。Arithmetic  const.ノードの入力数は１である。Arithmetic  const.ノードは、算術値に対する演算を行なう。Arithmetic  const.ノードは、入力されたエージェントの算術値によらず、出力するエージェントに対し、算術値として定数ｖを与える。ｖは、各演算ノードに対して設定されるノード変数の１つである。図６では、丸囲みのｃの付近の数値（１．０や３．０）が、Arithmetic  const.ノードのｖを表わす。また、Arithmetic  const.ノードは、制御値には演算を施さない。すなわち、Arithmetic  const.ノードは、出力するエージェントに、制御値として、入力されたエージェントの制御値ｒ０を与える。
【０１２９】
Arithmetic  const.ノードは、演算後の値の組（Ｘ，Ｒ）＝（ｖ，ｒ０）を１つまたは複数の演算ノードに対し出力する。なお、特別な演算ノードを除き、演算ノードは、一般に、演算後の値の組を１つまたは複数の演算ノードに対し出力することができる。
【０１３０】
Regulating  const.（制御定数）ノードは、文字Ｃで表わされる。Regulating  const.ノードの入力数は１である。また、Regulating  const.の出力数は、２である。Regulating  const.ノードは、制御値に対する演算を行なう。Regulating  const.ノードは、入力されたエージェントの算術値によらず、０を算術値として出力するエージェントに与える。Regulating  const.ノードは、２つの制御値Ｒ０＝ｓと、Ｒ１＝１−ｓとを出力する２つのエージェントのそれぞれに与える。ここで、ｓは、ノード変数の１つである。ｓは、０以上１以下の値をとる。Regulating  const.ノードの出力数は、２に限られる。
【０１３１】
Equalノードは、文字＝で表わされる。Equalノードの入力数は１である。Equalノードは、入力されたエージェントが有する値の組と同じ値の組を出力するエージェントに与える。Equalノードは、値の組を１つまたは複数のエージェントに対して出力する。つまり、Equalノードは、ある演算ノードの演算結果を、他の１つまたは複数の演算ノードに渡すことができる。なお、図６では、グラフの簡略化のため、複数のEqualノードをまとめて１つの丸囲みの＝で表している。また、図６において、枠で囲まれたＤ＊＊＊＊（Ｄ２５３３など）も、Equalノードを表わす。Ｄ＊＊＊＊は、ＧＩＭＰＬＥとの対応を示すために、便宜上、記したものである。実際に作成されるネットワークでは、Ｄ＊＊＊＊で表わされている演算ノードは、Equalノードと変わりはない。
【０１３２】
Negativeノードは、文字ｎで表わされる。Negativeノードの入力数は１である。Negativeノードは、入力するエージェントの算術値の符号を反転したものを、出力するエージェントに与える。
【０１３３】
Inverseノードは、文字ｉで表わされる。Inverseノードの入力数は１である。Inverseノードは、入力されたエージェントの算術値の逆数を出力するエージェントに与える。
【０１３４】
Subtractionノードは、文字−で表わされる。Subtractionノードの入力数は２である。Subtractionノードは、入力された２つのエージェントが持つ算術値の差を出力するエージェントに与える。また、Subtractionノードは、入力された２つのエージェントの制御値のうち小さい方を出力するエージェントに与える。Subtractionノードを出たエッジの存在確率は、この値を超えないからである。Subtractionノードがなるべく低い制御値を出力することで、分岐の追跡が容易になる。
【０１３５】
Divisionノードは、文字／で表わされる。Divisionノードの入力数は２である。Divisionノードは、入力された２つのエージェントの算術値の商を出力するエージェントに与える。また、Subtractionノードと同様、Divisionノードは、入力された２つのエージェントの制御値のうち小さい方を出力するエージェントに与える。
【０１３６】
Less  thanノード（あるいは判断ノード）は、文字Ｌで表わされる。Less  thanノードの入力数は、２である。Less  thanノードは、制御値に対する演算を行なう。Less  thanノードは、入力されたエージェントの算術値によらず、０を算術値として出力するエージェントに与える。Less  thanノードは、２種類の制御値、すなわち、
Ｒ０＝ｓｉｇ（κβｒ（ｘ０−ｘ１）)・Ｍｉｎ（ｒ０，ｒ１）と
Ｒ１＝ｓｉｇ（κβｒ（ｘ１−ｘ０）)・Ｍｉｎ（ｒ０，ｒ１）と
を出力するエージェントに与える。ここで、ｓｉｇは、シグモイド関数であり、
ｓｉｇ（ｚ）＝１／｛１＋ｅｘｐ（−ｚ）｝
で定義される。また、κは定数、βｒはノード変数である。つまり、Less  thanノードが出力するエージェントは、制御値の値によって２種類に区別される。各種類のエージェントは、１つであっても複数であってもよい。  Writeノードは、文字ｗで表わされる。Writeノードの入力数は、１である。Writeノードは、算術値および制御値に対し演算を行なう。Writeノードは、２つのエッジを出力する。Writeノードは、１つのエッジ（図６では、近辺に“０”が描かれたエッジ）の上のエージェントに対し、算術値を出力せず、制御値Ｒ０＝ｒ０のみを出力する。Writeノードは、もう１つのエッジ（図６では、近辺に“１”が描かれたエッジ）の上のエージェントに対し、Ｘ１＝ｘ１およびＲ１＝ｒ０を出力する。
【０１３７】
Readノードは、文字ｒで表わされる。Readノードの入力数は、２である。Readノードは、制御値に対し演算を行なう。Readノードは、１つの入力エッジ（図６では、近辺に“０”が描かれたエッジ）の上のエージェントの算術値によらず、もう一つの入力エッジ（図６では、近辺に“１”が描かれたエッジ）の上のエージェントの算術値ｘ１を出力する。また、Readノードは、入力された２つの制御値のうち小さい方を出力する。
【０１３８】
Less  thanノード、WriteノードおよびReadノード、ならびに制御値を用いることで、ネットワークは、if文などの条件分岐を表わすことができる。
【０１３９】
Additionノードは、文字＋で表わされる。Additionノードの入力数は、２以上（図８では、２＋で表している）である。Additionノードは、入力されたエージェントのすべての算術値の和をとる。また、Additionノードは、入力されたエージェントの制御値のうち最も小さなものを出力する。
【０１４０】
Multiplicationノードは、文字＊で表わされる。Multiplicationノードの入力数は、２以上（図８では、２＋で表している）である。Multiplicationノードは、入力されたすべてのエージェントの算術値の積をとる。また、Multiplicationノードは、入力されたエージェントの制御値のうち最も小さなものを出力する。
【０１４１】
このように演算ノードは、プログラム中の各種の演算、例えば、四則演算に対応する演算ノードを含む。演算ノードは、従来のニューラルネットワークで用いられた積和あるいはシグモイド計算以外の計算に対応する演算ノードに限られない。このように本実施の形態では、様々な演算ノードによって、ネットワークを表わす。そのため、ネットワークは、汎用性を有し、様々なプログラムを表わすことができる。
【０１４２】
（６．データセット）
ネットワーク、エージェント、および演算ノードについての説明に続いて、記憶部２４０が格納するネットワーク情報１３４および学習変数１３６について詳しく説明しておく。
【０１４３】
まず、ネットワーク情報１３４について、図９を参照して説明する。図９は、ネットワーク情報１３４を示す図である。図９を参照して、ネットワーク情報１３４は、ノード情報１３４ａと、エッジ情報１３４ｂと、エージェント情報１３４ｃと、削除ラベルリスト１３４ｄとを含む。
【０１４４】
ノード情報１３４ａは、ネットワークに含まれる各演算ノードについて定義される。ノード情報は、演算コードと、ノード変数と、ネットワークによる演算結果と教師値との間のエネルギー誤差Ｅのノード変数に関する微係数と、ノードにおける発火で作られた値の組の集合と、ノードからエッジへのポインタと、出力情報と、エッジのインデックスとを含む。
【０１４５】
演算コードは演算ノードの種類を表わす。演算コードとしては、演算名あるいは１文字コードを用いることができる。誤差Ｅのノード変数に関する微係数は、後述するネットワークの定数学習にあたって用いられる。
【０１４６】
ノードからエッジへのポインタは、ノードに接続されているエッジを表わす。出力情報は、ノードに接続されているエッジが、演算ノードが出て行くエッジであるかどうかを表わす２値変数である。出力情報がＴｒｕｅの値をとる場合、エッジは演算ノードから出て行く。出力情報がＦａｌｓｅの値をとる場合、エッジは演算ノードに入る。エッジのインデックスは、判断ノードなど２種類の値を出力する演算ノードが出力するエッジに対して定義される０か１の値である。インデックスは、エッジ上のエージェントがもつ出力値の種類を表わす。
【０１４７】
エッジ情報１３４ｂは、各エッジがどのように演算ノードを接続するかを表わす。エッジ情報１３４ｂは、エッジの始点に接続される演算ノード（始点ノード）へのポインタと、エッジの終点に接続される演算ノード（終点ノード）へのポインタとを含む。
【０１４８】
エージェント情報１３４ｃは、エージェントのもつ各種情報に関し、ネットワークを用いた演算の実行中に作成される。エージェント情報１３４ｃは、値の組と、２進ラベルベクトルと、エネルギー誤差Ｅの値の組に関する微係数と、子エージェントの値の組をこのエージェントの値の組に関して偏微分したものと、子エージェントの値の組を出力ノードの変数に関して偏微分したものと、親／子エージェントへのポインタと、エージェントが所在するエッジへのポインタとを含む。
【０１４９】
各微係数および各偏微分係数は、後述するネットワークの定数学習にあたって用いられる。親／子エージェントへのポインタは、エージェント間の系図、すなわち、演算の分岐構造を表わす。親／子エージェントへのポインタは、後述する逆伝播学習時に必要となる。
【０１５０】
次に、学習変数１３６について図１０を参照して説明する。図１０は、学習変数１３６を示す図である。学習変数１３６は、ネットワークの更新に関し、ネットワークの構造とは無関係に与えられる。学習変数１３６は、学習係数、１回のパスによる学習率、教師値、エネルギー誤差Ｅ、および、Ｅ内係数を含む。これらの変数についての詳細は、ネットワーク更新処理の説明の際に説明する。
【０１５１】
（７．順伝播）
ここから、ＡＴＮを用いた計算について、詳細に説明する。ＡＴＮを用いた計算は、エージェントに対し、矢印に沿った順序で演算ノードによる演算が施されることで、実現される。この性質のため、以下、ＡＴＮを用いた計算を、順伝播（Ｆｏｒｗａｒｄ  Ｐｒｏｐａｇａｔｉｏｎ）とも呼ぶ。
【０１５２】
計算実行部２２６は、次の規則にしたがって、順伝播を実行する。なお、規則１から規則５については、すでに説明している。
［規則１］  （１入力演算の場合）エージェントは、単独で発火する。
［規則２］  （多入力演算の場合）演算ノードは、演算ノードに入力する２つのエージェントのラベルＡ，ＢがＡＢ≠０を満たすならば、発火する。
［規則３］  入力エージェントのラベルＡ，Ｂのブール積ＡＢが、子エージェントに遺伝する。
［規則４］  演算ノードの発火後、入力エージェントのラベルＡ，Ｂは、それぞれ、ＡＢ’とＡ’Ｂに変わる。
［規則５］  ラベル＝０のエージェントは、発火不能になる。すなわち、ラベル＝０のエージェントが演算ノードに入力しても、演算ノードは発火しない。
［規則６］  ０に近い制御値を持つエージェントは、‘発火不能’となり、そのラベルは削除ラベルリストに格納される。ここでは、ｒ＜ｒｔｈ＝０．０１のエージェントが、発火不能になるとする。ただし、ｒｔｈの値は、これに限られるものではない。
［規則７］  判断ノードＬは、子エージェントに新しいブール変数を加える。
［規則８］  最終的な演算結果が入力されるａｎｓノードに到着したエージェントのラベルは、削除ラベルリストに格納される。
［規則９］  新たに削除ラベルリストに登録されたラベルの否定がネットワーク内のすべてのラベルに掛けられる。
［規則１０］  判断ノードＬで生成されるエージェントのラベルには新しいブール変数が掛けられる。
【０１５３】
以下、図１１〜図５１を参照して、順伝播について具体的に説明する。図１１〜図５１は、それぞれ、図６に示すネットワークを用いた順伝播の演算過程を示す図である。なお、図１１〜図５１では、判断ノード、writeノードおよびreadノードの入力あるいは出力の識別子（０，１）を示していないが、これらは、図６に示したものと同様である。
【０１５４】
図１１を参照して、順伝播の開始にあたり、計算実行部２２６は、ノードＮ１に値の組（…，１）をもつエージェントを出力させる。以下、値の組（ｘ，ｒ）をもつエージェントを、エージェント（ｘ，ｒ）と表わす。ここで、ｘ＝…は、算術値の値がないことを示す。
【０１５５】
図１２を参照して、エージェント（…，１）を受け取ったノードＮ２は、エージェント（０，１）を出力する。
【０１５６】
図１３を参照して、次の演算ステップ（以下、単にステップ）で、エージェント（０，１）を受け取ったノードＮ３は、ノードＮ４に向けてエージェント（０，１）を出力する。また、ノードＮ３は、ノードＮ１３に向けてエージェント（…，１）を出力する。
【０１５７】
図１４を参照して、次のステップで、ノードＮ４は、ノードＮ９に向けてエージェント（０，１）を出力し、ノードＮ５に向けてエージェント（０，１）を出力する。また、ノードＮ１３は、ノードＮ１４に向けてエージェント（０，１）を出力する。
【０１５８】
図１５を参照して、次のステップで、ノードＮ１４は、ノードＮ１５に向けてエージェント（０，１）を出力する。また、ノードＮ１４は、ノードＮ１７に向けてエージェント（…，１）を出力する。ノードＮ９に到着したエージェント（０，１）は、発火可能ではあるが、相手のエージェントがノードＮ９に到着しないので、待ち状態になる。ノードＮ５に到着したエージェントも、同様に、待ち状態になる。
【０１５９】
図１６を参照して、次のステップで、ノードＮ１５は、ノードＮ１１にエージェント（０，１）を、ノードＮ１８にエージェント（０，１）を、それぞれ出力する。また、ノードＮ１７は、ノードＮ１８にエージェント（…，１）を、ノードＮ１９にエージェント（…，１）を、それぞれ出力する。
【０１６０】
図１７を参照して、次のステップで、ノードＮ１８に２つのエージェントが入力され、ノードＮ１８は、発火する。これらのエージェントのラベルのブール積は、０でないためである。ノードＮ１８は、ノードＮ２０に向けて、エージェント（０，１）を出力する。演算が施されたエージェントは、発火不能となる。発火不能となったエージェントは、以降の演算に影響しないので、図示しない。また、図１７に示すステップで、ノードＮ１９は、ノードＮ２０に向けて、エージェント（１．５，１）を出力する。ノードＮ１１に入力されているエージェントは、待ち状態になる。
【０１６１】
図１８を参照して、次のステップで、ノードＮ２０に２つのエージェントが入力され、ノードＮ２０は、発火する。これらのエージェントのラベルのブール積は、０でないためである。ノードＮ２０は、ノードＮ２１にエージェント（…，１）を出力し、ノードＮ２２にエージェント（…，０）を出力する。ノードＮ２０は、２つの子エージェントに互いに異なるブール変数を付加する。
【０１６２】
ここで、エージェント（…，０）は、規則５にしたがって、発火不能となり、そのラベル［黒、黒］が削除ラベルリストに格納される。また、規則４にしたがって、発火可能な各エージェント（ノードＮ５、ノードＮ９、ノードＮ１５の手前のエージェント）のラベルに新しいブール変数が追加される。これらのエージェントのラベルは、［黒、白］となる。規則９にしたがって、削除ラベルリストに格納されたラベルの否定がネットワーク内の全てのラベルに掛けられて、ノードＮ５、ノードＮ９、ノードＮ１５で待機中のエージェントのラベルが変化する。
【０１６３】
図１９を参照して、次のステップで、ノードＮ２１は、ノードＮ５およびノードＮ６に対し、エージェント（…，１）を出力する。
【０１６４】
図２０を参照して、次のステップで、ノードＮ５には、２つのエージェントが入力され、ノードＮ５は発火する。ノードＮ５は、エージェント（０，１）をノードＮ７に出力する。また、ノードＮ６は、ノードＮ７にエージェント（３，１）を出力する。
【０１６５】
図２１を参照して、次のステップで、ノードＮ７に入力されていた２つのエージェントは発火し、ノードＮ７は、ノードＮ８にエージェント（３，１）を出力する。
【０１６６】
図２２を参照して、次のステップで、ノードＮ８は、ノードＮ４にエージェント（３，１）を、ノードＮ１０およびノードＮ１１にエージェント（…，１）をそれぞれ出力する。
【０１６７】
図２３を参照して、次のステップで、ノードＮ４に２つのエージェントが入力され、ノードＮ４は発火する。ノードＮ４は、ノードＮ９にエージェント（３，１）を出力する。ここで、以前にノードＮ９で待機していたエージェント（０，１）は、発火不能となる。また、ノードＮ１０は、ノードＮ１２にエージェント（１，１）を出力する。また、ノードＮ１１には、２つのエージェントが入力し、ノードＮ１１は発火する。ノードＮ１１は、ノードＮ１２にエージェント（０，１）を出力する。
【０１６８】
図２４を参照して、次のステップで、ノードＮ１２には２つのエージェントが入力し、ノードＮ１２は発火する。ノードＮ１２は、ノードＮ１６にエージェント（１，１）を出力する。
【０１６９】
図２５を参照して、次のステップで、ノードＮ１６は、ノードＮ１５にエージェント（１，１）を、ノードＮ１７にエージェント（…，１）をそれぞれ出力する。
【０１７０】
図２６を参照して、次のステップで、ノードＮ１７は、ノードＮ１８にエージェント（…，１）を、ノードＮ１９にエージェント（…，１）をそれぞれ出力する。また、ノードＮ１５は、ノードＮ１８にエージェント（１，１）を出力する。
【０１７１】
図２７を参照して、次のステップで、ノードＮ１８には２つのエージェントが入力し、ノードＮ１８は発火する。ノードＮ１８は、ノードＮ２０にエージェント（１，１）を出力する。また、ノードＮ１９は、ノードＮ２０にエージェント（１．５，１）を出力する。
【０１７２】
図２８を参照して、次のステップで、ノードＮ２０に入力されていた２つのエージェントは、発火する。ノードＮ２０は、ノードＮ２１にエージェント（…，０．８）を出力し、ノードＮ２２にエージェント（…，０．２）を出力する。ノードＮ２０は、２つの子エージェントに互いに異なるブール変数を付加する。ここで、ｒ＝０．２＞ｒｔｈであるため、エージェント（…，０．２）は、発火不能とならない。
【０１７３】
図２９を参照して、次のステップで、ノードＮ２１は、ノードＮ６にエージェント（…，０．８）を出力する。また、ノードＮ２２は、ノードＮ９にエージェント（…，０．２）を出力する。
【０１７４】
図３０を参照して、次のステップで、ノードＮ５は、ノードＮ７にエージェント（３，０．８）を出力する。ノードＮ６は、ノードＮ７に、エージェント（３，０．８）を出力する。
【０１７５】
また、ノードＮ９に入力していた２つのエージェントのラベルのブール積、すなわち、ラベル［黒、白］と、ラベル［黒、白、黒］のブール積は０でない。したがって、ノードＮ９は、発火する。
【０１７６】
規則４にしたがって、短い方のラベルを持つエージェントは、相補ラベルを持つ発火可能なエージェントとなる。短い方のラベルを持つエージェントは、発火したものに限られない。ネットワーク内にあり、短い方のラベルを持つエージェントは、すべて、相補ラベルを持つ発火可能なエージェントとなる。
【０１７７】
図３１を参照して、次のステップで、ノードＮ９は、ノードＮ２３に、エージェント（３，０．２）を出力する。ノードＮ２３は、ａｎｓノードであるので、規則８が適用され、ノードＮ２３に入力されたエージェントのラベルが削除ラベルリストに格納される。
【０１７８】
以下、同様の処理により、計算実行部２２６は、演算を進める。演算の各途中経過を、図３２〜図５１に示す。図５１は、ノードＮ２３に、３つ目の演算結果が出力されたときのエージェントの状態を示す。計算実行部２２６は、ネットワーク中を移動するエージェントがなくなった時点で順伝播演算を終了する。ここでは、計算実行部２２６は、３つ目の演算結果が出力された時点で、順伝播を終了するものとして、以降の説明を進める。
【０１７９】
この演算結果から分かるように、計算実行部２２６は、計算結果として、複数の値の組（ｘｌ，ｒｌ）を出力する。ここで、ｌはエージェントを表わす添え字である。計算実行部２２６は、算術値の制御値による重み付き平均＜ｘ＞を最終的な計算結果として出力する。この場合、計算実行部２２６は、＜ｘ＞＝（３×０．２＋６×０．６４＋９×０．１６）／（０．２＋０．６４＋０．１６）＝５．８８を最終的な計算結果として出力する。
【０１８０】
（８．ネットワークの更新−その１；定数学習）
以上のようにして求めた計算結果は、ユーザの所望する値（教師値）と異なることがある。特に、ユーザが、ラフにコードしたプログラムを初期プログラム１３１とした場合は、普通、順伝播による計算結果は、教師値とは異なる。そこで、ネットワーク更新部２２８は、計算結果と教師値との間のエネルギー誤差が所定の値より大きい場合、ネットワークを修正する。
【０１８１】
エネルギー誤差は、ａｎｓノードに出力されたｘｌ，ｒｌの関数として表わされる。本実施の形態では、計算実行部２２６が、次の式（１）にしたがって、エネルギー誤差Ｅを計算する。
【０１８２】
【数１】
0005534524.tif 000002
【０１８３】
ここで、ｔは教師値である。また、μ、νは、エラー係数である。エラー係数は、予め定められた、あるいは、ユーザが適宜定める定数である。第１項は、計算結果＜ｘ＞と教師値ｔとの誤差の２乗を表わす。計算結果がｔに近いほど、エネルギー誤差が小さくなる。第２項および第３項は、制御値の総和が１であることが好ましいことを反映して、設けられている。制御値の総和が１でない場合は、削除された分岐が多すぎるか少なすぎることを意味し、正確に演算が行なわれていない可能性がある。計算実行部２２６は、エネルギー誤差Ｅが、所定の値より大きい場合、エネルギー誤差Ｅをネットワーク更新部２２８に渡す。
【０１８４】
ネットワーク更新部２２８は、エネルギー誤差Ｅに基づき、学習アルゴリズムを用いてネットワークを修正する。ネットワーク更新部２２８は、例えば、ニューラルネットワークにおける誤差逆伝播学習やヘッブ学習と類似の学習アルゴリズムを用いてネットワークを修正する。
【０１８５】
本実施の形態では、ネットワーク更新部２２８は、誤差逆伝播学習と類似の方法で、ネットワークに含まれる各演算ノードのノード変数｛ｚ｝＝｛ｖ、ｓ、βｒ｝を修正する。つまり、ネットワーク更新部２２８は、誤差に対する各演算ノードのノード変数｛ｚ｝の寄与を求め、寄与に基づいて｛ｚ｝を更新する。
【０１８６】
本実施の形態では、ネットワーク更新部２２８は、寄与としてノード変数についての誤差の微係数を求め、最急降下法により｛ｚ｝を更新する。つまり、ネットワーク更新部２２８は、次の式（２）にしたがって、｛ｚ｝を更新する。式（２）において、ηは、学習係数である。Ｄｚは、Ｅのｚについての微係数である。
【０１８７】
【数２】
0005534524.tif 000003
【０１８８】
ネットワーク更新部２２８は、各ノードのＤｚを、エネルギー誤差の微係数の逆伝播に基づいて求める。エネルギー誤差の微係数の逆伝播とは、エネルギー誤差の親エージェントの変数についての微係数が、エネルギー誤差の子エージェントの変数についての微係数に基づいて計算できる性質のことを指す。ネットワーク更新部２２８は、ネットワークの出力側の演算ノードから入力側の演算ノードにむけて、順番に、各演算ノードについてエネルギー誤差の微係数を計算する。ネットワーク更新部２２８は、親／子エージェントへのポインタ（系図）に基づいて、どのような順番でエネルギー誤差の微係数を求めるかを決定する。
【０１８９】
逆伝播の基礎は、チェインルールである。チェインルールとは、ある関数の入力変数に関する微分係数は、終端ノードから変数に至る全経路についてのノードの偏微分の積和に等しい、という法則である。
【０１９０】
チェインルールについて、図５２を参照して説明する。図５２は、チェインルールについて説明するための図である。図５２に示すグラフにおいて、ｚ＝ａ２ｘである。また、ｙ＝ａ１＋ｚ＝ａ１＋ａ２ｘ＝ａ（１＋ｘ）である。ｙのａについての微係数は、次の式（＊）のように表わせる。
∂ｙ／∂ａ＝１＋ｘ＝１＋ｘ・１＝∂ｙ／∂ａ１＋∂ｚ／∂ａ２・∂ｙ／∂ｚ  …（＊）
ここで最右辺の第１項は、実線の経路についての偏微分の積である。また、最右辺の第２項は、破線の経路についての偏微分の積である。したがって、チェインルールが成り立っていることが分かる。なお、式（＊）から類推できるように、チェインルールは、合成関数の偏微分法を言い換えたものである。したがって、チェインルールは、常に成り立つ。
【０１９１】
さて、チェインルールをエネルギー誤差の微係数（以下、簡単のため「エラーの微係数」とも呼ぶ）に適用すると、エラーの微係数が逆伝播することが分かる。すなわち、エラーの親エージェントのｘ，ｒについての微係数は、エラーの子エージェントのＸ，Ｒについての微係数とノード演算の偏微分とに基づいて計算できる。より詳しくは、親エージェントのｘｌ（もしくはｒｌ）についてのエラーの微係数Ｄｘｌ（もしくはＤｒｌ）は、子エージェントのＸ，Ｒについてのエラーの微係数とＸ，Ｒのｘｌ（もしくはｒｌ）についての偏微分の積和を全ての子エージェントについて足し合わせたものである。
【０１９２】
このことを、図５３に即して説明する。図５３は、エラーの微係数の逆伝播について説明するための図である。図５３の親エージェントのｘｌ，ｒｌについてのエラーの微係数ＤｘｌおよびＤｒｌは、それぞれ、次の式（３）（４）のように表せる。
【０１９３】
【数３】
0005534524.tif 000004
【０１９４】
【数４】
0005534524.tif 000005
【０１９５】
この性質により、ネットワーク更新部２２８は、ネットワークの出力側のエージェントから入力側のエージェントに向かって、順に、すべてのエージェントについてエラーのｘ，ｒについての微係数を求めることができる。
【０１９６】
なお、ノード演算の偏微分（∂Ｘ／∂ｘ、∂Ｒ／∂ｘ、∂Ｘ／∂ｒ、∂Ｒ／∂ｒ）は、各演算ノードについて個別に求めることができる。本実施の形態では、計算実行部２２６が、順伝播の際に、ノード演算の偏微分を求める。この方法では、逆伝播の際にネットワーク更新部２２８が偏微分を計算するよりも、効率よく偏微分を計算することができる。また、プログラムも全体として簡略化できる。
【０１９７】
さらに、チェインルール（あるいは合成関数の偏微分法）に基づけば、エラーのノード変数｛ｚ｝についての微係数は、子エージェントの微係数とノード演算の偏微分から計算できる。より詳しくは、ノードのｚについてのエラーの微係数Ｄｚは、そのノードの発火で生成された子エージェントのＸ，Ｒについてのエラーの微係数とＸ，Ｒのｚについての偏微分の積和を全ての子エージェントについて足し合わせたものである。
【０１９８】
このことを、図５４に即して説明する。図５４は、エラーのノード定数に関する微係数について説明するための図である。図５４の算術定数ノードのｖについてのエラーの微係数Ｄｖは、次の式（５）のように表せる。
【０１９９】
【数５】
0005534524.tif 000006
【０２００】
なお、ｓをノード変数として持つ制御定数ノード、βｒをノード変数として持つ判断ノードについても同様に、ノード変数についてのエラーの微係数Ｄｚを求めることができる。
【０２０１】
ネットワーク更新部２２８は、以上の手順により、可変ノード、すなわち、ノード変数を持つ演算ノードの全てについて、ノード変数についてのエラーの微係数Ｄｚを求める。そして、ネットワーク更新部２２８は、式（２）に求めたＤｚを代入し、各可変ノードのノード変数ｚを更新する。
【０２０２】
ところで、学習によるネットワークの更新が適切に行なわれるためには、式（２）における学習係数ηを、適切な値に定める必要がある。発明者による試行の結果、学習係数ηは、学習をむやみに速くしないように定めることが好ましいことが分かった。すなわち、１回の｛ｚ｝の更新により、エネルギー誤差Ｅの値が急激に変化しないように定めるべきことがわかった。
【０２０３】
そこで、本実施の形態では、ネットワーク更新部２２８は、学習係数ηを１回の｛ｚ｝の更新により、Ｅが（１−ηｌｐ）倍されるように定める。ここで、ηｌｐは、１回のパスによる学習率を表し、０より大きく１未満の定数である。
【０２０４】
上の条件は、次の式（６）で表わされる。
【０２０５】
【数６】
0005534524.tif 000007
【０２０６】
式（６）における右辺の変形は、テーラー展開による。
式（６）を変形することで、学習係数ηについて次の式（７）が得られる。
【０２０７】
【数７】
0005534524.tif 000008
【０２０８】
ネットワーク更新部２２８は、式（７）にしたがって、学習係数ηを求めればよい。すなわち、ネットワーク更新部２２８は、式（７）にしたがい、エネルギー誤差Ｅ、および、逆伝播により求めたＤｚに基づいて、各可変ノードについて学習係数ηを求める。
【０２０９】
ηｌｐの値は、予め定められたものであってもよいし、ユーザが定めてもよい。発明者による試行によれば、好ましいηｌｐの値は、０．５〜０．７程度である。ただし、ηｌｐの値は、これに限られるものではない。
【０２１０】
（９．ネットワークの更新−その２；トポロジー学習）
ネットワーク更新部２２８は、上述のノード変数の更新に加え、ネットワークの構造を変化させることでネットワークを更新することができる。すなわち、ネットワーク更新部２２８に含まれるトポロジー学習部２２８ｂは、演算ノードの追加や削除、エッジのつなぎかえを行なって、ネットワークを更新することができる。このようなノードの生成・削除やエッジのつなぎかえは、ネットワークトポロジーの改変をもたらし、アルゴリズムを変化させる。この更新をトポロジー学習と呼ぶ。
【０２１１】
トポロジー学習部２２８ｂは、以下の規則にしたがって、ネットワークの構造を変化させる。なお、トポロジー学習部２２８ｂは、以下の全ての規則にしたがうのではなく、一部の規則にしたがって、ネットワークの構造を変化させてもよい。
【０２１２】
＜定数化＞
発火で計算される（Ｘ，Ｒ）値が長い間変化しないノードは、算術定数ノード（ｃ）または制御定数ノード（Ｃ）に変わる。この規則を定数化（Ｃｏｎｓｔａｎｔｉｆｉｃａｔｉｏｎ、ＣＯＮ）と呼ぶ。定数化により、計算結果に影響を与えることなく、アルゴリズムを簡略化することができる。
【０２１３】
定数化について、図５５を参照して説明する。図５５は、定数化について説明するための図である。図５５（ａ）は、定数化前のネットワークの一部を示す図である。図５５（ｂ）は、定数化後のネットワークの一部を示す図である。
【０２１４】
トポロジー学習部２２８ｂは、図５５（ａ）に示すAdditionノード（＋）が、所定の回数以上連続して、出力するエージェントに同じ算術値を与えている場合、ネットワークを図５５（ｂ）に示す状態に変更する。すなわち、トポロジー学習部２２８ｂは、Additionノード（＋）を算術定数ノード（ｃ）に変更する。また、トポロジー学習部２２８ｂは、Additionノードに入力していたエッジのうち、過去のｒ値の和が最小であるものを、算術定数ノードに入力するエッジとする。トポロジー学習部２２８ｂは、Additionノードに入力していた残りのエッジを削除する。
【０２１５】
定数化にあたりトポロジー学習部２２８ｂが行なう処理の流れについて図５６を参照して説明する。図５６は、定数化にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【０２１６】
トポロジー学習部２２８ｂは、ステップＳ１０１において、各演算ノードについて、ノード情報１３４ａに含まれる値の組の集合（ｘ［］、ｒ［］）に基づいて、出力値（算術値あるいは制御値）の組が所定の個数以上連続して同じ値をもつかどうか判断する。
【０２１７】
演算ノードの出力値（算術値あるいは制御値）の組が所定の個数以上連続する同じ値を持つ場合（ステップＳ１０１においてＹＥＳ）、トポロジー学習部２２８ｂは、ステップＳ１０３において、演算ノードを算術定数ノード（ｃ）あるいは制御定数ノード（Ｃ）に変更する。
【０２１８】
トポロジー学習部２２８ｂは、ステップＳ１０５において、演算ノードに入力する入力エッジのうち過去の制御値ｒの和が最小であるものを抽出する。
【０２１９】
トポロジー学習部２２８ｂは、ステップＳ１０７において、ステップＳ１０５で抽出されなかった入力エッジを削除する。
【０２２０】
一方、演算ノードの出力値の組が所定の個数以上連続する同じ値を持たない場合（ステップＳ１０１においてＮＯ）、トポロジー学習部２２８ｂは、ステップＳ１０３からステップＳ１０７の処理を行なわない。
【０２２１】
＜変数生成＞
ランダムに選ばれたノードの関数として新しいノードが作られる。この規則を変数生成（Ｍａｋｉｎｇ  Ｖａｒｉａｂｌｅ、ＭＫＶ）と呼ぶ。変数生成によれば、計算結果に影響を与えることなく、アルゴリズムを複雑化することができる。したがって、変数生成によって、アルゴリズムが不適切な均衡状態に陥ることを防ぐことができる。また、変数生成によれば、定数化などによりネットワークの規模が縮小することを防ぎ、ネットワークの規模を保つことができる。
【０２２２】
変数生成について、図５７を参照して説明する。図５７は、変数生成について説明するための図である。図５７（ａ）は、変数生成前のネットワークの一部を示す図である。図５７（ｂ）は、変数生成後のネットワークの一部を示す図である。
【０２２３】
トポロジー学習部２２８ｂは、２つの演算ノードをランダムに選ぶ。図５７（ａ）には、選ばれた２つの演算ノードを示す。そして、トポロジー学習部２２８ｂは、図５７（ｂ）に示すAdditionノード（＋）を生成する。また、トポロジー学習部２２８ｂは、選んだ２つの演算ノードからAdditionノード（＋）に入力するエッジを生成する。
【０２２４】
なお、トポロジー学習部２２８ｂは、３つ以上の演算ノードを選んで、選んだ演算ノードをAdditionノードと接続してもよい。また、トポロジー学習部２２８ｂは、Additionノード以外の演算ノードを生成してもよい。
【０２２５】
変数生成にあたりトポロジー学習部２２８ｂが行なう処理の流れについて図５８を参照して説明する。図５８は、変数生成にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【０２２６】
トポロジー学習部２２８ｂは、ステップＳ２０１において、複数の演算ノードをランダムに選ぶ。
【０２２７】
トポロジー学習部２２８ｂは、ステップＳ２０３において、新たな演算ノードを生成する。ここで、トポロジー学習部２２８ｂは、ステップＳ２０１で選ばれた演算ノードの個数と同じ入力数をもつ演算ノードを生成する。
【０２２８】
トポロジー学習部２２８ｂは、ステップＳ２０５において、ステップＳ２０１で選んだ各演算ノードから、ステップＳ２０３で生成した演算ノードに入力するエッジを生成する。
【０２２９】
＜ブリッジ＞
ランダムに選ばれたノードａは、ランダムに選ばれたノードｂを使って（ａ＋０＊ｂ）に変わる。この処理をブリッジ（Ｂｒｉｄｇｅ、ＢＲＧ）と呼ぶ。
【０２３０】
ブリッジについて、図５９を参照して説明する。図５９は、ブリッジについて説明するための図である。図５９（ａ）は、ブリッジ処理前のネットワークの一部を示す図である。図５９（ｂ）は、ブリッジ処理後のネットワークの一部を示す図である。
【０２３１】
トポロジー学習部２２８ｂは、演算ノードａと演算ノードｂとをランダムに選ぶ。図５９（ａ）に、演算ノードａと演算ノードｂとを示す。
【０２３２】
トポロジー学習部２２８ｂは、図５９（ｂ）に示すように、ノード変数ｖ＝０．０をもつ算術定数ノード（ｃ）を生成し、演算ノードｂから算術定数ノードに向かうエッジを生成する。また、トポロジー学習部２２８ｂは、算術定数ノードおよび演算ノードｂからの出力を受けるMultiplicationノード（＊）を作成する。さらに、トポロジー学習部２２８ｂは、Multiplicationノードおよび演算ノードａからの出力を受けるAdditionノードを作成する。トポロジー学習部２２８ｂは、演算ノードａの接続先であった演算ノードを、Additionノードの接続先とする。
【０２３３】
Additionノードの出力は、ａ＋０＊ｂ＝ａである。したがって、ブリッジ処理によれば、計算結果を変化させることなく、アルゴリズムを複雑化することができる。したがって、ブリッジ処理によって、アルゴリズムが不適切な均衡状態に陥ることを防ぐことができる。また、ブリッジ処理によれば、定数化などによりネットワークの規模が縮小することを防ぎ、ネットワークの規模を保つことができる。
【０２３４】
ブリッジにあたりトポロジー学習部２２８ｂが行なう処理の流れについて図６０を参照して説明する。図６０は、ブリッジにあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【０２３５】
トポロジー学習部２２８ｂは、ステップＳ３０１において、演算ノードａと演算ノードｂとをランダムに選ぶ。
【０２３６】
トポロジー学習部２２８ｂは、ステップＳ３０３において、ノード変数ｖ＝０．０をもつ算術定数ノード（ｃ）を生成する。
【０２３７】
トポロジー学習部２２８ｂは、ステップＳ３０５において、演算ノードｂからｃノードに向かうエッジを生成する。
【０２３８】
トポロジー学習部２２８ｂは、ステップＳ３０７において、Multiplication（＊）ノードを生成する。
【０２３９】
トポロジー学習部２２８ｂは、ステップＳ３０９において、演算ノードｂ、ｃから＊ノードへ向かうエッジを生成する。
【０２４０】
トポロジー学習部２２８ｂは、ステップＳ３１１において、Addition（＋）ノードを生成する。
【０２４１】
トポロジー学習部２２８ｂは、ステップＳ３１３において、演算ノードａ、＊から＋ノードへ向かうエッジを生成する。
【０２４２】
＜分岐＞
ランダムに選ばれたノードａは、ノードｂ、ｃ間の判定により分岐する。ただし、ノードｂ、ｃは、各々、過去の制御値ｒの和が、ノードａの過去の制御値ｒの和よりも大きいノードの中からランダムに選ばれたノードである。この処理を分岐（Ｆｏｒｋ、ＦＲＫ）と呼ぶ。
【０２４３】
分岐について、図６１を参照して説明する。図６１は、分岐について説明するための図である。図６１（ａ）は、分岐処理前のネットワークの一部を示す図である。図６１（ｂ）は、分岐処理後のネットワークの一部を示す図である。
【０２４４】
トポロジー学習部２２８ｂは、演算ノードａを選ぶ。また、トポロジー学習部２２８ｂは、過去の制御値ｒの和が演算ノードａの過去の制御値ｒの和よりも大きいノードの中からランダムに演算ノードｂと演算ノードｃとを選ぶ。図６１（ａ）に、演算ノードａと演算ノードｂと演算ノードｃとを示す。
【０２４５】
トポロジー学習部２２８ｂは、図６１（ｂ）に示すように、演算ノードｂと演算ノードｃとからの入力を受ける判断ノード（Ｌ）を生成する。また、トポロジー学習部２２８ｂは、演算ノードａの出力および判断ノードの第１の出力を受ける第１のReadノード（ｒ）を生成する。トポロジー学習部２２８ｂは、演算ノードａの出力および判断ノードの第２の出力を受ける第２のReadノード（ｒ）を生成する。さらに、トポロジー学習部２２８ｂは、演算ノードａの接続先であった各演算ノードに、第１のReadノードおよび第２のReadノードの演算結果を入力するエッジを生成する。
【０２４６】
分岐処理によれば、計算結果を変化させることなく、アルゴリズムを複雑化することができる。したがって、分岐処理によって、アルゴリズムが不適切な均衡状態に陥ることを防ぐことができる。また、分岐処理によれば、定数化などによりネットワークの規模が縮小することを防ぎ、ネットワークの規模を保つことができる。
【０２４７】
分岐にあたりトポロジー学習部２２８ｂが行なう処理の流れについて図６２を参照して説明する。図６２は、分岐にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【０２４８】
トポロジー学習部２２８ｂは、ステップＳ４０１において、演算ノードａをランダムに選ぶ。
【０２４９】
トポロジー学習部２２８ｂは、ステップＳ４０３において、過去の制御値ｒの和が演算ノードａの過去の制御値ｒの和よりも大きいノードの中からランダムに演算ノードｂと演算ノードｃとを選ぶ。
【０２５０】
トポロジー学習部２２８ｂは、ステップＳ４０５において、演算ノードｂと演算ノードｃとからの入力を受ける判断ノード（Ｌ）を生成する。すなわち、トポロジー学習部２２８ｂは、判断ノードを生成し、演算ノードｂおよび演算ノードｃから生成した判断ノードに向かうエッジを生成する。
【０２５１】
トポロジー学習部２２８ｂは、ステップＳ４０７において、第１のｒノードおよび第２のｒノードを生成する。
【０２５２】
トポロジー学習部２２８ｂは、ステップＳ４０９において、演算ノードａを第１のｒノードおよび第２のｒノードに接続する。すなわち、トポロジー学習部２２８ｂは、演算ノードａから第１のｒノードおよび第２のｒノードに向かうエッジを生成する。
【０２５３】
トポロジー学習部２２８ｂは、ステップＳ４１１において、判断ノードを第１のｒノードおよび第２のｒノードに接続する。すなわち、トポロジー学習部２２８ｂは、判断ノードから第１のｒノードおよび第２のｒノードに向かうエッジを生成する。
【０２５４】
トポロジー学習部２２８ｂは、ステップＳ４１３において、第１のｒノードおよび第２のｒノードから演算ノードａへのエッジを生成する。
【０２５５】
トポロジー学習部２２８ｂは、ステップＳ４１５において、元々演算ノードａが出力していたエッジを削除する。
【０２５６】
＜Ｔｕｐｌｅマージ＞
２つの縦つながりのAdditionノードまたはMultiplicationノードは、結合法則により合体する。２つのAdditionノードが「縦つながり」とは、２つのAdditionノードがエッジで直接接続されていることを意味する。この処理をＴｕｐｌｅマージ（Ｍｅｒｇｅ  Ｔｕｐｌｅ；ＭＧＴ）と呼ぶ。Ｔｕｐｌｅマージにより、計算結果に影響を与えることなく、アルゴリズムを簡略化することができる。
【０２５７】
Ｔｕｐｌｅマージについて、図６３を参照して説明する。図６３は、Ｔｕｐｌｅマージについて説明するための図である。図６３（ａ）は、Ｔｕｐｌｅマージ前のネットワークの一部を示す図である。図６３（ｂ）は、Ｔｕｐｌｅマージ後のネットワークの一部を示す図である。
【０２５８】
図６３（ａ）に示すように縦つながりの２つのAdditionノードがあると、トポロジー学習部２２８ｂは、２つのAdditionノードのうち１つのAdditionノードを削除する。また、トポロジー学習部２２８ｂは、削除されたAdditionノードに接続されていたエッジを、残りのAdditionノードに接続する。なお、トポロジー学習部２２８ｂは、縦つながりの２つのMultiplicationノードに対しても、同様の処理を行なう。
【０２５９】
Ｔｕｐｌｅマージにあたりトポロジー学習部２２８ｂが行なう処理の流れについて図６４を参照して説明する。図６４は、Ｔｕｐｌｅマージにあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【０２６０】
トポロジー学習部２２８ｂは、ステップＳ５０１において、１つの＋ノード（または＊ノード）を選択する。
【０２６１】
トポロジー学習部２２８ｂは、ステップＳ５０３において、ステップＳ５０１で選択した＋ノード（または＊ノード）の接続先に＋ノード（または＊ノード）があるかどうか判断する。
【０２６２】
接続先に＋ノード（または＊ノード）がある場合（ステップＳ５０３においてＹＥＳ）、トポロジー学習部２２８ｂは、ステップＳ５０５において、ステップＳ５０１で選択した＋ノード（または＊ノード）を削除する。
【０２６３】
トポロジー学習部２２８ｂは、ステップＳ５０７において、削除した＋ノード（または＊ノード）に入力していたエッジを、接続先の＋ノード（または＊ノード）に接続する。
【０２６４】
接続先に＋ノード（または＊ノード）がない場合（ステップＳ５０３においてＮＯ）、トポロジー学習部２２８ｂは、ステップＳ５０５およびステップＳ５０７の処理を行なわない。
【０２６５】
＜ノードマージ＞
AdditionノードまたはMultiplicationノードに入力する複数の定数ノードは、結合法則により合体する。この処理をノードマージ（Ｍｅｒｇｅ  Ｎｏｄｅ，ＭＧＮ）と呼ぶ。ノードマージにより、計算結果に影響を与えることなく、アルゴリズムを簡略化することができる。
【０２６６】
ノードマージについて、図６５を参照して説明する。図６５は、ノードマージについて説明するための図である。図６５（ａ）は、ノードマージ前のネットワークの一部を示す図である。図６５（ｂ）は、ノードマージ後のネットワークの一部を示す図である。
【０２６７】
図６５（ａ）に示すように１つのAdditionノードに入力する定数ノードが２つあると、トポロジー学習部２２８ｂは、図６５（ｂ）に示すように、２つの定数ノードを、２つの定数ノードの定数値を足し合わせた定数値を持つ１つの定数ノードに置き換える。
【０２６８】
同様に、トポロジー学習部２２８ｂは、１つのAdditionノードに３つの定数ノードがあるとき、Additionノードに入力する定数ノードを、Additionノードに入力する全ての定数ノードの定数値を足し合わせた定数値を持つ１つの定数ノードに書き換える。なお、トポロジー学習部２２８ｂは、縦つながりの２つのMultiplicationノードに対しても、同様の処理を行なう。
【０２６９】
ノードマージにあたりトポロジー学習部２２８ｂが行なう処理の流れについて図６６を参照して説明する。図６６は、ノードマージにあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【０２７０】
トポロジー学習部２２８ｂは、ステップＳ６０１において、１つの＋ノード（または＊ノード）を選択する。
【０２７１】
トポロジー学習部２２８ｂは、ステップＳ６０３において、ステップＳ６０１で選択した＋ノード（または＊ノード）に複数の定数ノードが入力するかどうか判断する。
【０２７２】
複数の定数ノードが入力する場合（ステップＳ６０３においてＹＥＳ）、トポロジー学習部２２８ｂは、ステップＳ６０５において、入力する定数ノードの定数値の和（または積）を計算し、計算で得られた値を新たな定数値とする。
【０２７３】
トポロジー学習部２２８ｂは、ステップＳ６０７において、新たな定数値をもつ新たな定数ノードを生成する。また、トポロジー学習部２２８ｂは、新たな定数ノードからステップＳ６０１で選択した＋ノード（または＊ノード）に向かうエッジを生成する。さらに、トポロジー学習部２２８ｂは、元々の定数ノードに入力するエッジを、新たな定数ノードにつなぎかえる。
【０２７４】
トポロジー学習部２２８ｂは、ステップＳ６０９において、元々の定数ノードを削除する。
【０２７５】
複数の定数ノードが入力しない場合（ステップＳ６０３においてＮＯ）、トポロジー学習部２２８ｂは、ステップＳ６０５からステップＳ６０９の処理を行なわない。
【０２７６】
＜定数ノード分裂＞
算術定数ノードまたは制御定数ノードは、その定数値がいつまでも定まらない場合は分裂する。この処理を、定数ノード分裂（Ｄｉｖｉｓｉｏｎ、ＤＩＶ）と呼ぶ。
【０２７７】
定数ノード分裂について、図６７を参照して説明する。図６７は、定数ノード分裂について説明するための図である。図６７（ａ）は、定数ノード分裂前のネットワークの一部を示す図である。図６７（ｂ）は、定数ノード分裂後のネットワークの一部を示す図である。
【０２７８】
図６７（ａ）に示す算術定数ノードの定数値が、所定の回数以上連続して、誤差に基づく修正による変更を受けているとき、トポロジー学習部２２８ｂは、図６７（ｂ）に示すように、その算術定数ノードと同じ定数値の新たな算術定数ノードを作る。トポロジー学習部２２８ｂは、（もとの算術定数ノードの出力数−１）個の新たな算術定数ノードを作る。図６７（ａ）に示す算術定数ノードの出力数は２であるので、トポロジー学習部２２８ｂは、１つの新たな算術定数ノードを作る。
【０２７９】
また、トポロジー学習部２２８ｂは、もとの算術定数ノードに入力を与える演算ノードから、新たな算術定数ノードに向かうエッジを作成する。さらに、トポロジー学習部２２８ｂは、もとのあるいは新たな算術定数ノードの各々から、もとの算術定数ノードの出力先の演算ノードの１つに向かうエッジを作成する。トポロジー学習部２２８ｂは、もとの算術定数ノードから出力するエッジを削除する。
【０２８０】
定数ノード分裂にあたりトポロジー学習部２２８ｂが行なう処理の流れについて図６８を参照して説明する。図６８は、定数ノード分裂にあたりトポロジー学習部２２８ｂが行なう処理の流れを示すフローチャートである。
【０２８１】
トポロジー学習部２２８ｂは、ステップＳ７０１において、各定数ノードについて、定数ノードの定数値が、所定の回数以上連続して、誤差に基づく修正による変更を受けているかどうかを判断する。
【０２８２】
定数ノードの定数値が連続して変更を受けている場合（ステップＳ７０１においてＹＥＳ）、トポロジー学習部２２８ｂは、ステップＳ７０３において、その定数ノードと同じ定数値の新たな定数ノードを作る。トポロジー学習部２２８ｂは、（もとの算術定数ノードの出力数−１）個の新たな定数ノードを作る。
【０２８３】
トポロジー学習部２２８ｂは、ステップＳ７０５において、元の定数ノードに入力するエッジを新たな定数ノードにも接続する。また、トポロジー学習部２２８ｂは、もとのあるいは新たな算術定数ノードの各々から、もとの算術定数ノードの出力先の演算ノードの１つに向かうエッジを作成する。
【０２８４】
定数値が連続して変化しない場合（ステップＳ７０１においてＮＯ）、トポロジー学習部２２８ｂは、ステップＳ７０３およびステップＳ７０５の処理を行なわない。
【０２８５】
値が定まらない定数ノードは、ネットワークの不安定さの一因である。定数ノード分裂により、このような定数ノードを除くことで、計算処理装置１００は、安定なネットワークを作成することができる。
【０２８６】
（１０．ＧＩＭＰＬＥからＡＴＮへの変換）
説明を省略していた、ＧＩＭＰＬＥからＡＴＮへの変換の詳細について、ここで説明する。ネットワーク作成部２２２は、以下の規則に基づいて、ＧＩＭＰＬＥをＡＴＮに変換する。
【０２８７】
＜代入（Ｒ値が定数）＞
ネットワーク作成部２２２は、ＧＩＭＰＬＥにおいて左辺の変数に右辺の定数を代入する命令"L-value=R-value;"（例えば、x=1;）を、次のようにネットワーク要素（演算ノードおよびエッジ）に置き換える。
【０２８８】
ネットワーク作成部２２２は、右辺値（Ｒ値）を定数として持つ算術定数ノードを生成する。また、ネットワーク作成部２２２は、左辺値（Ｌ値）の仮想変数ノードを生成する。Ｌ値の仮想変数ノードは、Writeノード、Equalノード、および、WriteノードからEqualノードに向かうエッジを組み合わせたものである。さらに、ネットワーク作成部は、定数ノードからＬ値の仮想変数ノードに向かうエッジを生成し、定数ノードとＬ値の仮想変数ノードとを接続する。
【０２８９】
ＧＩＭＰＬＥにおける命令"x=1;"に対応するネットワーク要素を図６９に示す。演算ノード３２０は、右辺の定数値“１”に対応する。エッジで接続された演算ノード３２２および演算ノード３２４が、Ｌ値の仮想変数ノードである。
【０２９０】
＜代入（Ｒ値が変数）＞
ネットワーク作成部２２２は、ＧＩＭＰＬＥにおいて左辺の変数に右辺の変数を代入する命令"L-value=R-value;"（例えば、x=y;）を、次のようにネットワーク要素に置き換える。
【０２９１】
ネットワーク作成部２２２は、Ｒ値の仮想変数ノードを生成する。Ｒ値の仮想変数ノードは、Equalノード、Readノード、および、EqualノードからReadノードに向かうエッジを組み合わせたものである。また、ネットワーク作成部２２２は、Ｌ値の仮想変数ノードを生成する。さらに、ネットワーク作成部２２２は、Ｒ値の仮想変数ノードからＬ値の仮想変数ノードに向かうエッジを生成し、Ｒ値の仮想変数ノードとＬ値の仮想変数ノードとを接続する。
【０２９２】
ＧＩＭＰＬＥにおける命令"x=y;"に対応するネットワーク要素を図７０に示す。エッジで接続された演算ノード３２６および演算ノード３２８が、Ｒ値の仮想変数ノードである。エッジで接続された演算ノード３３０および演算ノード３３２が、Ｌ値の仮想変数ノードである。
【０２９３】
＜２項演算＞
ネットワーク作成部２２２は、ＧＩＭＰＬＥにおける２項演算命令"L-value=R-value1  <op>  R-value2;"（例えば、x=1+2;）を、次のようにネットワーク要素に置き換える。なお、ここで、<op>は、加法（＋）、乗法（＊）などの２項演算子である。
【０２９４】
ネットワーク作成部２２２は、２項演算子に対応する演算ノード（ｏｐノードと呼ぶ）を生成する。また、ネットワーク作成部２２２は、Ｒ値に対応する算術定数ノードあるいは仮想変数ノード、ならびに、Ｌ値の仮想変数ノードを生成する。さらに、ネットワーク作成部２２２は、Ｒ値のノードをｏｐノードに接続する。また、ネットワーク作成部２２２は、ｏｐノードをＬ値の仮想変数ノードに接続する。
【０２９５】
ＧＩＭＰＬＥにおける命令"x=1+2;"に対応するネットワーク要素を図７１に示す。演算ノード３３４および演算ノード３３６が、それぞれ、命令の右辺の“１”，“２”に対応する。演算ノード３３８は、ｏｐノードである。エッジで接続された演算ノード３４０および演算ノード３４２が、Ｌ値の仮想変数ノードである。
【０２９６】
＜分岐＞
ネットワーク作成部２２２は、ＧＩＭＰＬＥにおける分岐命令"goto<label>;"を、別途生成されるＥｑｕａｌノードに接続するエッジで置き換える。すなわち、ネットワーク作成部２２２は、分岐命令が指定するラベルをもつＥｑｕａｌノードに接続する新たなエッジを生成する。
【０２９７】
＜ラベル＞
ネットワーク作成部２２２は、ＧＩＭＰＬＥにおけるラベル"<label>:;"に対応して、ＧＩＭＰＬＥが指定するラベルを持つＥｑｕａｌノードを生成する。
【０２９８】
＜条件分岐＞
ネットワーク作成部２２２は、ＧＩＭＰＬＥにおける条件分岐命令"if  (R-value1  <op>  R-value2)  block1  else  block2"（例えば、if  (1>0)  block1  else  block2）を、次のようにネットワーク要素に置き換える。
【０２９９】
ネットワーク作成部２２２は、if文内の２項演算子に対応するｏｐノードを生成する。また、ネットワーク作成部２２２は、if文内の定数または変数に対応するノードを生成する。ネットワーク作成部２２２は、ｏｐノードのＴＲＵＥ側の出力をｂｌｏｃｋ１に接続する。また、ネットワーク作成部２２２は、ｏｐノードのＦＡＬＳＥ側の出力をｂｌｏｃｋ２に接続する。
【０３００】
あるいは仮想変数ノード、ならびに、Ｌ値の仮想変数ノードを生成する。さらに、ネットワーク作成部２２２は、Ｒ値のノードをｏｐノードに接続する。また、ネットワーク作成部２２２は、ｏｐノードをＬ値の仮想変数ノードに接続する。
【０３０１】
ＧＩＭＰＬＥにおける命令"if  (1>0)  block1  else  block2"に対応するネットワーク要素を図７２に示す。演算ノード３４４および演算ノード３４６が、それぞれ、if文内の“１”，“０”に対応する。演算ノード３４８は、ｏｐノードである。演算ノード３４８のＴＲＵＥ側の出力は、第１のブロック３５０に出力される。演算ノード３４８のＦＡＬＳＥ側の出力は、第２のブロック３５２に出力される。
【０３０２】
ＧＩＭＰＬＥからＡＴＮの変換について、具体例を挙げて説明する。ここでは、図７３に示すＧＩＭＰＬＥをＡＴＮに変換する例を説明する。図７３に示すＧＩＭＰＬＥを変換して得られるＡＴＮを図７４に示す。ただし、図７４には、図の簡単のため、制御値の流れのみを図示している。
【０３０３】
ネットワーク作成部２２２は、まず、スタートノードＮ１０１を生成する。
ネットワーク作成部２２２は、ＧＩＭＰＬＥ３行目の"i=0;"を、代入（Ｒ値が定数）の変換規則により、ノードＮ１０２、ノードＮ１０３、およびこれらを結ぶエッジに変換する。ネットワーク作成部２２２は、スタートノードＮ１０１からノードＮ１０２に向かうエッジを生成する。
【０３０４】
ネットワーク作成部２２２は、ＧＩＭＰＬＥ４行目の"<D1283>:;"を、ラベルの変換規則により、ノードＮ１０４に変換する。ネットワーク作成部２２２は、ノードＮ１０２からノードＮ１０３に向かうエッジを生成する。
【０３０５】
ネットワーク作成部２２２は、ＧＩＭＰＬＥ５行目の"i=i+1:;"を、代入（Ｒ値が変数）の変換規則により、ノードＮ１０５〜ノードＮ１０８およびこれらを接続するエッジに変換する。ネットワーク作成部２２２は、ノードＮ１０４からノードＮ１０５およびノードＮ１０６に向かうエッジを生成する。
【０３０６】
ネットワーク作成部２２２は、ＧＩＭＰＬＥ６行目の"if(i<9)"を、条件分岐の変換規則により、ノードＮ１０９〜ノードＮ１１１およびこれらを接続するエッジに変換する。ネットワーク作成部２２２は、ノードＮ１０８からノードＮ１０９およびノードＮ１１０に向かうエッジを生成する。
【０３０７】
ネットワーク作成部２２２は、分岐の変換規則により、条件分岐の判断結果がＴｒｕｅである場合に行なわれるＧＩＭＰＬＥ８行目の"goto<D1283>"を、ノードＮ１１１の０側出力からノードＮ１０４に接続するエッジに変換する。
【０３０８】
ネットワーク作成部２２２は、分岐の変換規則により、条件分岐の判断結果がＦａｌｓｅである場合に行なわれる（つまりelse文の中にある）ＧＩＭＰＬＥ１２行目の"goto<D1283>"を、ノードＮ１１１の１側出力からノードＮ１１２に接続するエッジに変換する。
【０３０９】
ネットワーク作成部２２２は、ＧＩＭＰＬＥ１４行目の"<D1285>:;"を、ラベルの変換規則により、ノードＮ１１２に変換する。
【０３１０】
最後に、ネットワーク作成部２２２は、ａｎｓノードＮ１１３を生成し、ノードＮ１１２からａｎｓノード１１３に向かうエッジを生成する。
【０３１１】
[実施の形態２]
実施の形態１では、ネットワークに変換されたプログラムの実行とネットワークの修正・学習は、図２に示すような単一のコンピュータで実行されるものとして説明した。
【０３１２】
しかしながら、前述したような「分散コンピューティング技術」、より特定的には、「ピア・ツー・ピア技術」を利用すれば、このようなネットワークに変換されたプログラムの実行とネットワークの修正・学習を、複数台のコンピュータによる分散処理として実行することが可能となる。
【０３１３】
なお、以下、実施の形態２においては、プログラムを変換したものは、単に「ネットワーク」と呼び、複数のコンピュータを通信で結ぶネットワークについては、「通信ネットワーク」と呼んで区別する。さらに、通信ネットワーク上に構成される仮想的なネットワークは、「オーバーレイネットワーク」と呼ぶ。
【０３１４】
すなわち、以下で説明するように実施の形態２の計算処理システムでは、複数台のコンピュータを使用して計算を実行することができ、究極的には、地球規模に分散する複数台のコンピュータの通信ネットワーク上でＡＴＮ形式のネットワークの計算を実行することも可能である。
【０３１５】
図７５は、このようなピア・ツー・ピア技術を用いた実施の形態２の計算処理システム１０００を説明するための概念図である。
【０３１６】
実施の形態２の計算処理システム１０００に参加するピア（ノードコンピュータ）１０１０．１〜１０１０．ｎには、ＡＴＮ形式のネットワークの計算の実行のためのツール（アプリケーション・ソフト）がインストールされているものとする。このようなツールは、各コンピュータ１０１０．１〜１０１０．ｎの余剰分の計算資源を使ってバックグラウンドで動作する。
【０３１７】
このような計算の実行にあたり、ＡＴＮ形式のネットワークは、コンピュータの通信ネットワークの上に作られる仮想的な通信ネットワーク（オーバーレイネットワーク）に対応する。最も典型的な例では、ＡＴＮ形式のネットワークのノードは１つのピア（ノードコンピュータ）として、ＡＴＮ形式のネットワークのエッジはピア間で張られる仮想的なリンクとして、また、ＡＴＮ形式のネットワークのエージェントはピア間で通信されるパケット（もしくはデータフロー）として実現される。
【０３１８】
このとき、ピアの中には、ＡＴＮ形式のネットワークの入力ノードとして機能する入力ピアと、出力ノードとして機能する出力ピアとが含まれる。
【０３１９】
計算処理システム１０００に参加するピアは、実際に、現在においてＡＴＮ形式のネットワークのノードが割り付けられ、計算・学習に参加する『実ノード（実ピア）』と、現在はＡＴＮ形式のネットワークのノードは割り付けられていない『隠れノード（隠れピア）』に分けられる。実ピア同士を繋ぐ仮想リンクを『実エッジ』、実ピアと隠れピア、もしくは隠れピア同士を繋ぐリンクを『隠れエッジ』と呼ぶ。
【０３２０】
またエージェントは、図７、図５３、図５４に示した順伝播・逆伝播に関わるデータの転送を行なう『データ転送エージェント』と、図５５〜６８に示したトポロジー改変に関わる『トポロジー学習エージェント』と、ピア間の相互監視を行う『相互監視エージェント』に分けられる。
【０３２１】
データ転送エージェントは、実ピア間で、図９で示した情報のうち、エージェント情報１３４ｃと削除ラベルリスト１３４ｄをやりとりすることにより、順伝播・逆伝播に関わるデータの転送、定数学習のための定数値補正等の処理を行なう。
【０３２２】
トポロジー学習エージェントは、実ピアおよび隠れピアの間を行き来し、時折あるピアに留まって、それ自身が持つ機能プログラムを実行することにより、トポロジー改変のための処理を行う。この時、新たにノードを生成させる必要が生じた場合には、ピアの検索・識別のために、特殊なトポロジー学習エージェントが実ピアからマルチキャストされ、それが実／隠れピアを介して中継転送される。見つかった隠れピアが新たに実ピアとして割り当てられる。
【０３２３】
相互監視エージェントは、耐故障性や自由参加性を保証するために、隣接ピア間の相互監視を行なう。このエージェントは常時、隣接ピア間を行き来し、ある実ピアが動作しなくなった場合、代わりとなる隠れピアの検索・識別を行ない、見つかった隠れピアを実ピアへ割り当てる。
【０３２４】
計算処理システム１０００中には、特別なノードとして、管理ノード（隠れノード）１０１０．ｃ、ユーザノード（隠れノード）１０１０．ｕ、入力ノード（実ノード）１０１０．ｉ、および出力ノード（実ノード）１０１０．ｏが設定される。
【０３２５】
管理ノード１０１０．ｃはユーザノード１０１０．ｕが提出する課題を受けて、入出力ノードを割り当て、ＡＴＮ形式のネットワークの実行開始を指令する。また、学習結果に基づき、ＡＴＮ形式のネットワークの計算の実行の終了を指令すると同時に、出来上がったアルゴリズム（ネットワーク・トポロジー）の吸い上げと、ユーザノード１０１０．ｕへの転送を行なう。なお、ここで、図示はしていないが、これらの処理を可能にするため、各エージェントは、管理ノード１０１０．ｃのアドレス情報を持ち、演算の経過を管理ノード１０１０．ｃに通知する。
【０３２６】
入力ノード１０１０．ｉは、管理ノード１０１０．ｃから受け取った学習のための入力データを保持する。出力ノード１０１０．ｏは学習のための教師データを保持し、かつ誤差に基づく微係数計算を行なう。
【０３２７】
以上のような構成により、実施の形態１では１台のコンピュータにより実行されていた処理について、実施の形態２では、「ＡＴＮ形式のネットワークの計算処理」は、複数台のノードコンピュータにより分散して実行されることとなる。
【０３２８】
ただし、上述したようなオーバーレイネットワークが実現される限り、仮想的なネットワーク上のノードと、物理的なノードコンピュータとが、必ずしも、１対１に対応する必要はなく、たとえば、仮想的なネットワーク上の複数のノードが、１つの物理的なコンピュータにより実現されていてもよい。
【０３２９】
このような計算構成とすれば、大規模な台数のコンピュータ、究極的には、地球規模で分散する複数台のコンピュータという膨大な計算資源を使って、ＡＴＮ形式のネットワークの計算・学習を実行でき、アルゴリズム探索効率を飛躍的に高めることができる。
【０３３０】
ここでは、実施の形態２の計算処理システム１０００は、分散コンピューティングの手法として、グリッド・コンピューティングのようなサーバ−クライアント型（中央集権型）ではなく、ピア間通信を主体とするピア・ツー・ピア型（自律分散型）のアプリケーションとして実装される。
【０３３１】
この結果、実施の形態２の計算処理システムは、ピア・ツー・ピア型コミュニケーションの持つ特徴である、１）一部のピアが故障しても他のピアが引き継げるという耐故障性、２）各ノードは、好きな時に参加・離脱できるという自由参加性、３）大量のデータを一箇所にまとめておく必要がないという資源分散性、といった長所を持つ。
【０３３２】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて請求の範囲によって示され、請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【産業上の利用可能性】
【０３３３】
本発明に係る計算処理装置の応用例としては、以下のようなものがある。
（１）ユーザの与える理想データをもとにプログラムの欠陥を自己修復するコンパイル・実行システム（パソコン組み込みソフトウェアなど）
（２）曖昧な情報の中から検索によって必要な情報を探し出すアルゴリズムを学習によって獲得するシステム（次世代ネットワーク通信など）
（３）エキスパートが与えた教師データをもとに自らアルゴリズムを学習するロバスト知識伝承システム（工場、病院など）
ユーザは、計算処理装置に、ラフにコードしたプログラムを初期プログラムとして与え、また、熟練者による制御出力データを教師データとして与える。計算処理装置は、プログラムの更新を繰り返し、複雑で多岐にわたり明文化することが困難であるため伝承できなかった熟練者の知識を表わすプログラムを作成することができる。ユーザは、作成されたプログラムを用いて、安定して動作する機械システムを構築することができる。【０３３４】
（４）教師データをもとに最適な判断・制御・計画を行うように環境適応するロボットプログラム（介護、探査、災害、宇宙分野など）
（５）生物計測データをもとに生体内のアルゴリズムを推定する能力を持ったシステム生物学モデル（代謝マップ、シグナル経路など）
【符号の説明】
【０３３５】
１００  計算処理装置、１０２  コンピュータ本体、１０４  モニタ、１０５  バス、１０６  ＦＤドライブ、１０８  光ディスクドライブ、１１０  キーボード、１１２  マウス、１２２  メモリ、１２４  ハードディスク、１２８  通信インターフェイス、１３１  初期プログラム、１３２  ネットワーク作成プログラム、１３３  ネットワーク修正プログラム、１３４  ネットワーク情報、１３４ａ  ノード情報、１３４ｂ  接続情報、１３４ｃ  エージェント情報、１３４ｄ  削除ラベルリスト、１３５  ノード演算定義、１３６  学習変数、２１０  入力部、２２０  演算部、２２２  ネットワーク作成部、２２４  形式変換部、２２６  計算実行部、２２８  ネットワーク更新部、２３０  出力部、２４０  記憶部、１０００  計算処理システム、１０１０．１〜１０１０．ｎ  ノードコンピュータ。
【図１】
0005534524.tif 000009
【図２】
0005534524.tif 000010
【図３】
0005534524.tif 000011
【図４】
0005534524.tif 000012
【図５】
0005534524.tif 000013
【図６】
0005534524.tif 000014
【図７】
0005534524.tif 000015
【図８】
0005534524.tif 000016
【図９】
0005534524.tif 000017
【図１０】
0005534524.tif 000018
【図１１】
0005534524.tif 000019
【図１２】
0005534524.tif 000020
【図１３】
0005534524.tif 000021
【図１４】
0005534524.tif 000022
【図１５】
0005534524.tif 000023
【図１６】
0005534524.tif 000024
【図１７】
0005534524.tif 000025
【図１８】
0005534524.tif 000026
【図１９】
0005534524.tif 000027
【図２０】
0005534524.tif 000028
【図２１】
0005534524.tif 000029
【図２２】
0005534524.tif 000030
【図２３】
0005534524.tif 000031
【図２４】
0005534524.tif 000032
【図２５】
0005534524.tif 000033
【図２６】
0005534524.tif 000034
【図２７】
0005534524.tif 000035
【図２８】
0005534524.tif 000036
【図２９】
0005534524.tif 000037
【図３０】
0005534524.tif 000038
【図３１】
0005534524.tif 000039
【図３２】
0005534524.tif 000040
【図３３】
0005534524.tif 000041
【図３４】
0005534524.tif 000042
【図３５】
0005534524.tif 000043
【図３６】
0005534524.tif 000044
【図３７】
0005534524.tif 000045
【図３８】
0005534524.tif 000046
【図３９】
0005534524.tif 000047
【図４０】
0005534524.tif 000048
【図４１】
0005534524.tif 000049
【図４２】
0005534524.tif 000050
【図４３】
0005534524.tif 000051
【図４４】
0005534524.tif 000052
【図４５】
0005534524.tif 000053
【図４６】
0005534524.tif 000054
【図４７】
0005534524.tif 000055
【図４８】
0005534524.tif 000056
【図４９】
0005534524.tif 000057
【図５０】
0005534524.tif 000058
【図５１】
0005534524.tif 000059
【図５２】
0005534524.tif 000060
【図５３】
0005534524.tif 000061
【図５４】
0005534524.tif 000062
【図５５】
0005534524.tif 000063
【図５６】
0005534524.tif 000064
【図５７】
0005534524.tif 000065
【図５８】
0005534524.tif 000066
【図５９】
0005534524.tif 000067
【図６０】
0005534524.tif 000068
【図６１】
0005534524.tif 000069
【図６２】
0005534524.tif 000070
【図６３】
0005534524.tif 000071
【図６４】
0005534524.tif 000072
【図６５】
0005534524.tif 000073
【図６６】
0005534524.tif 000074
【図６７】
0005534524.tif 000075
【図６８】
0005534524.tif 000076
【図６９】
0005534524.tif 000077
【図７０】
0005534524.tif 000078
【図７１】
0005534524.tif 000079
【図７２】
0005534524.tif 000080
【図７３】
0005534524.tif 000081
【図７４】
0005534524.tif 000082
【図７５】
0005534524.tif 000083