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

(プログラム例 18.1 ) ニューラルネットワーク(パーセプトロン学習)
(プログラム例 18.2 ) ニューラルネットワーク(Winner-Take-All)
(プログラム例 18.3 ) ニューラルネットワーク(競合学習)
(プログラム例 18.4 ) ニューラルネットワーク(バックプロパゲーション)
(プログラム例 18.5 ) ファジイ推論
(プログラム例 18.6 ) 待ち行列(簡単な例)
(プログラム例 18.7 ) 待ち行列(複雑な例)
(プログラム例 18.8 ) 巡回セールスマン問題(分割法)
(プログラム例 18.9 ) 巡回セールスマン問題(逐次改善法)
(プログラム例 18.10 ) 遺伝的アルゴリズム(TSP,関数の最大値への応用)
(プログラム例 18.11 ) 伝達関数(ゲインと位相の計算)
(プログラム例 18.12 ) 巡回セールスマン問題(マルチエージェント)
(プログラム例 18.13 ) カレンダー

  この章では,クラスを使用した様々な例題について述べます.一部の Java のプログラムでは,結果等を図示するため,まだ説明していない Java の機能を利用していますが,それらの意味については第W部を参照してください.

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

  添付したプログラムは,p 個の入力ユニットと 1 個の出力ユニットからなるニューラルネットワークに対してパーセプトロン学習を行います.コンパイルした後,

  実行可能ファイル名 入力ファイル名 出力ファイル名

と入力してやれば実行できます.出力ファイル名は,結果を出力するファイルの名前であり,省略すると画面に出力されます.また,入力ファイル名は,実行に必要なデータを記述したファイルの名前であり,たとえば以下のような形式で作成します.
最大試行回数 100 入力セルの数 2 訓練例の数 4 乱数 123 入力データファイル or.dat
  日本語で記述した部分(「最大試行回数」,「入力セルの数」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください.各データの意味は以下に示す通りです.

最大試行回数

  学習回数を入力します.この例では 100 を与えています.

入力セルの数

  入力セル(入力ユニット)の数を入力します.この例では 2 となっています.

訓練例の数

  訓練例の数を入力します(この例では 4 ).訓練例は,「入力データファイル」の項に入力されたファイル(この例では,or.dat )に記述します.ファイル or.dat は,たとえば,以下のようになります.
OR演算の訓練例.各行の最後のデータが目標出力値 -1 -1 -1 -1 1 1 1 -1 1 1 1 1
  1 行目はこのファイルの説明であり,何を記述しても構いません.ただし,前と同様,削除したり複文にするようなことはしないでください.2 行目以下が 4 つの訓練例を表しています.各訓練例において,最初の 2 つの値が各入力ユニットに入力される値であり,3 番目の値が,そのときの目標出力値になっています.

乱数

  乱数の初期値です.

  上で説明したデータの元で実行すると,たとえば,以下のような出力が得られます.
重み 1 1 1 分類結果 -1-1 Cor -1 Res -1 -1 1 Cor 1 Res 1 1-1 Cor 1 Res 1 1 1 Cor 1 Res 1 !!すべてを分類(試行回数:6)
  2 行目の 2 番目以降のデータが,各入力ユニットから出力ユニットへ向かう枝に付けられた重みです.また,1 番目のデータはバイアスです.分類結果において,Cor の次に出力された値が,入力データ(たとえば,4 行目では「-1 -1」)に対する目標出力値であり,また,Res の後の値が実際の計算(分類)結果です.

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

  添付したプログラムは,p 個の入力ユニットと o 個の出力ユニットからなる Winner-Take-All ニューラルネットワークに対する学習を行います.Winner-Take-All ニューラルネットワークとは,出力ユニットの内,最大の出力を持つユニットだけが発火することによって,与えられたデータを分類しようとするものです.コンパイルした後,

  実行可能ファイル名 入力ファイル名 出力ファイル名

と入力してやれば実行できます.出力ファイル名は,結果を出力するファイルの名前であり,省略すると画面に出力されます.また,入力ファイル名は,実行に必要なデータを記述したファイルの名前であり,たとえば以下のような形式で作成します.
最大試行回数 100 入力セルの数 2 出力セルの数 2 訓練例の数 4 乱数 123 入力データファイル or.dat
  日本語で記述した部分(「最大試行回数」,「入力セルの数」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください.各データの意味は以下に示す通りです.

最大試行回数

  学習回数を入力します.この例では 100 を与えています.

入力セルの数

  入力セル(入力ユニット)の数を入力します.この例では 2 となっています.

出力セルの数

  出力セル(出力ユニット)の数を入力します.この例では 2 となっています.

訓練例の数

  訓練例の数を入力します(この例では 4 ).訓練例は,「入力データファイル」の項に入力されたファイル(この例では,or.dat )に記述します.ファイル or.dat は,たとえば,以下のようになります.
OR演算の訓練例.各行の最後の2つのデータが目標出力値 -1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1 1 1 -1
  1 行目はこのファイルの説明であり,何を記述しても構いません.ただし,前と同様,削除したり複文にするようなことはしないでください.2 行目以下が 4 つの訓練例を表しています.各訓練例において,最初の 2 つの値が各入力ユニットに入力される値であり,3 番目および 4 番目の値が,そのときの 1 番目および 2 番目の出力ユニットに対する目標出力値になっています.たとえば,2 行目における「-1 1」とは,2 番目の出力ユニットが発火することを意味しています.

乱数

  乱数の初期値です.

  上で説明したデータの元で実行すると,たとえば,以下のような出力が得られます.
重み 1 1 1 -1 -1 -1 分類結果 -1-1 Cor -1 1 Res 2 -1 1 Cor 1-1 Res 1 1-1 Cor 1-1 Res 1 1 1 Cor 1-1 Res 1 !!すべてを分類(試行回数:6)
  2 行目および 3 行目の 2 番目以降のデータが,各入力ユニットから各出力ユニット( 2 行目が 1 番目,3 行目が 2 番目の出力ユニットに対応)へ向かう枝に付けられた重みです.また,各行の 1 番目のデータはバイアスです.分類結果において,Cor の次に出力された値が,たとえば 5 行目においては,入力が「-1 -1」である時の目標出力値(「-1 1」で,2 番目の出力ユニットが発火すべきであることを示している)であり,また,Res の後の値が実際の計算(分類)結果です.この例では,目標通り,2 番目の出力ユニットが発火したことを意味しています.なお,0 は,分類の失敗を意味しています.

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

  添付したプログラムは,与えられた n 個のパターンを競合学習という教師無しの方法で分類するためのものです(入力ユニット数: p,出力ユニット数: o ).コンパイルした後,

  実行可能ファイル名 入力ファイル名 出力ファイル名

と入力してやれば実行できます.出力ファイル名は,結果を出力するファイルの名前であり,省略すると画面に出力されます.また,入力ファイル名は,実行に必要なデータを記述したファイルの名前であり,たとえば以下のような形式で作成します.
最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 乱数 123 係数(0〜1) 0.1 入力データファイル pat.dat
  日本語で記述した部分(「最大試行回数」,「入力セルの数」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください.各データの意味は以下に示す通りです.

最大試行回数

  学習回数を入力します.この例では 1000 を与えています.

入力セルの数

  入力セル(入力ユニット)の数を入力します.この例では 9 となっています.

出力セルの数

  出力セル(出力ユニット)の数を入力します.この例では 3 となっています.

訓練例の数

  訓練例(分類すべきパターン)の数を入力します(この例では 9 ).訓練例は,「入力データファイル」の項に入力されたファイル(この例では,pat.dat )に記述します.ファイル pat.dat は,たとえば,以下のようになります.各行のデータが一つのパターンに相当しています.
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
乱数

  乱数の初期値です.

係数(0〜1)

  重みを修正する際の係数です.0 と 1 の間の数値を入力してください(この例では,0.1 )

  上で説明したデータの元で実行すると,たとえば,以下のような出力が得られます.
分類結果 0 0 0 0 0 0 0 1 1 Res 3 0 0 0 0 0 0 1 0 1 Res 3 0 0 0 0 0 0 1 1 0 Res 3 0 0 0 0 1 1 0 0 0 Res 2 0 0 0 1 0 1 0 0 0 Res 2 0 0 0 1 1 0 0 0 0 Res 2 0 1 1 0 0 0 0 0 0 Res 1 1 0 1 0 0 0 0 0 0 Res 1 1 1 0 0 0 0 0 0 0 Res 1
  各行において,res の後ろに書かれた数値が,その左側に与えられたパターンが分類された結果です.たとえば,2 行目は,パターン「0 0 0 0 0 0 0 1 1」がグループ 3 に分類された(出力ユニットの内,3 番目のユニットの活性度が最も大きくなった)ことを意味しています.

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

  添付したプログラムは,任意の構造のネットワークをバックプロパゲーション法によって学習するためのものです.コンパイルした後,

  実行可能ファイル名 制御データファイル名 構造データファイル名

と入力してやれば実行が開始されます.

  制御データファイルは,バックプロパゲーションの全体の実行を制御するためのものであり,たとえば以下のような形式で作成します.なお,以下,右図に示すようなネットワークにより,排他的論理和を学習させる場合を例として説明を行っていきます.
誤差 0.1 出力 -2 出力ファイル kekka 順番 0 η 0.5 α 0.8 乱数 123
  日本語で記述した部分(「誤差」,「出力」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください(以下の説明においても同様).各データの意味は以下に示す通りです.

誤差

  収束の判定を行うための値です.各出力ユニットの実際の出力値と目標出力値の差がこの値以下になると収束と見なします.

出力

  出力先とその方法を指定します.以下に示すいずれかの値を入力します.
  • =0:誤って認識した数だけ出力
  • =1:認識結果を出力
  • =2:認識結果と重みを出力
なお,負の値を使用すると,結果をファイルへも出力します.この例の場合,-2 となっていますので,認識結果と重みが,ディスプレイとファイルに出力されます.

出力ファイル

  上の「出力」の項目に対して負の値を入力したときに必要となり,出力ファイル名を入力します.なお,ファイルへ出力をしないときは,「出力ファイル kekka 」の項を削除しておいてください.

順番

  学習例をどのような順番で与えるかを指定します.0 を入力すると学習例が入力された順番通り,また,1 を入力するとランダムに学習例が選ばれます.

η,および,α

  重みを修正する際の係数です

乱数

  乱数の初期値です

  構造データファイルは,ネットワークの構造(ユニットの数,接続関係等)を記述するためのものであり,たとえば以下のような形式で作成します.
入力ユニット数 2 出力ユニット数 1 関数タイプ 0 隠れ層の数 1 各隠れ層のユニット数(下から) 1 バイアス入力ユニット数 1  ユニット番号:出力ユニットから順に番号付け  入力方法:=-3:固定,=-2:入力後学習,=-1:乱数(default,[-0.1,0.1]))  値:バイアス値(ー2またはー3の時)または一様乱数の範囲(下限,上限) 1 -1 -0.1 0.1 接続方法の数 2  ユニット番号:ユニットk1からk2を,k3からk4に接続  接続方法:=0:接続なし,=1:乱数,=2:重み入力後学習,=3:重み固定  値:重み(2または3の時)または一様乱数の範囲(1の時:下限,上限) 3 4 1 2 1 -0.1 0.1 2 2 1 1 1 -0.1 0.1
  各データの意味は以下に示す通りです.

入力ユニット数

  入力ユニット数を入力します

出力ユニット数

  出力ユニット数を入力します

関数タイプ

  各ユニットの出力値を計算するシグモイド関数の形を指定します.0 を入力すると各ユニットの出力値の範囲が [0, 1] となり,また,1 を入力すると [-1, 1] となります.

隠れ層の数

  隠れ層(入力層,出力層は含まれません)の数を入力します.

各隠れ層のユニット数(下から)

  各隠れ層に含まれるユニット数を入力します.たとえば,隠れ層の数が 2 であり(当然,「隠れ層の数」に対応する値も 2 にしなければなりません),1 番目の隠れ層(入力層のすぐ上)に含まれるユニット数が 5,かつ,2 番目の隠れ層に含まれるユニット数が 3 であるときは,この部分は,上で述べた項目も含め,

   隠れ層の数 2 各隠れ層のユニット数(下から) 5 3

となります.なお,隠れ層の数が 0 の場合は,「各隠れ層のユニット数」以下を削除してください.

バイアス入力ユニット数

  何も指定しなければ,各ユニットのバイアスの初期値は,[-0.1 0.1] 区間の一様乱数によって設定されます.バイアスの初期値を変更したり,または,特定の値に固定したいような場合にこの項を使用します.ここで指定するのは,特別な指定を行いたいユニットの数です.なお,この項に続く 3 行は単なるコメントですが,この項に 0 を入力した場合でも削除しないでください.

1 -1 -0.05 0.05

  バイアス指定データです.上の項で指定した数だけこのようなデータが必要になります.このデータの意味するところは以下の通りです.まず,最初の数字(この例では 1 )は,ユニット番号を表しています.ネットワークの各ユニットは出力ユニットから順番に図に示すような番号付けが行われます.その番号を指定してください.

  次の数字(この例では -1 )は,バイアスの設定方法を示します.-1 の場合は,一様乱数を使用します.この例のように,次に続く 2 つのデータによって一様乱数の区間(この例の場合,[-0.05 0.05] )を指定します.

  -2 や -3 を指定した場合は,一様乱数を使用せず,次に続くデータがそのままバイアスの初期値となります.たとえば,ユニット 1 のバイアスの初期値を 0.1 にしたい場合は以下のようにします.

    1 -2 0.1

なお,-3 の場合は,与えられた初期値を学習によって変更せず,そのまま固定されます.

接続方法の数

  接続方法を示すデータ群の数を入力します.接続方法を入力しないと,各ユニットは全く接続されない状態となります.従って,この項には必ず 0 より大きい値が設定されるはずです.なお,この項に続く 3 行は単なるコメントですが,絶対に削除しないでください.

3 4 1 2 1 -0.1 0.1
2 2 1 1 1 -0.1 0.1

  各々,接続方法を示すデータ群です.この例の場合,上の項で 2 を入力しているため,これら 2 つのデータ群を必要とします.各データの意味するところは以下の通りです.

  最初の 4 つのデータ( k1, k2, k3, k4 とする)は接続するユニット番号を表しています.ユニット番号が k1 から k2 (その間のユニットも含む)であるユニットを,ユニット番号が k3 から k4 (その間のユニットも含む)であるユニットに接続することを意味しています.たとえば,「3 5 1 2」の入力により,「3-1, 3-2, 4-1, 4-2, 5-1, 5-2」という 6 つの接続が生成されます.この例の場合,どのようになるかは,図と照らし合わせてみれば明らかだと思います.

  5 つ目の数字は,接続方法を表し,0,1,2,および,3 のいずれかの値を設定します.0 を選択すると最初の 4 つのデータで指定されたユニット間の接続が削除されます.それ以外の値を入力した場合は,指定されたユニット間が接続されます.ただし,重みの初期値の設定が指定した値によって異なってきます.その意味は,ユニットのバイアスの項で説明した -1,-2,および,-3 の場合を,重みの初期値に読み替えてみれば明らかだと思います.

  上で説明したデータの元で実行すると,以下に示すようなメッセージが出力されますので,下線部を入力してください.

学習回数は? 5000
何回毎に収束を確認しますか? 500
学習パターンのファイル名は? learn.dat

  与えられた 1 つの学習例(訓練例,学習パターン)のもとで,重みを修正する手続きを 1 回の学習とします.従って,上の例では,この動作を 5000 回行うことになります.

  このプログラムでは,1 回の学習毎に収束したか否か(すべての例を正しく分類したか否か)の判定を行いません.上の例の 2 行目で与えられた回数毎にその判定を行います.そのとき,収束していれば,学習手続きを終了します.

  3 番目に与えているのが,学習例を記述したファイル名です. この例の場合,ファイル learn.dat は以下のように記述されています.
パターンの数 4 入力ユニット数 2 出力ユニット数 1 入力1 0 0  出力1 0 入力2 0 1  出力2 1 入力3 1 0  出力3 1 入力4 1 1  出力4 0
  各データの意味するところは以下の通りです.

パターンの数

  学習例の数を入力します.この例では,2 ビットの排他的論理和を 4 つの学習例を使用して学習を行うことになります.なお,入力ユニット数,および,出力ユニット数に関しては,構造データファイルで指定した値と同じ値に設定してください.

入力1

  各学習例において,各入力ユニットに入力される値を設定します.この例の場合,入力ユニットの数が 2 ですので,2 つの値を必要とします.

出力1

  上の入力が与えられたときの目標出力値を入力します.上の項と同様,出力ユニットの数だけ数値が並ぶことになります.

  以上のデータを与えると,以下のような出力が得られます.
回数 500 誤って認識したパターン数 4 回数 1000 誤って認識したパターン数 4 回数 1500 誤って認識したパターン数 4 回数 2000 誤って認識したパターン数 4 回数 2500 誤って認識したパターン数 4 回数 3000 誤って認識したパターン数 3 回数 3500 誤って認識したパターン数 0
  収束,または,規定の学習回数を終了すると,以下のような結果がディスプレイ(および,ファイル)に出力されます.なお,ディスプレイ出力は,適宜停止しますが,return キーを押せば次の出力が得られます.
入力パターン 1 0.00 0.00 出力パターン(理想) 0.000 (実際) 0.060 入力パターン 2 0.00 1.00 出力パターン(理想) 1.000 (実際) 0.911        ・・・・・・ 重み to 1 from 2 -10.700 3 -4.675 4 -4.675 to 2 from 3 -6.825 4 -6.827 バイアス 1 7.139 2 2.501
  出力パターンの理想の右側に書かれた値が目標出力値であり,その下が,実際の出力値を表しています.また,重みの項は,ユニット 2 から 1 への重みが -10.700,3 から 1 への重みが -4.675 等のように読んでください.

  学習が終了すると,

  未学習パターンの認識を行いますか?(=1:行う,=0:行わない)

というメッセージが出力されます.未学習パターンの認識を行う場合は,1 を入力した後,その後で出力されるメッセージに従って,未学習パターンを記述したファイル名(認識データ)を入力してください.なお,未学習パターンファイルの記述方法は,学習例ファイル(学習データ)と全く同じです.添付したプログラム内では,学習データと全く同じデータが与えてありますので,認識データに対しても同じ結果が得られるはずです.

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

  添付したプログラムは,以下に示すような m 個の変数を使用した n 個の規則を基にしてファジイ推論を行うものです.

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

コンパイルした後,

  実行可能ファイル名 規則ファイル名 推論ファイル名 出力ファイル名

と入力してやれば実行できます.出力ファイル名は,結果を出力するファイルの名前です.また,規則ファイル名は,規則等を記述したファイルの名前であり,たとえば以下のような形式で作成します.
推論方法 0 規則の数 3 変数の数 1 積分の分割数 100 規則1  変数1 1 中心と幅 1.0 1.0  右辺(中心と幅) 1.0 15.0 規則2  変数1 1 中心と幅 2.0 1.0  右辺(中心と幅) 11.0 15.0 規則3  変数1 1 中心と幅 3.0 1.0  右辺(中心と幅) 21.0 15.0
  日本語で記述した部分(「推論方法」,「規則の数」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください.上のデータは,次に示す 3 つの規則を表現したものであり,また,各データの意味はそれ以降に示す通りです.

   if xがおよそ1 then yはおよそ1
   if xがおよそ2 then yはおよそ11
   if xがおよそ3 then yはおよそ21

推論方法

=0 : AND, OR  AND 演算と OR 演算を利用
=1 : *, OR  AND 演算の代わりに乗算を利用
=2 : *, +  OR 演算の代わりに加算を利用

規則の数

  規則の数を入力します

変数の数

  変数の数を入力します

積分の分割数

  推論値を求めるため,メンバーシップ関数の数値積分を行います.その際の分割数を入力します.

規則1

  次の「規則2」までのデータを規則の数だけ繰り返して入力します.

変数1 1 中心と幅 1.0 1.0

  この例では,変数の数が 1 であるため,1 行だけですが,一般的には,この行のデータを変数の数だけ入力します.「変数1」の次の数字は,この規則で対応する変数を使用するか否かを指定するためのものです.0 の場合は使用しない(「中心と幅」以降のデータは入力しないでください),また,1 の場合は使用することを意味しています.使用する場合は,メンバーシップ関数の形を決めるため,「中心と幅」以降のデータが必要となります.このプログラムでは,三角型のメンバーシップ関数だけを扱っています.「中心と幅」に続く 2 つのデータは,三角形の中心の位置と,底辺の半分の長さを意味しています.

右辺(中心と幅) 1.0 15.0

  規則の右辺のメンバーシップ関数の形を指定します.

  推論ファイルは,推論値を得たい x の値を指定するためのファイルであり,以下のような形式で作成します.
変数の数 1 データ数 21 変数1 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0
  各データの意味は以下の通りです.

変数の数

  変数の数を入力します.規則ファイルで指定した値と一致する必要があります.

データ数

  各変数に与えるデータ数を入力します.

変数1 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0

  推論結果を得たいデータを入力します.1 つの変数に対するデータが複数行になっても構いません.変数の数だけこのデータが必要になります.

  以上のデータを準備して実行すると,推論データに対応した推論結果がファイルに出力されます.

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

  添付したプログラムは,待ち行列が 1 つで,かつ,サービス窓口の数が s (任意)であるような非常に簡単な待ち行列モデルをシミュレーションするためのものです.客の到着やサービスの分布は,すべて指数分布となっています(修正は,非常に簡単だと思います).コンパイルした後,

  実行可能ファイル名

と入力し,メッセージに応じて適当な入力値を与えてやれば実行可能です.なお,実行結果のカッコ内の値は,対応する項目に対する理論値です.

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

  添付したプログラムは,先の例より複雑な待ち行列モデルをシミュレーションするためのものです.客の到着やサービスの分布は,すべて指数分布となっています(修正は,非常に簡単だと思います).コンパイルした後,

  実行可能ファイル名

と入力すれば実行できます.なお,どのようなモデルをシミュレーションするかによって,main プログラムを書き直してやる必要があります.その方法については,添付したプログラムを参考にしてください.

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

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

  実行可能ファイル名 ケーススタディファイル名

と入力してやれば実行できます.ケーススタディファイルは,たとえば,同じ問題を乱数の初期値を変えて実行したいような場合に効果的であり,たとえば以下のような形式で作成します.
問題の数 2 問題 data\pr439.tsp 乱数の数 10  乱数 1  乱数 12  乱数 123  乱数 1234  乱数 12345  乱数 54321  乱数 5432  乱数 543  乱数 54  乱数 5 問題 data\kroA100.tsp 乱数の数 10  乱数 1  乱数 12  乱数 123  乱数 1234  乱数 12345  乱数 54321  乱数 5432  乱数 543  乱数 54  乱数 5
  日本語で記述した部分(「問題の数」,「問題」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください(以下の説明においても同様).各データの意味は以下に示す通りです.

問題の数

問題の数を入力します.この例では 2 となっています.

問題

各問題の始まりであり,上で与えた問題の数だけ以下のデータが繰り返されます.この項には,データファイル名を入力します(上の例では,data\pr439.tsp と data\kroA100.tsp ).

乱数の数

乱数の初期値を変え,何回試行を行うかを入力します(上の例では,いずれの問題に対しても 10 ).

乱数

乱数の初期値を入力します.乱数の数の項で入力した数だけ繰り返されます.

  データファイルは,問題自身とその解法の詳細を記述するためのファイルであり,たとえば以下のように記述します.
都市の数 439 選択方法(0:最良,1:最初) 1 近傍(2or3) 3 整数 1 出力(0:ディスプレイ,1:ファイル) -1 出力ファイル名 result\pr439 分割数 X 4 Y 3 最大試行回数 1000 7125 11300 7225 11050 ・・・・・ 1775 5375 2075 6475
  各データの意味は以下に示す通りです.

都市の数

  都市の数を入力します

選択方法(0:最良,1:最初)

  分割された各領域の最適値を逐次改善法を利用して求めます.逐次改善法においては,λ近傍に含まれる(λ本の)枝を入れ替えるという作業を距離の改善がなされなくなるまで続けることによって,解を求めます.各ステップにおいて,どのλ本の枝を入れ替えるかを探索していきますが,ここに 0 を入力すると,λ本の枝を入れ替えるすべての組み合わせの内,最も改善度が高いものを選択します.また,1 を入力すると,最初に見つかったλ本の枝をすぐ入れ替えます.通常,1 で良いと思います.

近傍(2or3)

  λの値を入力してください,利用できるのは 2 または 3 だけです.

整数

  各都市の位置情報( x 座標と y 座標)の入力方法と都市間距離の計算方法を指定します.
=1 : 位置情報は整数,距離は整数計算
=-1 : 位置情報は実数,距離は整数計算
=-2 : 位置情報は実数,距離を実数計算

出力(0:ディスプレイ,1:ファイル)

  結果の出力方法を入力します.
=-1 : 得られた経路長だけを画面に表示します
=0 : 経路長と巡回する都市の順番を画面に表示します
=1 : 得られた経路長だけをファイルに保存します.なお,保存は,追加( append )形式で行われます.
=2 : 経路長と巡回する都市の順番をファイルに保存します.なお,保存は,追加( append )形式で行われます.

出力ファイル名

  結果を保存するファイル名です.なお,画面に出力する場合も,この項目を必ず入力してください(利用はされません).

分割数 X

  x 軸方向の分割数です.1 (分割しない)以上の値を入力してください.この例に場合は,4 分割します.

  y 軸方向の分割数です.1 (分割しない)以上の値を入力してください.この例の場合は,3 分割します.

最大試行回数

  逐次改善法における最大試行回数です.もちろん,この回数より少ない回数で改善が不可能になればその時点で終了します.

7125 11300
  ・・・・・

  以下,各都市の x 座標と y 座標です.都市の数だけ必要になります.この入力された順番が,その都市の都市番号になります( 0 から始まる).

  結果を画面に出力する場合,各領域の解が求まるたびに入力待ちの状態になります.また,都市の順番も出力する場合は,10 都市出力する毎に入力待ちの状態になります.return キーを入力すれば継続されます.

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

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

  実行可能ファイル名 ケーススタディファイル名

と入力してやれば実行できます.ケーススタディファイルは,たとえば,同じ問題を乱数の初期値を変えて実行したいような場合に効果的であり,たとえば以下のような形式で作成します.
問題の数 2 問題 data\data10.tsp 乱数の数 10  乱数 1  乱数 12  乱数 123  乱数 1234  乱数 12345  乱数 54321  乱数 5432  乱数 543  乱数 54  乱数 5 問題 data\kroA100.tsp 乱数の数 10  乱数 1  乱数 12  乱数 123  乱数 1234  乱数 12345  乱数 54321  乱数 5432  乱数 543  乱数 54  乱数 5
  日本語で記述した部分(「問題の数」,「問題」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください(以下の説明においても同様).各データの意味は以下に示す通りです.

問題の数

問題の数を入力します.この例では 2 となっています.

問題

各問題の始まりであり,上で与えた問題の数だけ以下のデータが繰り返されます.この項には,データファイル名を入力します(上の例では,data\data10.tsp と data\kroA100.tsp ).

乱数の数

乱数の初期値を変え,何回試行を行うかを入力します(上の例では,いずれの問題に対しても 10 ).

乱数

乱数の初期値を入力します.乱数の数の項で入力した数だけ繰り返されます.

  データファイルは,問題自身とその解法の詳細を記述するためのファイルであり,たとえば以下のように記述します.
都市の数 10 最大試行回数 3000 選択方法(0:最良,1:最初) 1 近傍(2or3) 3 整数 1 出力レベル(負はファイル) 0 出力方法(-1:なし,0:すべて,1:評価値) 1 出力ファイル名 result\data10 表示間隔 0 -58 37 55 -19 6 -79 27 -30 44 -94 33 -58 -94 87 -9 3 33 69 43 -57
  各データの意味は以下に示す通りです.

都市の数

  都市の数を入力します

最大試行回数

  逐次改善法における最大試行回数です.もちろん,この回数より少ない回数で改善が不可能になればその時点で終了します.

選択方法(0:最良,1:最初)

  最適値を逐次改善法を利用して求めます.逐次改善法においては,λ近傍に含まれる(λ本の)枝を入れ替えるという作業を距離の改善がなされなくなるまで続けることによって,解を求めます.各ステップにおいて,どのλ本の枝を入れ替えるかを探索していきますが,ここに 0 を入力すると,λ本の枝を入れ替えるすべての組み合わせの内,最も改善度が高いものを選択します.また,1 を入力すると,最初に見つかったλ本の枝をすぐ入れ替えます.通常,1 で良いと思います.

近傍(2or3)

  λの値を入力してください,利用できるのは 2 または 3 だけです.

整数

  各都市の位置情報( x 座標と y 座標)の入力方法と都市間距離の計算方法を指定します.
=1 : 位置情報は整数,距離は整数計算
=-1 : 位置情報は実数,距離は整数計算
=-2 : 位置情報は実数,距離を実数計算

出力レベル(負はファイル)

  結果の出力方法を入力します.
=0 : 最終結果だけを出力します.
=n : n 回毎に出力します.なお,n が負の場合は,-n 回毎に,ファイルに追加形式( append )で出力されます.n が正の場合は,出力するたびに,出力を行うか否か,および,どこに出力するかを聞いてきます.したがって,この段階において,出力先をファイルに変更することも可能です( n = 0 の場合も同様).

出力方法(-1:なし,0:すべて,1:評価値)

  結果の出力方法を入力します.
=-1 : 出力を全く行いません.
=0 : 経路長と巡回する都市の順番を出力します.
=1 : 得られた経路長だけを出力します.ただし,最終結果だけは,都市の順番も出力します.

出力ファイル名

  結果を保存するファイル名です.なお,画面に出力する場合も,この項目を必ず入力してください(利用はされません).

表示間隔

  計算がどこまで進んでいるのかを示すため,結果の概略を画面に表示しますが,それを何回毎に行うのかを入力します.

-58 37
55 -19
  ・・・・・

  以下,各都市の x 座標と y 座標です.都市の数だけ必要になります.この入力された順番が,その都市の都市番号になります( 0 から始まる).

  結果を画面に出力する場合,各ケースが終了毎に入力待ちの状態になります.また,都市の順番も出力する場合は,指定された数の都市を出力する毎に入力待ちの状態になります.return キーを入力すれば継続されます.

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

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

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

  実行可能ファイル名 ケーススタディファイル名

と入力してやれば実行できます.ケーススタディファイルは,たとえば,同じ問題を乱数の初期値を変えて実行したいような場合に効果的であり,たとえば以下のような形式で作成します.
3 12345 data\species.10 data\data10.tsp 123 data\species.10 data\data10.tsp 1 data\species.10 data\data10.tsp
  最初の数字はケーススタディの数(この場合は 3 ケース)であり,2 行目以降が各ケーススタディのデータになります.各行の最初の数字が乱数の初期値,2 番目が Species 記述ファイル名,および,3 番目が TSP 記述ファイル名です.

  Specific 記述ファイルは,遺伝的アルゴリズムに対する基本事項を記述するためのファイルであり,たとえば以下のように記述します.
対立遺伝子上限 9 対立遺伝子下限 0 最大遺伝子長 10 最小遺伝子長(負の時は,最大遺伝子長で固定) -1 遺伝子の重複 0 個体の重複(同じ染色体の個体) 0 集団サイズ 10 子供 10
  日本語で記述した部分(「対立遺伝子上限」,「対立遺伝子下限」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください.また,以下の説明においても同様ですが,入力データによっては,そのケースには不必要なデータが現れることがあります.その場合においても,データの説明とデータは削除せず残しておいてください(内部的には,使用されません).各データの意味は以下に示す通りです.

対立遺伝子上限と対立遺伝子下限

  説明通り,対立遺伝子上限と対立遺伝子下限を入力します.プログラム内では,初期集団の発生や突然変異操作の中で使用されます.たとえば,染色体を 0 と 1 の組み合わせで表現したいときは,1 と 0 を入力します.また,TSP のような場合で,かつ,標準的な初期集団発生手続きを使用する場合は,上限と下限の間の数字(上限と下限を含む)の数が,都市の数と一致する必要がある点に注意してください.なお,一つの遺伝子の値に対して int を使用していますので,int で表現できない上限や下限を入力しないでください.

最大遺伝子長と最小遺伝子長(負の時は,最大遺伝子長で固定)

  このプログラムでは,可変長の染色体を使用できます.そのような場合,遺伝子長の上限と下限を入力します.最小遺伝子長に負の値を入力すると,最大遺伝子長で与えた固定長の染色体となります.

遺伝子の重複

  一つの染色体の中に同じ遺伝子を複数個含むことができるか否かを入力します.1 を入力すると可能になり,0 を入力すると不可能になります.TSP のような場合は,0 を入力します.

個体の重複(同じ染色体の個体)

  個体集団の中に同じ遺伝子の並びを持った個体が複数存在することを許すか否かを入力します.1 を入力すると許し,0 を入力すると許しません.

集団サイズ

  集団サイズを入力します.このプログラムでは,集団サイズは固定です.

子供

  交叉により発生させる子供の数を入力します.たとえば,1 点交叉のように,2 つの親から 2 つの子供を生成する交叉においては,ここで入力された値の半分の回数だけ交叉が実行されます.

  TSP 記述ファイルは,TSP を解くために必要なデータ(クラス TSP に関するデータ)を記述するファイルであり,たとえば以下のように記述します.なお,クラス TSP は,クラス Species の導出クラスになっています.Species で定義した値と矛盾しないように注意してください.たとえば,都市の数は,最大遺伝子長と等しくなければなりません.
出力レベル(負はファイル) 10 出力方法(0:適応度+順番,1:適応度) 0 出力ファイル名 result\kekka 表示間隔 10 交叉方法 1 交叉確率 1.0 点 5 位置 0 方法 1 バイアス 0 ステップ 1 突然変異方法 1 突然変異率 0.03 幅 1 平均 0.0 標準偏差 1.0 エリート 2 方法 1 バイアス 0 ステップ 1 都市数 10 最大世代交代数 2000 近傍探索(0:行わない,1:行う) 0 近傍(2or3) 2 選択方法(0:最良,1:最初) 1 -58 37 55 -19 6 -79 27 -30 44 -94 33 -58 -94 87 -9 3 33 69 43 -57
  各データの意味は,以下に示すとおりです.

出力レベル(負はファイル)

  結果の出力方法を入力します.
=0 : 最終結果だけを出力します.
=n : n 回毎に出力します.なお,n が負の場合は,-n 回毎に,ファイルに追加形式( append )で出力されます.n が正の場合は,出力するたびに,出力を行うか否か,および,どこに出力するかを聞いてきます.したがって,この段階において,出力先をファイルに変更することも可能です( n = 0 の場合も同様).

出力方法(0:適応度+順番,1:適応度)

  結果の出力方法を入力します.
=0 : 経路長と巡回する都市の順番を出力します.
=1 : 得られた経路長だけを出力します.ただし,最終結果だけは,都市の順番も出力します.

出力ファイル名

  結果を保存するファイル名です.

表示間隔

  計算がどこまで進んでいるのかを示すため,結果の概略を画面に表示しますが,それを何世代毎に行うのかを入力します.

交叉方法

  交叉方法を入力します.以下の方法から選択できます.内容の詳細については,クラス Species の対応するメンバー関数を参照してください.
=-1 : 交叉を使用しない
=0 : 親のコピー
=1 : 循環交叉
=2 : 部分的交叉
=3 : 順序交叉
=4 : 一様順序交叉
=5 : 一様位置交叉
=6 : エッジ組み替え交叉
=7 : サブツアー交叉
  その他,このプログラムでは使用していませんが,クラス Species には以下の交叉方法も定義してあります.
  • 多点交叉
  • 一様交叉
  • 平均化交叉

交叉確率

  交叉確率を入力します.

  多点交叉の場合は何点交叉かを(たとえば,1 点交叉の場合は 1 ),また,サブツアー交叉の場合は,1 つのペアーに対する交叉回数を入力します.それ以外の場合は,利用されません.

位置

  多点交叉の場合だけに利用され,2 つの親の交叉点を同じにするか否かを示します.0 を入力すると同じ,また,1 を入力すると異なる交叉点が使われます.交叉点が異なる場合,子供の遺伝子長が可変になりますので,Species 記述ファイルにおいて遺伝子長を可変長にしておいてください( TSP の場合はあり得ませんが).

方法

  このデータを含め以下,3 つのデータ(「ステップ」までのデータ)は,サブツアー以外の交叉において利用されます.まず,このデータは,交叉における親の選択方法を指定します.
=-1 : ランダムに選択
=0 : 適応度に比例した確率で選択
=1 : 最小値からの差(ただし,α以下の場合はα)に比例した確率で選択
=2 : 評価値に順位をつけ,適応度の値を減少率βで線形化し,その値に応じた確率で選択

バイアス

  方法が 1 の場合はα,また,方法が 2 の場合は初期値

ステップ

  方法が 2 の場合においてβ

突然変異方法

  突然変異方法を入力します.以下の方法から選択できます.内容の詳細については,クラス Species の対応するメンバー関数を参照してください.
=-1 : 突然変異を使用しない
=0 : 移動
=1 : 逆位
=2 : スクランブル
=3 : 転座
  その他,このプログラムでは使用していませんが,クラス Species には以下の突然変異方法も定義してあります.
  • 対立遺伝子への置換
  • 重複
  • 摂動
  • 挿入
  • 削除

突然変異率

  突然変異率を入力します

  突然変異方法が,スクランブル,転座,重複,挿入,および,削除であるとき利用され,突然変異を起こす幅(染色体の部分列であり,遺伝子長より短い必要がある)を入力します.0 を入力すると幅がランダムに決められます.
  また,突然変異方法が摂動であるときは,摂動の確率分布を入力します.0 のときは正規分布,また,1 のときは一様分布となります.

平均

  突然変異方法として摂動を使用するとき利用されます.正規分布の時は平均,また,一様分布の時は分布の下限を入力します.

標準偏差

  突然変異方法として摂動を使用するとき利用されます.正規分布の時は標準偏差,また,一様分布の時は分布の上限を入力します.

エリート

  このプログラムでは,エリート選択とルーレット選択を利用しています.つまり,エリート選択によってここで指定した数だけの個体を選択した後,残りをルーレット選択で選択します.

方法

  ルーレット板の作成方法を入力します.
=-1 : ランダムに選択
=0 : 適応度に比例した確率で選択
=1 : 最小値からの差(ただし,α以下の場合はα)に比例した確率で選択
=2 : 評価値に順位をつけ,適応度の値を減少率βで線形化し,その値に応じた確率で選択

バイアス

  方法が 1 の場合はα,また,方法が 2 の場合は初期値

ステップ

  方法が 2 の場合においてβ

都市数

  都市の数を入力します.Species 記述データで指定した最大遺伝子長と一致する必要があります.

最大世代交代数

  最大世代交代数を入力します.

近傍探索(0:行わない,1:行う)

  1 を入力すると,各世代の各個体に対して,逐次改善法により近似解を求めます.なお,この場合は,個体の重複を許すように設定しておいた方が安全だと思います(許さないようにすると,指定した集団サイズだけの個体が存在しなくなる可能性があります).また,0 を入力すると近似解を求める操作を行いません.

近傍(2or3)と選択方法(0:最良,1:最初)

  逐次改善法においては,λ近傍(λの値が近傍に対する入力値)に含まれる(λ本の)枝を入れ替えるという作業を距離の改善がなされなくなるまで続けることによって,解を求めます.各ステップにおいて,どのλ本の枝を入れ替えるかを探索していきますが,選択方法に 0 を入力すると,λ本の枝を入れ替えるすべての組み合わせの内,最も改善度が高いものを選択します.また,1 を入力すると,最初に見つかったλ本の枝をすぐ入れ替えます.通常,1 で良いと思います.

-58 37
55 -19
 ・・・・・

  以下,各都市の x 座標と y 座標です.都市の数だけ必要になります.この入力された順番が,その都市の都市番号になります( 0 から始まる).

[関数の最大値]

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

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

の [0, 1] 区間における最大値を求めるためのプログラムを添付しておきます.この例の場合における Species 記述ファイルは,たとえば,以下のようになります.
対立遺伝子上限 1 対立遺伝子下限 0 最大遺伝子長 15 最小遺伝子長(負の時は,最大遺伝子長で固定) -1 遺伝子の重複 1 個体の重複(同じ染色体の個体) 0 集団サイズ 20 子供 20
  データの意味は TSP の場合とほぼ同様ですので省略します.x の値が染色体に対応し,15 ビットのビット列で表現している点に注意してください.クラス TSP の代わりに,関数の最適値を求めるためのクラス Function を利用していますが,その記述ファイルは,たとえば,以下のようになります.
出力レベル(負はファイル) 20 出力方法(0:すべて,1:最大) 0 出力ファイル名 result\kekka 表示間隔 1 交叉方法 1 交叉確率 1.0 点 2 位置 0 方法 1 バイアス 0 ステップ 1 突然変異方法 0 突然変異率 0.05 幅 1 平均 0.0 標準偏差 1.0 エリート 2 方法 1 バイアス 0 ステップ 1 最大世代交代数 200
  データの意味については,TSP の場合とほぼ同様ですが,交叉方法および突然変異方法に対して選択できる方法が異なってきます.交叉方法に対しては,

=-1 : 交叉を使用しない
=0 : 親のコピー
=1 : 多点交叉
=2 : 一様交叉
=3 : 平均化交叉

の中から選択でき,また,突然変異に方法に対しては,

=-1 : 突然変異を使用しない
=0 : 対立遺伝子への置換
=1 : 移動
=2 : 逆位
=3 : スクランブル
=4 : 転座
=5 : 重複
=6 : 摂動

の中から選択できます.

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

  添付したプログラムは,伝達関数からボード線図を作成するのに必要なゲインと位相を計算するためのものです.計算された結果は,ゲインと位相が異なったファイルに
周波数1 ゲイン1(または,位相1) 周波数2 ゲイン2(または,位相2)      ・・・・・・・
のような形式で出力されますので,gnuplot 等を使用すれば(「 set logscale x 」とし,x 軸を対数目盛にする必要がある)容易に図示することが可能です.なお,Java のプログラムでは,グラフを表示することも可能です.

  プログラムは標準入力を使用して書かれていますので,ファイルから入力するときはリダイレクトを利用してください.伝達関数は,因数分解しても,しなくても,いずれの形でも入力可能です.データ例を 2 つ( data1 と data2 )添付しておきましたが,これらは以下の伝達関数に対する入力例です(同じ伝達関数です).

     1/(1 + 11.1s + 11.1s2 + s3)  data1(因数分解してない)
     1/((1+0.1s)(1+s)(1+10s))  data2(因数分解してある)

  具体的な入力データは以下のようになります.下線部が実際にデータを入れる箇所です.日本語で記述した部分(「ゲイン」,「位相」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください.

  1. data1
    ゲイン gain 位相 phase 周波数の下限と上限 0.01 100 分割数 100 分子の表現方法 0 次数 0 係数(次数が低い順) 1.0 分母の表現方法 0 次数 3 係数(次数が低い順) 1.0 11.1 11.1 1.0
  2. data2
    ゲイン gain 位相 phase 周波数の下限と上限 0.01 100 分割数 100 分子の表現方法 1 次数 0 係数(次数が低い順) 1.0 分母の表現方法 1 次数 3 係数(次数が低い順) 1.0 0.1 1.0 1.0 1.0 10.0
  各データの詳細な説明は以下の通りです.

ゲイン gain 位相 phase

  ゲイン及び位相を出力するファイル名を入力します.必ず異なる名前にしてください.

周波数の下限と上限 0.01 100 分割数 100

  計算の対象とする周波数(ω)の下限と上限,及び,その間の分割数( n とする)を入力します.与えられた下限及び上限の対数をとり,その間を n 等分した周波数における値を計算します.なお,位相の値は,その前に計算した周波数からの変化を見て設定していますので,位相が ±180 度を超えるような周波数における値だけを計算すると正しい結果が得られません.

分母の表現方法 0

  分母の表現方法を入力します.0 を入力すると因数分解してない,また,1 を入力すると因数分解してあるとみなします.なお,この項を含め,以下の説明は分子に対しても同様です.

次数 3

  多項式の次数を入力します.

係数(次数が低い順) 1.0 11.1 11.1 1.0

  多項式の係数を入力します.0 次の項の係数から順に入力してください.因数分解してある場合は,カッコ内の 1 次式の係数をペアーにして次数分だけ入力してください.なお,この際も,0 次,1 次,0 次,1 次,・・・のように低い方の係数をペアーの最初にしてください.カッコの順番は任意です.

(プログラム例 18.12 ) 巡回セールスマン問題(マルチエージェント) 

  添付したプログラムは,巡回セールスマン問題( TSP )をマルチエージェント的手法によって解くためのものです.手法の詳細については,この方法に関する私の研究紹介を参考にしてください.コンパイルした後,

  実行可能ファイル名 ケーススタディファイル名

と入力してやれば実行できます.ケーススタディファイルは,たとえば,同じ問題を乱数の初期値を変えて実行したいような場合に効果的であり,たとえば以下のような形式で作成します.
問題の数 2 問題 data\data10.tsp 乱数の数 1   初期 0 増加 10 方法 1 乱数 1 問題 data\kroA100.tsp 乱数の数 10   初期 10 増加 20 方法 1 乱数 1   初期 10 増加 20 方法 1 乱数 12   初期 10 増加 20 方法 1 乱数 123   初期 10 増加 20 方法 1 乱数 1234   初期 10 増加 20 方法 1 乱数 12345   初期 10 増加 20 方法 1 乱数 54321   初期 10 増加 20 方法 1 乱数 5432   初期 10 増加 20 方法 1 乱数 543   初期 10 増加 20 方法 1 乱数 54   初期 10 増加 20 方法 1 乱数 5
  日本語で記述した部分(「問題の数」,「問題」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください(以下の説明においても同様).各データの意味は以下に示す通りです.

問題の数

問題の数を入力します.この例では 2 となっています.

問題

各問題の始まりであり,上で与えた問題の数だけ以下のデータが繰り返されます.この項には,データファイル名を入力します(上の例では,data\data10.tsp と data\kroA100.tsp).

乱数の数

乱数の初期値を変え,何回試行を行うかを入力します(上の例では,最初の問題に対して 1,2 番目の問題に対して 10 ).以下に述べる「初期」の項に 0,「増加」の項に(都市の数−初期状態を構成する都市の数)より大きい数字を入力した場合は,実質的に,乱数は使用されません.従って,乱数を変えて入力しても同じ結果が得られます.

初期

  初期状態の生成方法を入力します.
=0 : すべての都市を内側に含み,かつ,入力されたいずれかの都市を頂点とする凸多角形から開始します.
=n > 0 : n 個の都市をランダムに選び,その都市だけからなる巡回路から出発します.

増加

たとえば,ここで入力された数値を k とします.初期状態から出発し,初期状態に含まれない残りの都市から k 個をランダムに選択します.選択された都市だけを対象として巡回路を作成します.それが終了した時点で,再び残りの都市から k 個を選び同じことを繰り返します.

乱数

乱数の初期値を入力します.乱数の数の項で入力した数だけ繰り返されます.

  データファイルは,問題自身とその解法の詳細を記述するためのファイルであり,たとえば以下のように記述します.
都市の数 10 整数 1 出力レベル(-1,-2:ファイルへ最終結果,0,1:最終結果,2:詳細) 0 出力ファイル名 result/data10 -58 37 55 -19 6 -79 27 -30 44 -94 33 -58 -94 87 -9 3 33 69 43 -57
  各データの意味は以下に示す通りです.

都市の数

  都市の数を入力します

整数

  各都市の位置情報( x 座標と y 座標)の入力方法と都市間距離の計算方法を指定します.
=2 : 位置情報は整数,距離は整数計算,距離は必要とする際に計算
=1 : 位置情報は整数,距離は整数計算,距離テーブルを作成しておく
=-1 : 位置情報は実数,距離は整数計算,距離テーブルを作成しておく
=-2 : 位置情報は実数,距離は整数計算,距離は必要とする際に計算
=-3 : 位置情報は実数,距離を実数計算,距離テーブルを作成しておく
=-4 : 位置情報は実数,距離を実数計算,距離は必要とする際に計算

出力レベル(負はファイル)

  結果の出力方法を入力します.
=-2 : 得られた巡回路の長さと巡回経路をファイルに出力します.
=-1 : 得られた巡回路の長さだけをファイルに出力します.
=0 : 得られた巡回路の長さだけを画面に出力します.
=1 : 得られた巡回路の長さと巡回経路を画面に出力します.巡回経路を出力する場合,ある数の都市を出力する毎に入力待ちの状態になります.return キーを入力すれば継続されます.
=2 : 詳細出力(デバッグ用)

出力ファイル名

  結果を保存するファイル名です.なお,画面に出力する場合も,この項目を必ず入力してください(利用はされません).

-58 37
55 -19
  ・・・・・

  以下,各都市の x 座標と y 座標です.都市の数だけ必要になります.この入力された順番が,その都市の都市番号になります( 0 から始まる).

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

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

  実行可能ファイル名 年 月 [日]

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

ホームページ 目次 演習解答例目次 付録目次 索引