1

2

目

次

目

次

第1部

1章

はじめに

11

はじめに・ ・・・・・・・・・・・・・・・・ 12マッチ箱が考える

14

マッチ箱がおしどりゲームをマスターする
本書の読み方
注意点

第2部

2章

16

20

24

階層型ニューラルネットワークの応用

25

階層型ニューラルネットワークの特徴・ ・・・ 26
階層を構成する神経素子（ニューロン） 26
階層間で起こっていること

27

学習することは重みが変わること
学習のときには

31

28

3

3章

目

次

赤と白まぜたらピンク：
排他論理和の学習・ ・・・・・・・・・・・・ 35
排他論理和（XOR）をなぜうまく判定できるのか
まずは，表現！

38

赤と白，まぜればピンクのプログラムの作り方
プログラムの流れ

4章

39

47

プログラムの走らせ方
あとがき

36

48

49

数を数えることくらいできるさ：
順序処理の簡単な実現・ ・・・・・・・・・・ 51
順次処理をさせるには

51

2 つの命令で状態を変える
順次処理のプログラムを作る
関数の説明

60

プログラムの流れ

62

プログラムの走らせ方
あとがき

64

63

54
57

4

5章

目

次

へたな字とじょうずな字の判定？：
手書き文字認識への応用・ ・・・・・・・・・ 66
パターン認識プログラムの操作

68

課題 1

△□○の区別課題 2

このあたり，そのあたり，あのあたり

課題 3

たくさん，そんなもん，すこし

どういうことだろう

72

6章

73

74

パターン認識プログラムの作り方
あとがき

72

75

80

アリはフェロモンの道をたどって歩く：
アリの行動への挑戦・ ・・・・・・・・・・・ 83
人工アリを考える

86

人工アリのプログラムを作る
プログラムの走らせ方
あとがき

99

98

88

5

7章

目

次

いろいろやらせてみよう：
シミュレータの製作・ ・・・・・・・・・・ 102
使用するファイル

105

シミュレータの操作

111

XOR 問題の実行例

116

文脈層を持ったネットワークの例
プログラムの説明
関数の説明

8章

130

137

あとがき

第3部

146

相互結合型ニューラルネットワークの応用

148

相互に結合させたら何ができるかな・ ・・・ 149
得意なのは連想だけじゃない

9章

122

149

連立 1 次方程式を解かせてみよう・ ・・・・ 157
プログラム作成
関数の説明

163

165

6

目

次

プログラムの流れ
実行

166

167

実行結果

167

あとがき

168

10 章 誰だって遠回りしたくない：
TSP の解法・・・・・・・・・・・・・・・ 170
TSP とは171

プログラム作成
関数の説明
実行

179

180

183

実行結果

183

あとがき

184

11 章 うまく物を分配しよう：
ヒッチコック問題の解法・ ・・・・・・・・ 185
制約条件の定式化
解の表現方法

187

188

7

目

次

目的関数の導出

190

結合荷重としきい値プログラム作成
関数の説明

191

194

195

プログラムの流れ
実行

198

199

実行結果

199

あとがき

200

12 章 スケジューリング問題と箱詰め問題は同じだった・ ・・・・・・・・・・・・・・ 202
実験計画を考えてみる

202

スケジューリング問題と箱詰め問題
箱詰め問題

206

箱詰め問題の定式化

208

各配置対象での配置候補
プログラム作成

221

217

204

8

目

次

関数の説明

222

プログラムの流れ
実行

224

実行結果

224

あとがき

228

第4部

224

自己組織化マップ（SOM）の応用

229

13 章 データから学ぶ：SOM（Self OrganizationMap）とは・ ・・・・・・・・・・・・・・ 230
SOM の基礎

233

SOM のプログラム

241

14 章 色を並べてみる：Color Map・ ・・・・・・ 249
入力ベクトル

250

ColorMap 部の主要プログラムの説明
いろいろな Color Map

256

251

9

目

次

15 章 多様な情報の整理をしてみる：
データマイニングの世界・ ・・・・・・・・ 257
クラスタリング概観
入力ベクトル

257

260

動物分類の主要プログラムの説明

261

データマイニングからテキストマイニングへ

267

16 章 SOM が教える近道：
巡回セールスパーソン問題・ ・・・・・・・ 268
入力ベクトル交叉経路の解消

271
273

TSP 部の主要プログラムの説明
TSP に SOM を適用すること

274
283

注釈		

284

参考文献

289

ダウンロードサービスのご案内

292

10

目

次

あとがき

297

索引		

298

著者略歴／著作権表示／奥付

302

11

1章

はじめに

第1部

はじめに

12

1章

はじめに

1章

はじめに

宇宙という言葉には何かしら人を魅きつけるものがあります．それは宇宙の持つ広大で神秘的な様相からくるものでしょう．アインシュタインは自ら導き出した重力場方程式に宇宙項を持ち込み，当時広く信じられていた静止
宇宙を，その方程式により記述しようとしました．つまり純理論的な方程式
を現実の（とはいっても当時信じられていた）宇宙に対応させるために宇宙項を導入したのです．また，星空を見上げ宇宙の広大さに思いを馳せるとき，宇宙を構成している次元について不思議に思うこともあります．私たちが住んでいる空間は，時間も含めて時空という 4 次元で構成されていると考えられていますが，超ひも理論によれば 10 次元，超重力理論によれば 11 次元ともいわれています．ただし，超ひも理論と超重力理論との間には双対性があり，基本的には両者同等であることが証明されているようです．しかし，そのような高次元宇宙だとしても，ほとんどの次元が巻き取られて結局は，私たちが検知できるのは 3 次元（時間を除いて）だということです．ところが，
その 3 次元の世界は，5 次元世界に存在するブレーンと呼ばれる膜に張り付いているとする理論もあります．このように宇宙や空間は，現実に目の前にありながら，少し探求しだすだけで不可思議なものであるという感情がわき上がります．
それと同じような感情を与える宇宙が，私たちのすぐ近くにあります．それは 150 億もの細胞でできているといわれる私たち人間の脳です．夜空を見上げている脳があるかといえば，パズルに夢中になる脳，メールの文言に悩む脳など，脳はさまざまなことを行っています．この脳の宇宙については，
それを解明するための道具立てがそろったのは比較的最近のことです．
McCulloch と Pitts によって神経回路網理論が提出されたのは 1943 年のことです．しかし，その理論は実際の脳に比べるとあまりに単純化しすぎていたため，当時はほとんど注目されませんでした．神経回路網の学習理論として Hebb が 1949 年に発表したシナプスの可塑性の理論は，単なる机上の空
論扱いを受けました．

13

1章

はじめに

ところが，1967 年に小脳の神経回路網的な構造が明らかになるや，彼らの理論がそれをうまくモデル化していることがわかり，パーセプトロンa）のブームが起こりました．1970 年代になると人工知能がもたらした方法論による人間の知的活動のモデル化が，認知科学に影響を与え始めていました．
さらにパーセプトロンの限界を Minsky と Papert が数学的に証明したこともあって，神経回路網的アプローチは急激に下火となったのです．しかし地道な研究が続けられ，1980 年に入ると再びニューラルネットワークb）として注目を浴びるようになったのです．
ニューラルネットワークを利用して，コンピュータに知的なふるまいをさせるという意味では，人工知能と同様ですが，考え方は根本的に異なっています．
人工知能は物理記号システム仮説c）と呼ばれる「仮説」を土台にしています．世界のすべてのことがらは記号に置き換えられ，その記号を操作することにより説明できるというのが，その仮説です．ところがニューラルネット
ワークによる物事の表現は，そのような記号に置き換えるのではなく，ネットワーク全体の状態で表現するというものです．そのような表現方法を分散表現と呼んでいます．
本書では，ニューラルネットワークがどういうものか，また，どのような応用ができるのかを，具体的な例を挙げ実際にプログラムを作りながら知ることができるように構成しました．1991 年に『C でつくるニューラルネット
ワーク』を出版してから，15 年以上たっていますので，その間に，新たな発見やモデルの提案が多くなされてきました．それらに関する解説や前著では取り込めなかった自己組織化マップ（SOM）についてもいくつかの章を設けています．
なおニューラルネットをプログラム化するうえで，数式を持ち出さずに説明することは困難です．しかし，基本概念を表現する数式と，プログラムするのに必要な数式との間に隔たりがあるのも事実です．したがって，本書では式の変形の過程も省略せずに記述するようにします．ただネットワークの収束性の証明等については，プログラム化するうえで必要ではありませんので省略します．これらについては優れた参考書がすでに出版されているので，そちらを参照していただければよいでしょう．
最後になりましたが，本書を執筆するにあたり次の方々にお礼を申し上げ

14

1章

はじめに

ます．前著『C でつくるニューラルネットワーク』の原稿を精読し貴重な意見を提供していただいた庄司速人氏．あくことなき探求心で，共に議論をしていただいた人工知能学習会のメンバー．そして，編集にあたり適切なアドバイスをし，校正等繁雑な仕事をこころよく引き受けてくださったパーソナ
ルメディア出版部の諸氏に感謝いたします．

マッチ箱が考える
ニューラルネットワークの説明に入る前に，与えられた環境（条件）の中でシステムがそれに適合していくことがどのようなことなのかを，簡単な例
で見てみましょう．読者の方々は，「マッチ箱が考える」と聞いてどう思われるでしょうか？
Tic-Tac-Too というゲームがあります．これはほとんどの方がご存知でしょう．よく外国の映画で，とはいってもアメリカ映画ですが，道路や塀に落書きしてあるのが，背景として見受けられます．このゲームはいたって簡単なルールで勝敗を決めるものです．3 × 3 のマス目に○×の記号を交互に入れていき，早く縦 1 列，横 1 列，斜め 1 列のどれかに同じ記号を並べたほうが勝ちとなるゲームです．
（Fig. 1-1）

Fig. 1-1

Tic-Tac-Too

コンピュータと人間が対戦するプログラムの簡単な例題として，昔から入門書ではおなじみのものです．ゲームの研究においては，初歩的な例として，
必勝戦略が明らかになっています．
1）

エジンバラ大学の生物学教授であった Donald Michie は，マッチ箱とビー

15

1章

はじめに

ズが，人間相手に Tic-Tac-Too を行い，勝つための方策を学習する仕組みを考案しました．勝つための方法，つまり必勝戦略についてのアルゴリズムを前もって与えておくわけではなく，マッチ箱とビーズからなるシステムが学習して獲得していくわけです．だからもし対戦相手である人間がへたなプレー
ヤーであれば，そのシステムは勝てるようにはならないでしょう．
ではそのような仕組みをどうやって実現すればいいのでしょうか．
ゲームは通常ゲームの木と呼ばれる探索木を用いて解析されます．ある局
面で打つことのできる手は複数ありますから，その数だけ枝分かれしていきます．その枝の先ではさらに枝分かれが繰り返され，最終局面まで枝が伸びていくわけです．人間は与えられた局面で，どの枝を選択すればいいのかを，先読みしながら選択しています．
マッチ箱とビーズからなるシステムは，そのような選択を経験的に学習するように仕組まれています．マッチ箱は 1 つの局面に割り当てられていて，そこで選択できる次の手をマッチの中に入れてあるビーズの色で決めるようにします．ビーズは選択できる手の数だけ異なった色があり，マッチ箱を振って 1 つのビーズが出るようにしておきます．学習の最初にはすべてのマッチ
箱に同数の色のビーズを入れておき，勝負が始まって手を打つときには，マッチ箱を振りビーズ 1 個を取り出します．取り出されたビーズに相当する手が，マッチ箱とビーズシステムが選択した手になるわけです．取り出されたビーズはマッチ箱の上に置いておきます．それを繰り返して最終局面まで持っていき，もし人間が勝てば罰としてマッチ箱の上に置いてあるビーズを取り上げてしまいます．反対にマッチ箱とビーズシステムが勝てば，ほうびとして先ほどのマッチ箱に，その上に置かれてあるビーズと同じ色のビーズを何個か加えてマッチ箱に戻してやります．
このような勝負を根気よく何回か行い，マッチ箱とビーズシステムに学習を行わせます．もうおわかりかと思いますが次の勝負のときには，負けるよ
うな選び方はしにくくなるし，勝つための選択をしやすくなります．
マッチ箱とビーズと根気さえあれば，
このような実験を行って「考えるマッチ」を作ることができますが，読者の皆さんはそんなバカなことはしないでしょう．コンピュータがあれば，この仕組みを実現するプログラムを簡単に作ることができるからです．
実際に，プログラムを作ってみましょう．Tic-Tac-Too ではなく，別のゲー

16

1章

はじめに

ムを題材にしてみます．

マッチ箱がおしどりゲームをマスターする
これから紹介するのは，
Tic-Tac-Too のような対戦型のゲームではなく，「お2）

しどりゲーム」 という 1 人で解くパズルの一種です．このゲームはコインの裏表や碁石の白黒を利用して楽しめます．Fig. 1-2（a）のように碁石を 3個ずつ一直線上に並べておき，一度に隣り合ったもの同士 2 個を回転させずに移動し，同図（b）のように 3 回の移動で並べ替えます．
（a）

（b）

Fig. 1-2

おしどりゲーム

もし使う駒が 4 個ずつならば，4 回の移動で並べ替えられます．一般に，n個ずつならば，n 回の移動で並べ替えが完了します．Fig. 1- 3 に 7 個ずつと 8個ずつの手順を示しておきます．
n=7

n=8

1
2
3
4
5
6
7

1
2
3
4
5
6
7
8

Fig. 1-3

拡張おしどりゲーム

これで気がつくことは，n ＝ 3 の場合を除いて，最初の n/2 回は同色のペアを移動させ，残りの手順で異なる色のペアを移動させるということです．

17

1章

はじめに

3-1
2-1

3-2
3-3
3-4

1-1

2-2

3-5
3-6
3-7

2-3

3-8
3-9
3-10

2-4

3-11
3-12
3-13

0-1

1-2

2-5

3-14
3-15
3-16

2-6

3-17
3-18
3-19

2-7

3-20
3-21
3-22

2-8

1-3

3-23
3-24
3-25

2-9

3-26
3-27

Fig. 1-4

おしどりゲームの探索木

18

1章

はじめに

さて話を元に戻して，n ＝ 3 回での手順をツリー状に表現してみましょう．
ただし，無駄な操作もありますが，ある局面からの選択肢はすべて 3 つとして考えてみます．Fig. 1- 4 にその探索木を示します．
マッチ箱をその木のすべての節点に割り当てると，ある節点でマッチ箱が選択する次の操作は 3 つのうち 1 つということになります．つまり 3 色のビー
ズが同数ずつ，マッチ箱に入っていることになります．1 手目は 1 - 1 のマッチ箱を選択し，よく振ってビーズを 1 個取り出し，マッチ箱の上に乗せておきます．2 手目では，そのビーズによって示されたマッチ箱を選択します．
たとえば 2- 2 だとしましょう．そのマッチ箱をよく振り同様にビーズを 1 個取り出し，マッチ箱の上に乗せておきます．3 手目でも同様なことをします．
3 手目は 3 - 3 だとしましょう．3 個ずつの場合は，3 手で完了させねばなりませんから，3 - 3 がゴールでなければ罰としてマッチ箱の上にあるすべてのビーズを取り除きます．もしゴールであれば，ほうびとしてビーズが乗っているマッチ箱にさらに 5 個，そのビーズと同色のビーズを追加してマッチ箱に返してやります．
これを何度か繰り返していると，しだいに正確な手順を示すようになりま
す．処理の概略を以下に示しておきます．
以下を好きなだけ繰り返す．

{
学習モードの実行．
学習回数を指定する．

for ( i ← 0; i < 学習回数 ; i++ ){実行してみる．
実行結果の印字．
実行結果をもとにして学習を行う．

}
テストモードの実行．
テスト回数を指定する．

for ( i ← 0; i < テスト回数 ; i++ ){実行してみる．
実行結果の印字．

}

19

1章

はじめに

結果の集計を印字する．

}

ここで，「実行してみる．
」とあるところでマッチ箱を振って次の手順を選択し，そのときの判定結果を得るようにします．学習を行う処理では，賞罰を決定してマッチ箱に学習させていきます．Fig. 1-4 に示した手順は，マッチ箱を表現する構造体を用いています．
マッチ箱を振って次の手を選択する処理は，excecute 関数の中からnextSelect という関数を呼んで行っていますが，これについて多少説明しておきましょう．マッチ箱を振ってビーズを 1 つ選択する場合，最も数の多い色のビーズが最もよく選択されることは明らかです．nextSelect では乱数を 1 つ求めて，それがどの色の割合に相当するかを決めています．
（Fig.
1- 5）
乱数
0.0 0.15
赤0.8
青Fig. 1-5

1.0
黄乱数による選択

Fig. 1-6 はこのプログラムを使用して，実験したときの結果です．各マッ
チ箱に最初に与えておくビーズは，それぞれの分枝に対して 20 個としました．実験では，罰として 1 個のビーズを取り上げ，ほうびとして 3 個，4 個，
5 個の各場合で行っています．
実験は 50 回刻みで学習を行って，そのつど 100 回の試行で得られた正解率を計算しています．Fig. 1- 6 の縦軸は正解率の百分率です．
このような賞罰の仕組みにより，システムは正しい解へ行き着く経路をより高い確率で選択するようになるわけです．人間の判断においても訓練されたものは，迷わず，直感的に正しい判断を下すことができます．つまり学習によって関係する神経が太くなっていくといったイメージです．
少々まわりくどい説明をしてきましたが，ニューラルネットワークの学習にもマッチ箱とビーズシステムの考え方と共通したところがあります．

20

1章

はじめに

Fig. 1-6

マッチ箱の学習曲線

本書の読み方
本書は 3 つのテーマを持っています．全体を 4 部構成にして，第 1 部が今，ご覧になっている部分で，続く第 2 部で階層型ニューラルネットワークを，
第 3 部では Hopﬁeld のネットワークについて解説しています．第 4 部は『Cでつくるニューラルネットワーク』では取り込めなかった自己組織化マップ（SOM）にあてています．
各部は完全に独立していますので，興味ある部から読まれるといいでしょう．また，各部の最初の章は，それぞれのネットワークの理論編として位置づけています．各章ごとに，例題を挙げ，それを解決するための考え方を示し，実際のプログラムの作り方を解説しています．本書で取り上げたプログ
ラムはすべてダウンロードファイルに収録してあります．
第 2 部は 2 章から 7 章で構成し，徐々にレベルが高くなるようにしてあります．
2 章では階層型ニューラルネットワークの原理を述べ，その学習モデルであるバックプロパゲーションを取り上げて詳細に解説します．この章は理論

21

1章

はじめに

編の性格を持つので，実際の応用プログラムはありません．応用プログラム
は 3 章からそれぞれ取り上げます．
3 章では階層型ニューラルネットワークの典型的な例である，XOR 問題

d）を取り上げます．このとき階層型ニューラルネットワークの原理とバックプ
ロパゲーションの学習原理を，いかにプログラムとして実現するかを解説します．
階層型ニューラルネットワークの基本部分は，4 章から 7 章にいたるまで
すべて共通ですから，3 章の説明が基本となります．
4 章ではフィードバックループを持ったネットワークについて解説します．
単純なコピーのみのフィードバックループで何ができるかを紹介します．またこの章では，フィードバックループのモデルについても解説しておきます．
なお，これについては 7 章で紹介するシミュレータを用いて，実際にシミュレートさせてみます．この章以降，ニューラルネットワークに関連するプロ
グラミングについては省略します．ただし 7 章は他と作り方が少々異なるので，省略せずに解説していきます．
5 章ではこれまた階層型ニューラルネットワークの典型的な例である，文字認識用のプログラムについて解説します．入力はマウス入力を採用しておきました．文字認識とはいっても，文字だけでなく，2 次元のパターンならば何でもいいわけです．たとえば，三角，四角，丸を学習させ，崩れた四角や三角がどの程度それだと認識できるかを実験することができます．
基本的にはニューラルネットワークはパターン認識装置だということです．要は，パターンをどうみるかによって，各種の応用が広がるわけです．
6 章ではちょっとしたロボットのシミュレータを組み込んだプログラムを紹介します．ニューラルネットワークは 4 章でのフィードバックループを持った 3 層の階層型ニューラルネットワークを利用します．
ここでのロボットはいたって単純で，与えられた道に沿って目的地へ到達する能力しかありません．ロボットには前後左右にセンサを装備させておくと仮定して，行動のルールを，それらのセンサの感知パターンから決めておきます．ニューラルネットワークへの学習はその行動のルールで行います．
道の情報は，ファイルにより提供できるようにしてありますので，いろいろな道を作って実験してみることができます．
7 章では階層型ニューラルネットワークをシミュレートできるシミュレー

22

1章

はじめに

タを作成します．階層の数は一応 10 階層までとしてありますが，ソースプ
ログラムを変更して，その定義文を変えるだけで，階層数の制限を増やすことができます．
ユニット数は，メモリが許す限り取れるようにしてあります．またネット
ワークの構成も自由にできます．もちろんフィードバックループを持たせることも可能です．実際，McClelland らが提案したオートマトンの機能を持ったモデルも構成することができます．これは隠れ層から文脈層へのフィード
バックループを含むものです．
ネットワークの自由な構成には，学習のさせ方を，ある程度指定できるよ
うでなければ意味がありません．このシミュレータではそこも考慮して，学習のスケジュールを指定できるようにしてあります．
当然ながら誤差の収束状況は，グラフ表示できますし，ネットワークの構
造表示，結合荷重の表示機能も備えています．さらに学習後，ネットワーク
をテストする場合，入力，出力表示をわかりやすくするために，入力画面や出力画面のレイアウトを細かく指定できるように配慮してあります．
第 3 部の構成も第 2 部の構成と同じ考え方に立っています．
8 章では，Hopﬁeld のネットワークの原理を述べ，連想記憶として用いる方法を概説した後，本書の目的である最適化問題への適用について述べます．
9 章では Hopﬁeld のネットワークを最適化問題へ適用する方法を連立１次方程式を例として取り上げ詳述します．ここではさらに Hopﬁeld のネット
ワークをプログラム化することについても詳しく述べておきます．3 章以降
ではその部分については簡単に済ませているので，この章を参考にしてください．
10 章では，Hopﬁeld のネットワークの応用として必ず出てくる巡回セール
スパーソン問題について，解説します．本来は解の収束の性質，つまり，ローカルミニマムに陥らない方法なども重要なのですが，ここでは，単純に
Hopﬁeld のネットワークを用いた場合のみを取り扱います．
11 章では資源分配問題であるヒッチコック問題を取り上げます．
12 章では箱詰め問題を例にしました．本来はペントミノで試みたかったのですが，パソコンの制限から，もっと小さな TETRIX

3）という箱詰め問題に挑戦してみます．テトリスという名のゲームがはやっていたのをご存知か

23

1章

はじめに

と思いますが，それで使用するピースを使った箱詰め問題です．
もともとは実験装置のスケジューリング問題を Hopﬁeld のネットワークで解かせる方法を考案していて，その方法論が箱詰め問題に応用できそうだったので作ってみました．
したがってこの章で解説する方法は，各種のスケジューリング問題に応用できるはずです．
第 4 部は，本書で新たに追加した SOM（Self Organization Map：自己組織化マップ）についての部分です．階層型は，教師付きの学習機構を持ち，それにより，ニューロ間の結合荷重を学習し，目的の機能を果たすようにしています．Hopﬁeld のネットワークは結合荷重を変更するものではなく，あらかじめネットワークが持っているエネルギーを最小化するという方法で，結合荷重を決定しています．これらに対して，
SOM はデータを流しておくと，そのデータに沿うような形で結合荷重が自然に変更されていくようになっています．
13 章では，SOM について，その概要から説き起こし，その性質を確認した後，SOM の心臓部の具体的なプログラミングについて記述します．特に，SOM では，この部分を実現しておけば，各種のアプリケーションの実現はきわめて容易に行うことができる構造をもともと持っています．したがって，
14 章以降は，13 章で作成したプログラムに追加するような形で，色々なア
プリケーションを実現していきます．
14 章は，SOM の例題では，定番のカラーマップ，つまり色を並べて表示
するプログラムを作成します．
15 章では，データマイニングの例として，動物の分類を行わせます．おそらく，SOM にとって，データマイニングは最も得意とするものでしょう．
16 章は，SOM で TSP を解かせてみます．SOM は多くのデータを飲み込んで，そのデータを並べる能力を持っています．並べるところは，直線上であろうが平面であろうが，もっと高次元の空間でもかまいません．そのうち最も低次元である直線上に，並べる能力を利用して TSP を解かせてみます．
SOM のテーマだけは，Java 版においてリアルタイムに SOM が学習していく様子を見ることができるようにしています．特に TSP で経路を探索する
様子は，かなり感動的です．

24

1章

はじめに

注意点
本書でとりあげたプログラムはすべて C++ で記述してあります．
『C でつくるニューラルネットワーク』では，Microsoft C（MS-C）の Ver. 5.1 で開発しましたが，本書では，VC++ 6.0 を使用しています．前著のころとは，
プログラミングスタイルも大きく変わってきました．当初は，今で言うコン
ソールアプリケーションが主流で，Windows プログラミングは，高級機種でしか実現されていませんでした．これらの 2 つのプログラミングスタイルには，多くの差がありますが，簡単には移行できないものとして，途中結果のリアルタイム描画が挙げられます．
『C でつくるニューラルネットワーク』
当時のコンソールアプリケーションでは，描画コードを書いたところで描画しますが，Windows プログラミングでは，マルチスレッドなどを利用しなければ，リアルタイム描画はできません．これは，けっこう大変なことです．
本書は，Windows プログラミングの解説書ではなく，ニューラルネットワー
クを解説するためのものです．したがって，Windows プログラミングの難しいところは避けておくため，コンソールアプリケーション主体でプログラ
ムの作成を行います．しかしながら，どうしてもグラフィックの描画が必要な場合には，リアルタイム描画はあきらめて，最終結果を描画するだけにしておきます．この方法だと，かなり簡単に実現可能です．
Java バージョンについては，本文ではほとんど触れていませんが，ダウンロードファイルに収録してあります．Java バージョンは極力 C++ と同仕様にしていますが，一部異なっている部分もあります．詳細は，コードを参照
してください．なお，Java バージョンは，
Eclipse を使用して作成しています．
Eclipse の操作法や使用方法については，多くの解説本や web 上の解説サイトが存在しますのでそちらを参照してください．
な お， 本 プ ロ グ ラ ム は VC++ 6.0 の 環 境 で 作 成 し て い ま す が，Visual
Studio 2005 では，fabs や sqrt の引数が各型を指定できるようになっているため，あいまいであるという意味のコンパイルエラーが出る場合があります．このときは，下記のプロトタイプ宣言を挿入してください．
doubledoublefabs( double );sqrt( double );・・・ この続きは、製品版でお楽しみください。

購入ご案内
iPad 用 PDF リーダアプリ「Smooth Reader」をご利用の方は、以下のボタンをタップすると購入手続きに進みます。

その他の電子書籍や、全国書店でお買い求めになれる紙書籍に関する情報は、当社ウェブページをご覧ください。
→ http://www.personal-media.co.jp/book/302 著者略歴／著作権表示／奥付

著者略歴

平野

廣美（ひらのひろみ）

昭和 51 年，京都大学航空工学科卒業後，( 株 ) 日本 CAD，( 株 ) 新日鉄ソリューションズ等を経て，現在，楽天株式会社 楽天技術研究所に在籍．
大学卒業後まもなくして人工知能に興味を持ち始め，Lisp や Prolog の処理系の開発に従事する．
また，日本語によるデータベースの検索システムの開発や工場等の生産計画の最適化，テキストマ
イニングなどの知識処理などを行ってきた．
著書に『C でつくるニューラルネットワーク』『応用事例でわかる 遺伝的アルゴリズムプログラミング』『遺伝的アルゴリズムと遺伝的プログラミング』『続・遺伝的アルゴリズムと遺伝的プログラ
ミング』（いずれも，パーソナルメディア刊）がある．
本書に関する情報を web サイトでご案内しております．

http://www.personal-media.co.jp/book/comp/247.html

本書に記載されているハードウェア名，ソフトウェア名は一般に各メーカーの登録商標または商標です．

C++ と Java でつくるニューラルネットワーク
2008 年 6 月 10 日 初版 1 刷発行（書籍版）
2010 年 11 月 2 日 iPad 版 発行
著
発

者
行

所

平野廣美
パーソナルメディア株式会社

		
		
		

〒 141--0031 東京都品川区西五反田 1--29--1 コイズミビル
TEL（03）5759--8303 ／ FAX（03）5759--8306
E-mail pub@personal-- media.co.jp

		

http://www.personal-- media.co.jp© 2008Hiromi Hirano