氏名:町野貴英

2003年度 卒業論文
遺伝的アルゴリズム総合開発研究ツール for Swing GUI の設計
平成 15 年 2 月 25 日(火)
学籍番号:5199186
氏名:町野貴英
−1−
目次
Ⅰ はじめに
Ⅱ Java の優位性
2.1 Java の特徴
2.2 GUI コンポーネント
Ⅲ 遺伝的アルゴリズム
3.1 遺伝的アルゴリズムとは
3.2 J-GAUSS とは
Ⅳ 総合開発研究ツール設計
4.1
J-GAUSS の問題点
4.2
総合開発研究ツールのクラス設計
Ⅴ 結果
5.1 プログラム結果
5.2 GUI化による設定時間の短縮化
5.3 結果の考察
Ⅵ むすび
参考文献
Ⅰ はじめに
オブジェクト指向言語 Java は優れた言語仕様をもつ本格的なプログラミング言語である。最新の
ソフトウェア工学の成果を反映して設計した強力で便利な標準クラス・ライブラリを備えている。こ
れは JAVA によって本格的で実践的なアプリケーションが開発できることを意味している。5)
また、JAVA はマルチプラットフォーム環境であり、JAVA で作ったプログラムは様々な Central
Processing Unit(以下 CPU)や Operating System(以下 OS)上で同じアプリケーションとして実行
できる。
本論文は、JAVA で書かれた遺伝的アルゴリズム(Genetic Algorithm 以下 GA)のソフトウェア
J-GAUSS 用に作成した総合開発研究ツールに関するものである。
J-GAUSS は当初、教育用に作成された GA のソフトウェアであるが現在では研究用の主プラット
フォームにも活きている。その為それ自体日々新しい機能が加えられて進化している。従って作
−2−
成した総合開発研究ツールが J-GAUSS 本体と複雑に絡み合うような構造とすると J-GAUSS 本体
の進化に合わせてその都度、総合開発研究ツール側も変更しなければならないという問題が発
生する。今回の開発では総合開発研究ツールと J-GAUSS とが相互に独立な構造となること,実際
の利用に耐えうる実用的な GUI を作成すること,各種実験の GUI が容易に移植できるようにするこ
との上記3点を基本方針とした。2)
本開発では JAVA の継承の考えを使用し、J-GAUSS に定義されていない処理が必要になった
場合は、そのクラスを継承するサブクラスを作成し、必要最小限のみを修正する方法を用いた。総
合開発研究ツールの GUI の設計に関しても継承の概念を積極的に利用しプログラムの再利用を
行った。その結果、総合開発研究ツールは、J-GAUSS 本体とは完全に独立なものとすることがで
きた。また、「ノーマルモード」と「エキスパートモード」と呼ぶの二つのモードを作成した。ノーマル
モードでは GUI から各種のパラメータを設定し実験を行う。これに対してエキスパートモードでは
実験環境を決定するクラスの自動生成することができる。また、Java の GUI コンポーネントである
InternalFrame、JDesktopPane を使用することにより各種実験の GUI を容易に追加できるようにし
た。
以下、本論文ではまず 2 章において Java の特徴について述べ,3 章で遺伝的アルゴリズム
(J-GAUSS)について述べる。4 章では、制作した総合開発研究ツールについて述べ、最後 5 章で
開発した総合開発研究ツールの成果を述べる。
Ⅱ Java の優位性
Java は、1991 年に Sun Microsystems 社により開発された言語である。今回の作成に当たって
Java を使用したので以下にその主な特徴を述べる。
2.1 Java の特徴
Java の特徴として(1)オブジェクト指向、(2)継承、(3)簡潔な言語使用、(4)システム非依存、(5)ス
レッドによる並列処理、(6)アプリケーションの安全性、(7)充実したクラス・ライブラリをあげることが
できる。以下これらについて簡潔に述べる。
(1)オブジェクト指向
オブジェクト指向においては、プログラムとデータ型の集合定義をクラスという。インスタンスとは
クラスを実体化したものである。例えばタイヤキの型があったとする。しかし、タイヤキの型は鉄で
できてきるので食べることはできない。そこにタネとアンコを注入し焼けばタイヤキをいくつでもつく
ることができる。これをオブジェクト指向に置き換えるとクラスの定義だけでは線を描画を行ったり
計算をすることはできない、そこでこのクラスにパソコンなどのリソースを割り当てれば実体(インス
−3−
タンス)を作成することができる。そうすれば何個も実体を作成する事ができ線の描画や計算が可
能になる。4)
(2)継承
オブジェクト指向の特徴は『継承』である。継承もとになる親クラスをスーパークラスといい、継承
した子をサブクラスという。スーパークラスの内容はすべてサブクラスが利用でき、サブクラスでは
スーパークラスとの違いだけを書くだけでよい。これによりプログラムの再利用が可能となり、開発
時間を短縮することができる。3)
(3)システム非依存
Java のプログラムも、全てのプログラム言語と同じように最初はソースコードを作成する。プラット
フォーム非依存を実現する為の工夫はコンパイル時にあり、コンパーラは実行可能コードを作成
するのではなくバイトコード(class ファイル)と呼ばれる中間コードを作成する。バイトコードとは、特
定のハードウェアに依存しない命令のことであり、バイトコードは Java Virtual Machine(JVM)のイン
タープリターにより解釈され実行される。また、最近では Just In Compiler(以下 JIT)機能の開発に
より十分な実行速度が得られるようになった。3)
(4)アプリケーションの安全性
Java で特に重要なのがセキュリティである。Java Development Kit(以下 JDK)1.2 からは安全性
が高くしかも柔軟なセキュリティ機能が提供されています。JAVA の場合、JDK の中にそのパッケ
ージが含まれている。インターネットからダウンロードした未知のアプリケーションであっても JVM の
インタープリターを通してしか行われないので最低限のレベルの安全性は確保されている。(図1
参照)3)
図 1 アプリケーションの安全性
2.2 GUI コンポーネント
−4−
7)
Java はアプリケーション、アプレット、サブレット、JSP などのネットワークアプリケーションの様々な
分野で威力を発揮している。しかし、大きな一つの問題があった。それは標準の GUI コンポーネン
トである Abstract Windowing Toolkit(以下 AWT)にあった。AWT は OS に強く依存し JAVA の特
徴である互換性に問題があり、見栄えも美しいものではなかった。また、機能も少なく、本格的な
GUI アプリケーションを開発するのは困難であった。JAVA を開発した SunMicrosystems もこの事
実を認識していたので Java Foundation Class(以下 JFC)という追加セットを用意した。そして、そ
の中の GUI コンポーネントセット「Swing」が JAVA2 で実装された。
Swing は AWT にあった様々な問題を解決し、機能性の高い、統一された外観を持つ GUI を提
供してくれる。Windows と同等の操作性と外観を持つ GUI はネットワークで接続された数多ハード
ウェア(Intel 社の x86 系、Apple 社の PowerPC、Sun Microsystems 社の SPARC、など)、OS
(Windows、Mac OS、Linux、など)の壁を越えて統一した GUI を提供している。(図2参照)
Java 標準
Linux 標準
Windows 標準
図2 各種見栄え
6)
Ⅲ 遺伝的アルゴリズム
本章では、今回対象としているアプリケーションである GA について簡単に述べる。
3.1 遺伝的アルゴリズムとは
GA は、コンピュータの中で架空の生物を作り進化の過程をシュミレーションすることにより、
色々な問題を解決するための工学的な探索方法である。
生物が進化するためには、その環境下で生物が環境に適合する必要がある。環境に適合しな
ければ子孫を残すことができず死滅する。GA では、解の候補を仮想生物にみたてこれらの仮想
生物に交叉、突然変異、逆位といった実際の生物で行われている遺伝的操作を加え、世代を高
−5−
速に進めることにより新しい解を生成し進化させる。このような方法により、従来では解くことが困難
な問題を解くことができる。GA の応用例を表1に示す。1)2)
表1 GAの応用例
スケジューリング問題
設計問題・計画
制御問題
組合わせ最適化問題
プリント基板の最適は位置
エレベータ群管理
ジョブショップスケジューリング
LSIのレイアウト設計
ガス・パイプライン制御
各種工程スケジューリング
ニューラルネットワークの合成
プロセス制御
製品投入スケジューリング
通信網の動的予測ルーティン 配電系統の損失最小化制
バス仕業ダイヤ作成
ジェットエンジンの設計
巡回セールスマン問題
エアコン制御機の設計
ハードウェア進化
購入計画問題
通信ネットワークの設計
その他
DNA配列のシグナルパターンの抽
出
DNAの配座解析
分子系統樹作成
画像解析・復元
概念形成問題
戦略獲得問題
故障診断
蛋白質の構造推定
3.2 J-GAUSS とは
J-GAUSS(Java Genetic Algorithm Using Strategic operationS)は,筒井研究室で開発された C
言語で書かれた GA 研究用プログラム(Genetic Algorithm Using Strategic operationS)の基本的
な機能をオブジェクト指向言語 JAVA により教育目的に再開発したものである。その後、Java の実
行速度が大きく改善され研究用のプラットフォームになった。J-GAUSS の開発にあたり JAVA の特
徴であるオブジェクト指向の考え方を忠実に取り入れ,出来るだけわかりやすいコードとなるように
設計されている。また遺伝的アルゴリズムのモデルには各種のものが提案されているので、これら
各種のモデルを容易に追加できるように作成されている。1)2)
今回、総合開発研究ツールを開発するにあたり J-GAUSS Ver3.0 を使用する。Ver3.0 は新しい
GA のモデルである「確率モデル GA」、「蟻モデル GA」の機能が新たに組み込まれ、さらにオブジ
ェクト指向の考え方がさらに徹底されている。また以前のバージョンに比べてソースコードが非常
に綺麗なものに仕上がっている。
以下で、J-GAUSS についての実行の流れと継承関係についての構成を簡単に説明する。
図3は、J-GAUSS のクラスの構造とその関係を示したものである。主なクラスには、以下のものがあ
る。
プログラムは最初に Main クラスから実行される、パラメータクラスを生成し、その後与えられたパ
ラメータ値に基づき Execute クラスを生成する。Execute クラスは GA の基幹部分である世代の管
理を行う。Execute クラスはさらにパラメータ設定に基づき GA モデルを決定する Population クラス
を生成する。各種 Population クラスは必要に応じて交叉クラス、突然変異クラス、ヒューリスティック
クラスを生成し実行する。一連の実験が終了すれば Execute クラスは実験結果をファイルとして保
存し、画面表示を行う。
−6−
Main
Main
Execute
Execute
Parameters
Parameters
実験結果を保存
実験結果を保存
Population.class
Population.class
PopulationシンプルGAモデル
PopulationシンプルGAモデル
各種ヒューリスティッククラス
各種ヒューリスティッククラス
Population確率モデル
Population確率モデル
各種突然変異クラス
各種突然変異クラス
各種交叉クラス
各種交叉クラス
Population蟻モデル
Population蟻モデル
PopulationMggモデル
PopulationMggモデル
この部分が今回作成した遺伝的アルゴリズム総合開発研究ツールのGUI
継承関係
図3
生成、利用関係
J‑GAUSS のクラスの構造とその関係
Ⅳ. 総合開発研究ツール設計
4.1 J-GAUSS の問題点
J-GAUSS 本体は CUI(MS-DOS のような文字主体のインターフェース)ベースになっている。以
下に実験開始までの主な工程を述べる。
1.テキストエディターを使用しパラメータクラスを設定する。
2.コマンドプロンプト上から設定したパラメータクラスのコンパイルを行う。
3.コマンドプロンプト上から J-GAUSS を実行させる。
4.実験結果を表示、ファイルへ保存する。
そこでこの一連の作業をすべて行うことができるインターフェースを開発した。これが今回は開
発した遺伝的アルゴリズム総合開発研究ツールである。以下に総合開発研究ツールのクラス設計
を述べる。
−7−
図4 コマンドプロンプトでの J-GAUSS 実験
4.2 総合開発研究ツールのクラス設計
1章で述べたように、J-GAUSS は、研究用にも利用されているので日々改良が加えられて進化
している。従って作成した総合開発研究ツールが J-GAUSS 本体と複雑に絡み合うような構造とす
ると J-GAUSS の進化に合わせてその都度、総合開発研究ツール側も変更しなければならない。
そこで互いをデータだけで結合するようにすることによって総合開発研究ツールと J-GAUSS 本体
を完全に分離するように作成することにした。(図3の菱形柄部分を参照)総合開発研究ツールと
プログラムの本体である Execute を完全に独立させた設計にしたので互いを意識せずにプログラ
ムのバージョンアップが可能となった。これを実現させているのが Parameter クラスである。
Parameter クラスの役割とは GA 実行に不可欠なパラメータである実験回数、最大評価回数、集団
サイズ、交叉率、突然変異率、逆位率などの設定と基幹部分である GA モデルの選択、評価関数
の決定、交叉関数の選択、突然変異関数の決定、逆位関数の選択を行う。
今回は総合開発研究ツールの GUI を設計開発するにあたり既存の Execute では対応出来ない
問題が発生した。それは総合開発研究ツールの GUI 側で現在どこまで実験が進行している(現実
験回数、現評価回数など)のか、実験の終了などといったことを伝える命令が無かったことである。
本来の J-GAUSS はコンソール(MS-DOS のような CUI)で実行しコンソール画面で実験経過を確
認していた。今回の作成では「プログラム本体には手を加えずできるだけプログラムの再利用をす
る」という目標があったので Java の継承の概念を用いた。Execute で足りない部分をサブクラス
Execute̲GUI として作成した。このサブクラスには一回の実験が終了すると総合開発研究ツール
の GUI 側の
display();
をコールする命令と全ての実験が終了すると GUI 側の
−8−
End()
を
コールする命令を追加した。それ以外の機能は自動的に親クラスである Execute クラスが参照され
利用される。そこで新たな問題が発生したそれはサブクラス Execute̲GUI から総合開発研究ツー
ル側の GUI が参照できないことであった。そこでこの問題解決の為に総合開発研究ツールの GUI
側に
GUI̲temp.f1 = this;
と追加した。これにより Execute̲GUI から GUI を参照できるようにな
った。上記二点の問題が解決できた結果 GUI 側で実験の経過や結果を表示させることがきた。
以下にクラスの設計とフィードバックの仕組みに関する図5、図6を示す。
//Executeクラス
//Executeクラス
public
publicclass
classExecute{
Execute{
void
voidGo
Go();
();
//↑このクラスは継承先にあるのでオーバーライドされる。
//↑このクラスは継承先にあるのでオーバーライドされる。
}
継
}
void
voidRecord();
Record();
void
voidreport();
report();
void record();
void record();
void trace();
void trace();
void write();
void write();
承
void go(){
void go(){
for(最大実験回数まで繰り返し){
for(最大実験回数まで繰り返し){
while(最大評価回数まで繰り返し){
while(最大評価回数まで繰り返し){
1世代実行を指示;
1世代実行を指示;
イベントをPopulationクラスに送る;
イベントをPopulationクラスに送る;
世代カウンターを+;
} 世代カウンターを+;
}
//実験経過をGUIに通知する為に追加
//実験経過をGUIに通知する為に追加
GUI_temp.f1.display();
} GUI_temp.f1.display();
}
//実験の終了をGUIに通知
//実験の終了をGUIに通知
GUI_temp.f1.End();
} GUI_temp.f1.End();
}
※これ以外はスーパークラスが参照さ
※これ以外はスーパークラスが参照さ
れる。
れる。
//J-GAUSS本体から
//J-GAUSS本体から
//データを受け取る為に定義
//データを受け取る為に定義
GU I_temp.f1 = this;
GU I_temp.f1 = this;
Display(){
Display(){
現実行回数の表示;
現実行回数の表示;
などなど;
} などなど;
}
End(){
End(){
検索結果の表示;
検索結果の表示;
MFEの表示;
MFEの表示;
CPUタイムの表示;
CPUタイムの表示;
}
}
J-GAUSSを拡張した
Execute̲GUIクラス
総合研究開発ツールGUI側の
ExperimentInternalFrameクラス
図5
フィードバック設計
−9−
ExperimentTempletInternal
ExperimentTempletInternal
Frame.class
Frame.class
Parameters.class
Parameters.class
Execute.class
Execute.class
ExperimentInternalFrame.c
ExperimentInternalFrame.c
lass
lass
Execute̲GUI.class
Execute̲GUI.class
GUIへデータのフィードバッグ
実験用クラス
ExpertModeInternalFrame.c
ExpertModeInternalFrame.c
lass
lass
TspInternalFrame.class
TspInternalFrame.class
継承関係
生成関係
図6
データフロー関係
クラス設計
Ⅴ 結果
5.1 プログラミング結果
作成した総合開発研究ツールの「ノーマルモード」では GUI から各種パラメータを設定すること
が可能である。そして GUI 上から設定したパラメータに従って実験を開始することができる。また、
実験経過や結果を視覚的に表示する為に J-GAUSS 本体からのデータのフィードバック機能を備
えている。図7参照。
−10−
図7 左、実験結果のフィードバック 右、実験経過のフィードバック
先にも述べたように「エキスパートモード」は実験環境を決定するクラスを自動生成する。GUI か
ら各種のパラメータを設定し使用者が使用したいパラメータをチェックするとそれをもとにクラスを
自動作成する。以下に今回作成した大まかなプログラムの簡単な説明を行う。
1)EditInternalFrame.java はエディターであり約 250 行ある。
「エキスパートモード」では作成できない細かな設定をする為に作成した。もちろんファイルの「開
く」、「保存」、「切り取り」、「コピー」、「貼り付け」の機能を搭載している。
2)ExperimentInternalFrame.java は「ノーマルモード」を実現させているクラスである。ソースコード
は約 1800 行ある。またこのクラスは多くの継承元になっている。図 6 参照
3)ExpertModeInternalFrame.java は「エキスパートモード」を実現させているクラスでありソースコ
ードは約 1500 行ある。また、ExperimentInternalFrame の継承先になっている。必要なもの以外は
親クラスを利用している。
4)TspInternalFrame.java は作者が去年開発した Java アプレットをアプリケーション用に移植したも
のである。ソースコードは約 400 行ある。継承の概念を使用したので去年から比べるとソースは約
半分になり見やすいものになっている。
これ以外にも作成した細かなものを入れると約 5000 行のプログラム群になっている。
5.2 GUI化による設定時間の短縮化
GUI上からパラメータの設定を行うことにより従来の設定方法(テキストエディタを使用し数値、
文字を書き換える手法)より高速化が可能である。個人的な実験の数値であるが同項目を同数値
に変更する場合、テキストエディターで書き換えるのに約4秒かかる、これに比べGUIでは約2秒
しかからない。そして、従来方法ではコンパイルを行わなければ実験を行えない。以下のグラフは
パラメータの設定時間、コンパイル時間、実験開始コマンドを加えた従来の方法で実験開始まで
−11−
かかった時間とGUIから実験開始までの時間を試算したものである。コンパイル時間などは個人
の環境で大きく変わるので参考程度に考えてもらいたい。
GUI化のメリット
140
89
85
120
81
77
73
100
69
65
設定時間など
61
57
80
53
コマンドプロンプト
GUI
49
45
60
41
37
33
40
29
25
21
17
20
13
1
2
3
10
8
6
4
2
0
4
5
6
7
18
16
14
12
8
9
20
24
22
10
11
設定箇所
12
13
14
15
16
17
18
40
38
36
34
32
30
28
26
19
20
5.3 結果の考察
今回の作成にあたり去年から Java の基本であるオブジェクト指向、継承、Swing コンポーネント
などについて学んできた。また、今期の夏期休暇から J-GAUSS の内部のアルゴリズムを理解する
為に確率モデル GA の高速化を行った、これは GUI を作る為には最低限の構造を理解しなけれ
ばならないためである。そして、J-GAUSS の内部構造を理解した後総合開発研究ツールの開発
に入った。現バージョン 3.0 において GUI の作成に入りプログラムの独立性を確認した。独立する
ように設計されているので GUI の作成と J-GAUSS の更なる更新作業が平行して行えた。また、
GUI 側は以後のメンテナンス性を考慮し GA モデル、交叉モデルの追加などではメニューアイテム
を追加するといった簡単な作業だけで GUI へ組み込めるようになっている。また図6を見ても分か
るように ExperimentInternalFrame.class は汎用的に使用できる GUI として設計しており多くのクラ
スの継承元になっている。これはエキスパートモードや TSP モードでも使うパラメータが同じなので
使える部分は Java の継承を利用しプログラムの再利用をしていることを意味する。メンテナンス面
から見れば継承を利用しているので親クラスを修正すればその修正はサブクラス全てに反映でき
る。また、今回作成したプログラム全体で約2000行のソースコードの圧縮ができている。
最後に今回の作成に当たって目標とした「各種問題の移植性」について述べる。これは個々に
開発されたアプレットやアプリケーション(例えばナップサック問題)GUI でも同じバージョンの
J-GAUSS を使用していれば Java の GUI コンポーネントの InternalFrame(図6参照)を使用するこ
とにより容易に総合開発研究ツールに組み込めるようになっている。
−12−
参考に完成した総合開発研究ツールのハードコピーを図9に示す。
図8 InternalFrame
図9 完成した総合開発研究ツールの GUI
Ⅵ.むすび
本開発では CUI ベースの J-GAUSS の実験を改善する為にオブジェクト指向言語 Java の最大
の特徴である継承の概念及びクラスの概念に基づき Swing で GUI を作成し総合開発研究ツール
を開発した。この結果、自分が得たことは以下の通りである。
1.
Java の継承の概念及びクラスの概念を理解し、各種のクラスを派生させることによってプログ
ラムの再利用方法を理解した。
2.
継承を用いすぎると逆に再利用性と生産性が損なわれるので適度に利用すれば効果的であ
ると学んだ。
3.
Java のアプリケーションを使用することによりアプレットではできないローカルファイルの扱い
や入出力の方法を実践的に学んだ。
今後の課題として以下の2つが上げられる。
−13−
1.
ソースコードの更なる最適化を行い後輩も拡張できるように変更する。
2.
同時に複数のウィンドウを開きマルチタスクの処理を実行できるようにする。
3.
作者は去年 TSP の独立型 GUI を開発したが今後このアプリケーション用に各種問題用の
GUI を作成していきたい。なお、TSP の独立型 GUI に関しては筒井教授のホームページに公
開され国内外の大学や企業を始め、多くのサイトから利用されている。
http://www.hannan-u.ac.jp/˜tsutsui/tsp-j/tsp.html
参考文献
1)
筒井茂義、「遺伝的アルゴリズム」、サブゼミ講義用テキスト,pp.1-2(2001)
2)
筒井茂義、「J-GAUSS 概説」、サブゼミ講義用テキスト,pp1-2(1999)
3)
植田竜男、「Javaのからくり −オブジェクト指向入門−」、pp11-12 IDG ジャパン(1999)
4)
前橋和弥、「Java 謎+落とし穴」技術評論社(2001)
5)
大村忠史、「JavaGUI プログラミングⅠ」CUTT(2002)
6)
Java Tutorial、「http://java.sun.com/docs/books/tutorial/」サンマイクロシステム
−14−