情報学部 菅沼ホーム 全体目次 演習解答例 付録 索引

第17章 クラスを使用した様々な例題

  1. (プログラム例 17.0 ) ニューラルネットワーク( Hopfield ネットワーク)
  2. (プログラム例 17.1 ) ニューラルネットワーク(パーセプトロン学習)
  3. (プログラム例 17.2 ) ニューラルネットワーク(Winner-Take-All)
  4. (プログラム例 17.3 ) ニューラルネットワーク(競合学習)
  5. (プログラム例 17.4 ) ニューラルネットワーク(バックプロパゲーション)
  6. (プログラム例 17.5 ) ファジイ推論
  7. (プログラム例 17.6 ) 待ち行列(簡単な例)
  8. (プログラム例 17.7 ) 待ち行列(複雑な例)
  9. (プログラム例 17.8 ) 巡回セールスマン問題(分割法)
  10. (プログラム例 17.9 ) 巡回セールスマン問題(逐次改善法)
  11. (プログラム例 17.10 ) 遺伝的アルゴリズム(TSP,関数の最大値への応用)
  12. (プログラム例 17.11 ) 伝達関数(ゲインと位相の計算)
  13. (プログラム例 17.12 ) カレンダー
  14. (プログラム例 17.13 ) 基本アルゴリズム(その2)

  以下に示すいくつかのプログラムにおいては乱数を使用しています.C には,乱数を生成するために,srand,rand という標準関数が準備されていますが,rand は,16 ビットを使用しているためその周期が短く(最大でも,32767 ),あまり質が良い乱数を生成してくれません.そこで,以下に示す例においては,C によって記述することも考慮し,メルセンヌ・ツイスタを使用しています.しかし,C++11 で記述可能であれば,C++ の標準ライブラリであるメルセンヌ・ツイスター法による擬似乱数生成エンジンを使用できます.また,画面上でそのまま実行できるように,いくつかの例に対して JavaScript による記述も併記しています.

(プログラム例 17.0 ) ニューラルネットワーク( Hopfield ネットワーク)

  添付したプログラムは,Hopfield ネットワークを使用して,連想記憶を扱った例と,4 都市に対する巡回セールスマン問題( TSP )を扱った例です.JavaScript 版(連想記録,および,TSP)では,画面上で実行可能です.なお,以上のプログラムにおいてはクラスを使用していませんが,内容的な関係からここにあげておきます.

(プログラム例 17.1 ) ニューラルネットワーク(パーセプトロン学習)

  添付したプログラムは,p 個の入力ユニットと 1 個の出力ユニットからなるニューラルネットワークに対してパーセプトロン学習を行います.JavaScript 版では,画面上で実行可能です.なお,テキストエリアに表示されたデータの意味については,C++ によるプログラムに対する説明を参照してください.

(プログラム例 17.2 ) ニューラルネットワーク(Winner-Take-All)

  添付したプログラムは,p 個の入力ユニットと o 個の出力ユニットからなる Winner-Take-All ニューラルネットワークに対する学習を行います.Winner-Take-All ニューラルネットワークとは,出力ユニットの内,最大の出力を持つユニットだけが発火することによって,与えられたデータを分類しようとするものです.JavaScript 版では,画面上で実行可能です.なお,テキストエリアに表示されたデータの意味については,C++ によるプログラムに対する説明を参照してください.

(プログラム例 17.3 ) ニューラルネットワーク(競合学習)

  添付したプログラムは,与えられた n 個のパターンを競合学習という教師無しの方法で分類するためのものです(入力ユニット数: p,出力ユニット数: o ).JavaScript 版では,画面上で実行可能です.なお,テキストエリアに表示されたデータの意味については,C++ によるプログラムに対する説明を参照してください.

(プログラム例 17.4 ) ニューラルネットワーク(バックプロパゲーション)

  添付したプログラムは,任意の構造のネットワークをバックプロパゲーション法によって学習するためのものです.JavaScript 版では,画面上で実行可能です.なお,テキストエリアに表示されたデータの意味については,C++ によるプログラムに対する説明を参照してください.

(プログラム例 17.5 ) ファジイ推論

  添付したプログラムは,以下に示すような m 個の変数を使用した n 個の規則を基にしてファジイ推論を行うためのものです.JavaScript 版では,画面上で実行することが可能です.テキストエリア内のデータの意味に関しては,C++ によるプログラムに対する説明を参照してください.

if x1 = A11, x2 = A12, ・・・ ,xm=A1m then y = B1
if x1 = A21, x2 = A22, ・・・ ,xm=A2m then y = B2
        ・・・・・・・・・・・・・
if x1 = An1, x2 = An2, ・・・ ,xm=Anm then y = Bn

(プログラム例 17.6 ) 待ち行列(簡単な例)

  添付したプログラムは,待ち行列が 1 つで,かつ,サービス窓口の数が s (任意)であるような非常に簡単な待ち行列モデル

をシミュレーションするためのものです.客の到着やサービスの分布は,すべて指数分布となっています(修正は,非常に簡単だと思います).また,JavaScript 版では,画面上でシミュレーションを実行し,結果を得ることができます.なお,実行結果のカッコ内の値は,対応する項目に対する理論値です.

(プログラム例 17.7 ) 待ち行列(複雑な例)

  添付したプログラムは,先の例より複雑な待ち行列モデル

をシミュレーションするためのものです.入力データによって,様々な構造のモデルに対するシミュレーションも可能です.また,到着時間に関しては,(指数分布,一定時間間隔,客の人数と到着時間の指定)の中から,また,サービス時間に関しては,(指数分布,一定時間)の中から選択可能です.プログラムの最後に,上の図に示したモデルをシミュレーションするための入力例,及び,最初に示した簡単な例に対する入力例が与えてあります.

  JavaScript 版では,画面上でシミュレーションを実行し,結果を得ることができます.初期設定の状態は,上の図に示したモデルをシミュレーションするためのものです.入り口,待ち行列,窓口の数などを変えれば(変更して,その位置に対するフォーカスを外せば),対応した状態が表示されます.なお,入り口,待ち行列,及び,窓口数の最大値は 10 に設定してありますが,ファイル complex.htm の 11 ~ 13 行目を修正することによって,容易に変更可能です.

(プログラム例 17.8 ) 巡回セールスマン問題(分割法)

  添付したプログラムは,巡回セールスマン問題( TSP )を分割法によって解くためのものです.

(プログラム例 17.9 ) 巡回セールスマン問題(逐次改善法)

  添付したプログラムは,巡回セールスマン問題( TSP )を逐次改善法によって解くためのものです.

(プログラム例 17.10 ) 遺伝的アルゴリズム( TSP,関数の最大値への応用)

    [巡回セールスマン問題]

      添付したプログラムは,巡回セールスマン問題( TSP )を遺伝的アルゴリズムによって解くためのものです.

    [関数の最大値]

      遺伝的アルゴリズムの基本事項を定義したクラス Species は,巡回セールスマン問題だけに適用できるわけではありません.後一つの例として,関数,

    f(x) = sin(3*x) + 0.5 * sin(9*x) + sin(15*x+50)

    の [0, 1] 区間における最大値を求めるためのプログラム( species.h は省略)を添付しておきます.

(プログラム例 17.11 ) 伝達関数(ゲインと位相の計算)

  添付したプログラムは,伝達関数からボード線図を作成するのに必要なゲインと位相を計算するためのものです.なお,JavaScript 版では,グラフを表示し,グラフの色や線の太さを変更することが可能です.JavaScript 版では,式の数(グラフの数)や次数に制限をかけていますが(最大の式の数:5,最大次数:10 ),プログラム内の変数 max_g や max_order の値を変えることによって容易に変更できます.

(プログラム例 17.12 ) カレンダー

  添付したプログラムは,カレンダーを出力するためのものです.コンパイルした後,

実行可能ファイル名 年 月 [日] (例: cal 2011 3 )

と入力してやれば実行できます.日を入力しない場合は,指定された月のカレンダー(祝日には下線)を,指定した場合は,指定した日の曜日(祝日である場合は,その種類)を出力します.このカレンダーは,1582年以降に対して有効です(ただし,祝日は除く).なお,春分,及び,秋分の日は予測であり,実際の日にちは前年 2 月 1 日付の官報において発表されます.

(プログラム例 17.13 ) 基本アルゴリズム(その2)

  データを保存したり,また,保存されたデータの中から特定のデータを探索したりしなければならないような場合が多く存在します.基本アルゴリズム(その2)は,線形探索,二分探索,幅優先探索,深さ優先探索,ダイクストラ法( Difkstra 法),動的計画法,文字列探索など,基本的探索方法とデータの保存方法(データ構造)に関するプログラム例です.

情報学部 菅沼ホーム 全体目次 演習解答例 付録 索引