• 検索結果がありません。

並列差分進化法を用いた画像処理

N/A
N/A
Protected

Academic year: 2021

シェア "並列差分進化法を用いた画像処理"

Copied!
38
0
0

読み込み中.... (全文を見る)

全文

(1)

卒業研究報告書

題目

並列差分進化法を用いた画像処理

指導教員

石水 隆 講師

報告者

11–1–037–0057

渋谷 俊樹

近畿大学理工学部情報学科

平成

24

1

31

日提出

(2)

概要

近年

,

市販のデスクトップ

PC

やノート

PC

にもマルチコア・プロセッサが用いられている

.

しかし

,

複数の コアによって並列処理を実行するためには

,

マルチコア

CPU

に対応した並列プログラムを作成する必要があ

.[3].

並列プログラムは複数のスレッドと呼ばれる処理単位から構成され

,

異なるコアに割り当てられたス

レッドは同時に実行される

.

既存の逐次処理のプログラムを機械的に並列プログラムに変換するコンパイラも 開発されているが

,

より効率的な並列プログラムを作成するには

,

アルゴリズムの段階から処理の並列化を図る 必要がある

.

並列プログラムによる高速化が求められる分野には様々あるが

,

その中の一つに最適化問題がある

.

今日

,

様々な種類の最適化問題に対してその問題の性質に応じた解放が考案されている

.

しかしながら

,

制約条件が 多い場合には問題の定式化が困難となる

.

そこで

,

これらの問題を解決する手法として

,

生物進化をヒントに得た探索手法である進化計算を用いること が近年注目されている

.

遺伝的アルゴリズム

(GA : Genetic Algorithm)

に代表される進化計算の大きな特徴

,

解空間が非常に大きく

,

従来の手法では高速計算機を用いても数十年かかるような問題や

,

問題の構造が分 からず数学的に定式化できないため解けないような問題に対しても

,

近似解を比較的高速に得られるという点 がある

.

差分進化

(DE : Differential Evolution)

とは

,

決定変数が実数値を取る単目的の関数最適化問題を対象とし

たとした進化計算の一種である

.[4] DE

は微分不可能な多峰性関数の最適化問題にも有効に適用することがで

,

多くのベンチマーク問題や現実的な最適化問題において

,

優秀な最適化アルゴリズムの

1

つであることが 示されている

.

また

,DE

はアルゴリズムが単純であるため実装が容易である

.

すなわち

,DE

の最大の利点は

,

強力かつシンプルであるため

,

使い勝手が良いことである

.

このように進化計算

,

取り分け差分進化計算は有効性が極めて高いため

,

並列化により高速化することは重要で ある

.

しかし

,

従来の進化計算の並列化手法は

,

そのプログラムを実行するハードウェアに大きく依存する

.

こで本研究では

,

ハードウェアへの依存性が低い並列化手法を検討する

.

本研究では

,

上記の

DE

の並列化である

,

並列差分進化計算

(PDE : Parallel Differential Evolution)

を用い て画像処理を行う

.

本研究で対象とする画像処理は

,

ぼやけた画像が与えられた際に

,

その元となる鮮明な画像 を得るノイズ除去処理である

.

この処理を実装することによって

,

画像の類似性を視覚的に認識することによ

,

最適化問題における

DE

の有効性を考察する

.

(3)

目次

1

序論

1

1.1

本研究の背景

. . . . 1 1.2

本研究の目的

. . . . 1 1.3

本報告書の構成

. . . . 1

2

最適化問題

2

2.1

最適化問題概要

. . . . 2

3

進化計算

3

3.1

差分進化計算

(DE) . . . . 3 3.2

並列差分進化計算

(PDE) . . . . 4

4

画像処理

5

4.1

画像処理の手順

. . . . 6 4.2

解候補個体を得る戦略

. . . . 6

5

実験結果

6

6

考察

7

7

結論と今後の課題

7

謝辞

8

参考文献

9

付録

A

付録

10

.1 DifferentialEvolution

クラス

. . . . 10

.1 LocalDifferentialEvolution

クラス

. . . . 22

.1 MonochromePicture

クラス

. . . . 28

(4)

1

序論

1.1

本研究の背景

近年

,

市販のデスクトップ

PC

やノート

PC

にもマルチコア・プロセッサが用いられている

.

しかし

,

複数 のコアによって並列処理を実行するためには

,

マルチコア

CPU

に対応した並列プログラムを作成する必要が

ある

.[3].

並列プログラムは複数のスレッドと呼ばれる処理単位から構成され

,

異なるコアに割り当てられたス

レッドは同時に実行される

.

既存の逐次処理のプログラムを機械的に並列プログラムに変換するコンパイラも 開発されているが

,

より効率的な並列プログラムを作成するには

,

アルゴリズムの段階から処理の並列化を図る 必要がある

.

並列プログラムによる高速化が求められる分野には様々あるが

,

その中の一つに最適化問題がある

.

今日

,

様々な種類の最適化問題に対してその問題の性質に応じた解放が考案されている

.

最適化問題に対する手法には

,

オペレーションズ・リサーチや数理的計画法の他に

,

人工知能

,

エキスパー ト・システム

,

システム理論

,

ファジィ集合

,

ニュートラルネットワーク等

,

様々なアルゴリズムが存在してい

.

一般に

,

ある最適化問題を解くにはその問題の背景に十分注意を払って

,

制約条件や目的関数の評価基準を 定め

,

数式もしくはグラフ等のモデルによって最適化問題を単純化する

.

そして、単純化された問題に対して あアルゴリズムを適用し

,

主にコンピュータ上でシミュレーションを行うことによって最適化問題の解を得る ことができる

.

しかしながら,制約条件が多い場合には問題の定式化が困難となる.そこで,これらの問題を解決する手法 として,生物進化をヒントに得た探索手法である進化計算を用いることが近年注目されている.遺伝的アルゴ

リズム

(GA : Genetic Algorithm)

に代表される進化計算の大きな特徴は,解空間が非常に大きく,従来の手

法では高速計算機を用いても数十年かかるような問題や

,

問題の構造が分からず数学的に定式化できないため 解けないような問題に対しても,近似解を比較的高速に得られるという点がある.

差分進化

(DE : Differential Evolution)

とは

,

決定変数が実数値を取る単目的の関数最適化問題を対象とし

たとした進化計算の一種である

[4]

DE

は微分不可能な多峰性関数の最適化問題にも有効に適用することが でき,多くのベンチマーク問題や現実的な最適化問題において

,

優秀な最適化アルゴリズムの

1

つであること が示されている.また

,DE

はアルゴリズムが単純であるため実装が容易である.すなわち

,DE

の最大の利点

,

強力かつシンプルであるため

,

使い勝手が良いことである.

1.2

本研究の目的

前節で述べたように,ように進化計算,取り分け差分進化計算は有用性が極めて高いため,並列化により高 速化することは重要である.しかし,従来の従来の進化計算の並列化手法は

,

そのプログラムを実行するハー ドウェアに大きく依存する.そこで本研究では,ハードウェアへの依存性が低い並列化手法を検討する.

本稿では画像の類似性を視覚的に認識することで

,

最適化問題における

DE

の有効性を検証する

.

また

,

候補 個体を得る戦略をいくつか用意した上で

,

どの戦略が最も優良であるかを検証するのも本研究の目的である

.

1.3

本報告書の構成

以下に各章の簡単な構成を示す

.

(5)

まず第

2

章では,本研究が対象とする最適化問題について説明し,続く第

3

章では,進化計算について説明 する.第

4

章では本研究で対象とする画像処理について述べる.第

5

章で実験結果を示し,第

6

章で考察を 行う.最後に第

7

章で結論および今後の課題を示す.

2

最適化問題

最適化問題は

,

自然科学

,

工学

,

社会科学など様々な分野で発生する基本的な問題の

1

つである

.

近年では

,

適化問題の大規模化と複雑化に伴い厳密な最適解を求めるのが難しくなっている

.

必要十分な最適性を持つ近 似解を実時間内に求める必要があり

,GA

DE

などメタヒューリスティックな最適化手法への関心が高まっ ている

.[5]

本研究では

,

最適化手法である

DE

PDE

を用いる

.

そのため

,

本章では

,

最適化問題の概要につ いて記述する

.

2.1

最適化問題概要

最適化とは複数の選択肢から最善のものを選ぶことであり

,

最適化問題を数学的に表現すると

,

与えられた 制約条件を全て満たし

,

目的関数

f(x)

の値が最小または最大になるような決定変数

x

の値を見つける問題であ

.

この場合

x

は最適解と呼ばれ

,

最適解は

1

つしか存在しない場合もあるが

,

反対に無限個存在する場合もあ

.

一般的に最適化問題は式

(1)(2)

に記述する

.

目的関数

f(x)

→最小値

(

最大値

) (1)

制約条件

x F (2)

このとき

F

は実行可能集合あるいは実行可能領域と呼ばれており

,

制約条件を満たす実行可能解

(

数理計画 問題において

,

実行可能領域上の点

.

最適解とは限らない

)

の集合である

.

2.1.1

最適解と局所的最適解

(3)

の条件を満たす実行可能解

x

n

F

を最適解と呼ぶ

f (x

n

) f (x),

  

x F (3)

また実行可能

x

n

F

を含む適当な集合

U(x

n

)

に対しては

,

f (x

n

) f (x),

  

x F U (x

n

) (4)

が成り立つとき、

x

nを局所的最適解という

.

??

は最適解と局所的最適解を表している

. U(x

n

)

は一般的 には近傍と呼ばれ

,x

に少し変形を加えることによって得られる解集合のことである

.

なお

,U(x

n

) F

とは限 らない

.

最適化問題も目的関数や制約条件が複雑になり

,

実行可能集合が膨大になる場合には最適解をみつけ ることは一般的に困難である

.

そのような場合には

,

問題の大きさや問題を解くために与えられている時間等 を考慮して

,

適切な近傍を定義して局所的最適解を求める

.

(6)

3

進化計算

3.1

差分進化計算

(DE)

DE

K.price, R.Storn

らによって提案された

,

確率的な探索法であり

,

解集団を用いた多点探索をおこな

. DE

の重要な特徴としては

,

単純な数学的演算を用いることが挙げられる

.

このため

,

制御パラメタの数 が少なく

,

設定が容易であり問題への実装も比較的容易におこなえる

. DE

において新たな解候補個体を得る 戦略は

,

基底個体の選び方および交叉の種類の組み合わせで定義され

, [DE/best/1/bin]

[DE/rand/1/exp]

などが代表される

[2].

基底個体としては

,

最適な関数値を持つ個体を選ぶ最適基底

(best)

,

ランダムに選 ぶランダム基底

(rand)

2

通りが主に選択される

.

また

,

代表的な交叉としては

,

二項交叉

(bin)

と指数交叉

(exp)

2

通りが使用される

.

3.1.1 DE

の基本アルゴリズム

標準的な

DE

の処理手順を以下に示す

.

Step1 : N

P 個の個体を

,

各次元の定義域においてランダムに生成して世代

g=1

とする

.

また

,

最終世代

,

収束 の条件に設定する

.

Step2 :

各個体の関数値を計算する

.

Step3 :

各個体

x

i

(i = 1,2,...N

P

)

に対して以下の処理を行う.

Steo3.1 :

最適個体またはランダム個体として個体

x

j

(j 6 = i)

を選択する.

Step3.2 : x

jから差分変異親個体

v

iを生成する.

Step3.3 :

後述する交叉法により、対象親個体

x

iと差分変異親個体

v

iから子個体

u

iを生成する.

Step3.4 :

対象親個体

x

iと子個体

u

iの関数値を比較し,良い方を次世代の

x

iとして残す

. Step6 :

終了条件を満たしていなければ

,g=g+1

として

Step3

に戻る

.

3.1.2

交叉

本節では、交叉について述べる.交叉とは、

2

つの親個体から新たな子個体を生成する手続である.

DE

では、まず対象親個体

x

i

(1 i N

P

)

に対して個体

x

j

(j 6 = i)

を選択する.

x

jは、戦略

best

では最も 優れた個体,戦略

rand

ではランダムに選んだ個体である.次に個体

x

jから差分変異親個体

v

iを生成する.

v

iは以下の式で与えられる.ただし,

x

k

, x

lはランダムに選択した個体,

S

F は差分定数である.

v

i

:= x

j

+ S

F

(x

k

x, l)

本研究では簡単のために差分定数

S

F

= 0

としている.すなわち,

v

i

= x

j である.

交叉により差分変異個体

v

iと対象親個体

x

iから子個体

u

iを生成する.二項交叉および指数交叉による生 成は以下の手続き

(5)

および

(6)

で計算される.ただし,

v

j,d

, x

i,d

, u

i,d

(1 m D)

はそれぞれ

v

i

, x

i

, u

i

d

番目の要素

, d

r

1 d

r

D

のランダムな整数であり,

rand[0,1]

は範囲

[0,1]

の一様乱数である.

(7)

二項交叉

 

 

for(d := 1; j D; ++ d) { if (rand [0, 1] < C

R

d = d

r

)

u

i,d

:= v

i,d

; else u

i,d

:= x

i,d

; }

(5)

指数交叉

 

 

 

 

 

 

d := d

r

; do {

u

i,d

:= v

i

; d := (d + 1)%D;

} while (rand [0, 1] < C

R

d 6 = d

r

) while (d 6 = d

r

) {

u

i,d

:= x

i,d

; d := (d + 1)%D;

}

(6)

3.2

並列差分進化計算

(PDE)

並列差分進化計算

(PDE)

DE

のプロセッサネットワーク上での並列化である

. PDE

では,各プロセッサ

DE

を並列に実行し,数世代に

1

回の割合で最も優れた個体を隣のプロセッサに送信する.また

,

移民頻度 と最適解への収束速度および最適解発見率は相関関係があり

,

移民頻度を高くすると収束速度は速くなるが

,

最適解発見率は低下する

.[1]

3.2.1

ネットワーク

PDE

で用いたネットワーク構造について記述する

. (1)

リング型

複数のコンピュータあるいは接続機器を

1

本の環状のケーブルに接続する

LAN

方式のことである

. (2)

トーラス型

階層構造をもったネットワークである

.

入力層

,

中間層

,

出力層の

3

つに分かれており

,

入力層から入っ た情報は中間層

,

出力層を通って出力される

.

(3)

ハイパーキューブ型

ハイパーキューブは

,n-

キューブ、あるいは超立方体とも呼ばれ

,

汎用の

(

)

並列計算の結合方法とし て注目されており

,

実際にいくつかの並列システムに採用されている

.

ハイパーキューブはトーラス等 のトポロジに比べて

,

プロセッサ数に対する直径を小さくできる

.

1,2,3

にそれぞれリング型,トーラス型,ハイパーキューブ型のネットワークの概念図を示す.

(8)

1

リング型

2

トーラス型

3

ハイパーキューブ型

3.2.2 PDE

の戦略

本研究では

,

基底個体の選び方

(mix

は混在

,rand

はランダム

,best

は最適値

)

および交叉の種類

(mix

は混

,bin

は二項交叉

,exp

は指数交叉

)

の組み合わせた

, 5

つの戦略で実験をおこなう

.

本章では

,

その

5

つの戦略 を記述する

.

1

つ目の戦略

: [best/exp]

2

つ目の戦略

: [rand/exp]

3

つ目の戦略

: [best/bin]

4

つ目の戦略

: [rand/bin]

5

つ目の戦略

: [mix/mix]

3.2.3 PDE

の基本アルゴリズム

PDE

,

局所メモリを持つ

P

台のプロセッサ

P

p

(0 p < P )

,

リング状に接続されたプロセッサネッ トワークを仮定する

. PDE

では

,

プロセッサ

P

p

(0 p < P )

がそれぞれ集団

x

pi

(0 i < N )

を保持する

. PDE

は以下の

2

つの操作を繰り返す

.

ここで

G

Lは移民頻度を表すパラメタである

.

(1)

局所

DE

操作 各プロセッサ

(0 p < P )

は保持する集団

x

pi

(0 i < N)

に対して

DE

G

L世代計算 する

.

(2)

移民操作 各プロセッサ

(0 p < P )

は保持する集団の中で最良の個体

x

pbest

)

を右隣のプロセッサ

P

(p+1)modP に送信し

,

左隣のプロセッサ

P

(p1)modP から受信した個体

x

(best

(p 1)modP )

を保持する 集団

x

(i

p) (0 i < N )

の中の任意の個体と入れ替える

.

4

画像処理

本研究では

PDE

を用いて画像処理を行う。本研究で対象とする画像処理は,ぼやけた画像が与えられたと きに、その元となる鮮明な画像を得るノイズ除去処理である.

解となる画像については,以下の制限を設ける.

1.

元画像は

16

×

16

2

値画像

(1

または

0)

とし,ぼやけた画像は,

16

×

16

の実数値画像

(0

1)

(9)

する.

2.

処理中,解画像,およびそのぼやけた画像は,直接参照することはできず,ある画像がぼやけた画像に どの程度近いかを表す評価値のみを参照できる.

2.

の制約のため,プログラムは直接画像を参照できず,候補画像を生成する際に,解画像およびそのぼやけ た画像から新たな画像を生成することができない.この制約は,例えばモンタージュ画像を作るときのような 状況を想定している.解となる画像は目撃者の頭の中しか無いため,モンタージュ画像作成者は元画像を見る ことができない.よってモンタージュ画像作成者は,適当な絵を目撃者に見せて,それが解画像とどの程度近 いかの評価してもらい,その評価値を元に新たな画像を作成することを繰り替えずことで解画像に近づけて ゆく.

4.1

画像処理の手順

本研究で作成した画像処理の手順を以下に述べる

. DE

の部分については以下の手順で行う

.

手順

1

候補画像を

20

個ほど生成する

.

候補画像は白黒でランダムに生成する

.

手順

2

候補画像同士を交叉させて新たな画像生成する

.

手順

3

手順

2

の画像が親画像よりも解画像に近ければ親画像と入れ替える

.

手順

4

手順

2

の画像が充分解画像に近ければ終了

,

それ以外は手順

2

に戻る

.

PDE

の部分については以下の手順で行う

.

手順

1

候補画像を生成する

.

手順

2

以下の処理を

G

S 世代行う

手順

2.1

各プロセッサ

P

p

(1 p P r)

で,

DE

G

L世代行う

手順

2.2

各プロセッサ

P

p

(1 p P r)

は最も良い候補画像を隣接プロセッサ

P

q

(q = p + 1 mod P r)

に送 信する.

手順

2.3

各プロセッサ

P

p

(1 p P r)

2.2

で受信した画像を,保持する画像の一つと置き換える.

手順

3.4

保持する画像のうち最も優れた画像が充分解画像に近ければ終了

,

それ以外は手順

2

に戻る

.

4.2

解候補個体を得る戦略

本研究では,

3.2.2

節で述べた

5

つの戦略で実験をおこなう.また,本研究では

,

リング型のネットワーク構 造を用いて実験をおこなう

.

5

実験結果

本研究では,

5

つの戦略に対して

,

移民頻度

8

で各

100

回の

PDE

を行った.表

1

にその実行結果を示す.

また,付録に本研究で用いた画像処理の

PDE

プログラムのソースを示す.

また

,5

つの戦略の中で

,

最も発見率の高かった戦略

[rand/exp]

で移民頻度を変えながら各

100

回の

PDE

行った

.

2

にその実行結果を示す

(10)

1

各戦略の解発見平均世代数と解発見率 戦略

best rand best rand mix

exp exp bin bin mix

世代数

27 70 506 411 309

発見率

11% 70% 14% 16% 24%

2

各移民頻度での解発見平均世代数と解発見率 頻度

1 2 4 8 16

世代数

37 49 59 68 104

発見率

21% 41% 54% 76% 69%

6

考察

実験結果より

,

今回用意した

5

つの戦略の中では

,[rand/exp]

が最も優良であることが分かった

.

これ

,PDE

を用いた画像処理は

,

多峰性で変数間に依存関係がある問題といえ

,

集団の多様性を確保するための処 理として

,

rand

」が有用であったと思われる

.

逆に

,best

では探索空間での位置によらず集団の中から淘汰する個体を選択するので

,

全体としての収束性

は向上するが

,

今回の処理においては

,

集団を局所解に陥らせたといえる

.

7

結論と今後の課題

本研究では

PDE

を用いて

,

画像処理をおこなった

.

本研究において

,

個体の選び方がランダム

,

交叉の長さ の決定方法が指数的な二点交叉である

[rand/exp]

が最適化問題に対し

,

高確率で解を求めることが分かった

.

しかし

,

予想していたよりも

,best

mix

を用いた戦略の解発見率が低かったので

,

局所解に陥ってしまった場

,

また

,

大域世代から探索をやり直す等の改善があるように思われた

.

(11)

謝辞

本論文を結ぶにあたり

,

多忙にも関わらず親切な御指導

,

御助言を賜りました石水隆講師に厚く御礼を申し上 げます

.

(12)

参考文献

[1]

石水隆

,

田川聖治

:

並列差分進化計算の比較研究

,

情報処理学会研究報告

, Vol.2011-MPS-82 No.23 pp.

1-2 (2011)

[2] Storn, R. and Price, K. : Differential evolution - a simple and efficient heuristic for global optimization over continuous space, Journal of Global Optimization, Vol. 11, no. 4, pp. 341–359 (1997).

[3] Breshears, C.: The Art of Concurrency - A Thread Monkey s Guide to Writing Parallel Applications, O REILLY (2009)

[4] Storn, R. and Price, K.: Differential evolution - a simple and efficient heuristic for global optimization over continuous space, Journal of Global Optimization, Vol. 11, No. 4, pp. 341

359 (1997)

[5]

伊藤 稔

,

田中雅博

Particle Swarm Optimization

の解探索性能に関する基礎的検討 第

32

回知能システム シンポジウム資料

(2005)

[6]

三宮信夫,喜多一,玉置久,岩本貴司,遺伝アルゴリズムと最適化,システム制御情報ライブラリー,浅 草書店,

(1998)

[7]

平野廣美,遺伝的アルゴリズムと遺伝的プログラミング,パーソナルメディア,

(2000) [8]

米沢保雄,遺伝的アルゴリズム 進化理論の情報学,森北出版,

(1993)

[9] T.Ishimizu and K.Tagawa, Experiment Study of A Structured Differential Evolution with Mixed Strategies, Proc. the World Congress on Nature and Biologically Inspired Computing (NaBIC) , pp.598-603, (2010)

[10] Price,K.V.,Storn,R.M.andLampinen,J.A.:DifferentialEvolution

APractical Approach to Global

Optimization, Springer (2005).

(13)

付録

A

付録

本研究で用いた画像処理の

PDE

のプログラムのソースを示す

.

プログラムは

3

つのクラスからなる

.

.1 DifferentialEvolution

クラス

p a c k a g e de ; i m p o r t j a v a . io .*;

/**

* 与えられたぼやけた値画像の元画像を進化計算により得る2

*/

p u b l i c c l a s s D i f f e r e n t i a l E v o l u t i o n {

s t a t i c f i n a l int D = 32; // 問題の次元( d i m e n s i o n of p r o b l e m ) s t a t i c f i n a l int NP = 32; // 母集団の大きさ( s i z e of p o p u l a t i o n ) s t a t i c f i n a l d o u b l e F = 0 . 5 ; // 差分定数( d i f f e r e n t i a l c o n s t a n t ) s t a t i c f i n a l d o u b l e CR = 0 . 9 ; // 交叉定数( c r o s s o v e r c o n s t a n t ) s t a t i c f i n a l d o u b l e MT = 0 . 1 ; // 突然変異定数( m u t a t i o n c o n s t a n t ) s t a t i c int L G E N = 8; // 局所世代数( n u m b e r of l o c a l g e n e r a t i o n s ) s t a t i c int S G E N = 1 0 2 4 / L G E N ; // スーパー世代数( n u m b e r of s u p e r g e n e r a t i o n ) s t a t i c M o n o c h r o m e P i c t u r e t a r g e t ; // 目標画像

s t a t i c M o n o c h r o m e P i c t u r e t a r g e t s []; // 目標画像の行列 s t a t i c f i n a l int p i c t u r e S i z e = 16; // 画像のサイズ

s t a t i c f i n a l int CT = -1; // 交叉のタイプ /**

* -1: mix 混在

* 1: bin 二項交叉

* oh : exp 指数交叉

*/

s t a t i c f i n a l int IST = -1; // インデックス選択のタイプ

/**

* -1: mix 混在

* 1: r a n d ランダム

* oh : b e s t 最適値

*/

s t a t i c f i n a l int NWT = 1; // ネットワークのタイプ

/**

* 1: r i n g n e t w o r k

* 2: t o r u s n e t w o r k

* 3: h y p e r c u b e n e t w o r k

* 4: h i e r a r c h i c a l n e t w o r k

* oh : no n e t w o r k

*/

s t a t i c f i n a l int NTH = 4; // 局所計算スレッド数

s t a t i c f i n a l int R O O P N = 8; // ループ回数 s t a t i c f i n a l int GV = 1;

s t a t i c f i n a l d o u b l e E P S I L O N = 0 . 1 ; // 適応値がこれより小さくなると解とみなす

s t a t i c L o c a l D i f f e r e n t i a l E v o l u t i o n de []; // 進化計算スレッドの実装クラスのインスタンス

s t a t i c T h r e a d th []; // 進化計算スレッドのスレッドのインスタンス

(14)

s t a t i c F i l e W r i t e r pass , r P a s s ; s t a t i c P r i n t W r i t e r fp , rfp ;

s t a t i c d o u b l e f i t n e s s R e c o r d [ ] [ ] ; // 適応値記録用

s t a t i c M o n o c h r o m e P i c t u r e o p t i m u m R e c o r d []; // 最適値記録用 s t a t i c int r o o p I n d e x = 0;

s t a t i c b o o l e a n i s F i n d O p t i m u m ; // 最適解発見?

s t a t i c int f i n d O p t i m u m []; // 最適解発見時 s t a t i c int sgen , l g e n ;

p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) {

de = new L o c a l D i f f e r e n t i a l E v o l u t i o n [ NTH ];

th = new T h r e a d [ NTH ];

// for ( L G E N =1; LGEN < 1 0 2 4 ; L G E N * = 2 ) { // S G E N = 2 0 4 8 / L G E N ;

l g e n = L G E N ; s g e n = S G E N ; if ( L G E N > GV ) {

l g e n = GV ;

s g e n = S G E N * ( L G E N / GV );

}

f i t n e s s R e c o r d = new d o u b l e [ R O O P N ][ s g e n ];

o p t i m u m R e c o r d = new M o n o c h r o m e P i c t u r e [ R O O P N ];

t a r g e t s = new M o n o c h r o m e P i c t u r e [ R O O P N ];

r o o p I n d e x = 0;

f i n d O p t i m u m = new int [ R O O P N ];

S t r i n g f n a m e = r e c o r d F i l e N a m e ();

try {

// p a s s = new F i l e W r i t e r (" f i t n e s s . txt ");

// fp = new P r i n t W r i t e r ( p a s s );

r P a s s = new F i l e W r i t e r ( f n a m e );

rfp = new P r i n t W r i t e r ( r P a s s );

} c a t c h ( I O E x c e p t i o n e ) { S y s t e m . err . p r i n t l n ( e );

}

for ( r o o p I n d e x = 0; r o o p I n d e x < R O O P N ; ++ r o o p I n d e x ) {

t a r g e t s [ r o o p I n d e x ] = t a r g e t = new M o n o c h r o m e P i c t u r e ( p i c t u r e S i z e );

for ( int i =0; i < NTH ; ++ i ) {

de [ i ] = new L o c a l D i f f e r e n t i a l E v o l u t i o n ( NP , F , CR , MT , lgen , CT , IST , target , i );

}

i s F i n d O p t i m u m = f a l s e ;

f i n d O p t i m u m [ r o o p I n d e x ] = S G E N * L G E N ; // S G E N * L G E N ;

s w i t c h ( NWT ) {

c a s e 1: // リング型ネットワーク

(15)

r i n g N e t w o r k ();

b r e a k ;

c a s e 2: // トーラス型ネットワーク

t o r u s N e t w o r k ();

b r e a k ;

c a s e 3: // ハイパーキューブ型ネットワーク

h y p e r c u b e N e t w o r k ();

b r e a k ;

c a s e 4: // 階層型ネットワーク

h i e r a r c h i c a l N e t w o r k ();

b r e a k ;

d e f a u l t : // ネットワーク無し n o N e t w o r k ();

b r e a k ; }

S y s t e m . out . p r i n t l n ( r o o p I n d e x + ": f i n d at " + f i n d O p t i m u m [ r o o p I n d e x ] + ": ");

p r i n t O p t i m u m ();

}

// fp . c l o s e ();

o u t p u t F i t n e s s R e c o r d ();

rfp . c l o s e ();

//}

}

/**

* 局所進化計算

* @ p a r a m sg スーパー世代数

*/

s t a t i c v o i d l o c a l D i f f e r e n t i a l E v o l u t i o n ( int sg ) { for ( int i =0; i < NTH ; ++ i ) {

th [ i ] = new T h r e a d ( de [ i ]);

}

for ( int i =0; i < NTH ; ++ i ) { th [ i ]. s t a r t ();

} try {

for ( int i =0; i < NTH ; ++ i ) { th [ i ]. j o i n ();

}

} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) { S y s t e m . err . p r i n t l n ( e );

}

// for ( int i =0; i < lg ; ++ i ) { // de [ i ]. p r i n t O p t i m u m ();

//}

// p r i n t F i t n e s s ( sg );

// o u t p u t F i t n e s s ( sg );

}

/**

* 最適解を得る

* @ r e t u r n M o n o c h r o m e P i c t u r e [] : 各プロセッサの最適解画像

(16)

*/

s t a t i c M o n o c h r o m e P i c t u r e [] g e t O p t i m u m () {

M o n o c h r o m e P i c t u r e opt [] = new M o n o c h r o m e P i c t u r e [ NTH ];

for ( int i =0; i < NTH ; ++ i ) {

opt [ i ] = de [ i ]. g e t O p t i m u m ();

}

r e t u r n opt ; }

/**

* 適応値を得る

* @ r e t u r n d o u b l e [] : 各プロセッサの適応値

*/

s t a t i c d o u b l e [] g e t F i t n e s s () {

d o u b l e fit [] = new d o u b l e [ NTH ];

for ( int i =0; i < NTH ; ++ i ) {

fit [ i ] = de [ i ]. g e t F i t n e s s ();

}

r e t u r n fit ; }

s t a t i c v o i d r i n g N e t w o r k () {

M o n o c h r o m e P i c t u r e opt [] = new M o n o c h r o m e P i c t u r e [ NTH ];

d o u b l e fit [] = new d o u b l e [ NTH ];

S y s t e m . out . p r i n t l n (" R i n g n e t w o r k ");

// fp . p r i n t l n (" R i n g n e t w o r k ");

// fp . p r i n t ("\ t ");

// for ( int i =0; i < NTH ; ++ i ) // fp . p r i n t ( i + "\ t ");

// fp . p r i n t l n ();

for ( int g =0; g < s g e n ; ++ g ) {

if (! i s F i n d O p t i m u m ) { // 最適値を発見するまで局所を計算するDE l o c a l D i f f e r e n t i a l E v o l u t i o n ( g );

opt = g e t O p t i m u m ();

fit = g e t F i t n e s s ();

int gv = 1;

if ( L G E N > GV ) gv = L G E N / GV ; if (( g % gv ) == ( gv - 1 ) ) {

for ( int i =0; i < NTH ; ++ i ) {

de [( i +1) % NTH ]. r e p l a c e D a t a ( opt [ i ] , fit [ i ]);

// S y s t e m . out . p r i n t ( i + " - >" + (( i +1) % NTH ) + " ");

} }

}

// S y s t e m . out . p r i n t l n ();

r e c o r d F i t n e s s ( g );

} }

s t a t i c v o i d t o r u s N e t w o r k () {

(17)

M o n o c h r o m e P i c t u r e opt [] = new M o n o c h r o m e P i c t u r e [ NTH ];

d o u b l e fit [] = new d o u b l e [ NTH ];

int w i d t h =1 , h i g h t =1;

w h i l e ( w i d t h * h i g h t < NTH ) { w i d t h *= 2;

if ( w i d t h * h i g h t == NTH ) b r e a k ; h i g h t *= 2;

}

S y s t e m . out . p r i n t l n (" T o r u s n e t w o r k ");

// fp . p r i n t l n (" T o r u s n e t w o r k ");

// fp . p r i n t ("\ t ");

// for ( int i =0; i < NTH ; ++ i ) // fp . p r i n t ( i + "\ t ");

// fp . p r i n t l n ();

for ( int g =0; g < s g e n ; ++ g ) {

if (! i s F i n d O p t i m u m ) { // 最適値を発見するまで局所を計算するDE l o c a l D i f f e r e n t i a l E v o l u t i o n ( g );

opt = g e t O p t i m u m ();

fit = g e t F i t n e s s ();

int gv = 1;

if ( L G E N > GV ) gv = L G E N / GV ; if (( g % gv ) == ( gv - 1 ) ) {

if (( g + 1 ) % ( 2 * gv ) == 0) { // 横方向のスレッドと通信 // S y s t e m . out . p r i n t l n ( g + " -");

for ( int h =0; h < h i g h t ; ++ h ) {

for ( int w =0; w < w i d t h ; ++ w ) {

de [ h * w i d t h + ( w + 1 ) % w i d t h ]. r e p l a c e D a t a ( opt [ h * w i d t h + w ] , fit [ h * w i d t h + w ]);

// S y s t e m . out . p r i n t (( h * w i d t h + w ) + " - >" + ( h * w i d t h + ( w + 1 ) % w i d t h ) + " ");

} }

} e l s e { // 縦方向のスレッドと通信

// S y s t e m . out . p r i n t l n ( g + " | " ) ; for ( int h =0; h < h i g h t ; ++ h ) {

for ( int w =0; w < w i d t h ; ++ w ) {

de [(( h + 1 ) % h i g h t )* w i d t h + w ]. r e p l a c e D a t a ( opt [ h * w i d t h + w ] , fit [ h * w i d t h + w ]);

// S y s t e m . out . p r i n t (( h * w i d t h + w ) + " - >" + ((( h + 1 ) % h i g h t )* w i d t h + w ) + " ");

} }

}

// S y s t e m . out . p r i n t l n ();

} }

r e c o r d F i t n e s s ( g );

} }

s t a t i c v o i d h y p e r c u b e N e t w o r k () {

M o n o c h r o m e P i c t u r e opt [] = new M o n o c h r o m e P i c t u r e [ NTH ];

d o u b l e fit [] = new d o u b l e [ NTH ];

(18)

int n e i g h b o r = 1 , p a i r = 2;

S y s t e m . out . p r i n t l n (" H y p e r c u b e n e t w o r k ");

// fp . p r i n t l n (" H y p e r c u b e n e t w o r k ");

// fp . p r i n t ("\ t ");

// for ( int i =0; i < NTH ; ++ i ) // fp . p r i n t ( i + "\ t ");

// fp . p r i n t l n ();

for ( int g =0; g < s g e n ; ++ g ) {

if (! i s F i n d O p t i m u m ) { // 最適値を発見するまで局所を計算するDE l o c a l D i f f e r e n t i a l E v o l u t i o n ( g );

opt = g e t O p t i m u m ();

fit = g e t F i t n e s s ();

int gv = 1;

if ( L G E N > GV ) gv = L G E N / GV ; if (( g % gv ) == ( gv - 1 ) ) {

for ( int i =0; i < NTH ; ++ i ) {

if (( i % p a i r ) < n e i g h b o r ) {

de [( i + n e i g h b o r ) % NTH ]. r e p l a c e D a t a ( opt [ i ] , fit [ i ]);

// S y s t e m . out . p r i n t ( i +" - >"+(( i + n e i g h b o r ) % NTH )+" ");

} e l s e {

de [( i - n e i g h b o r ) % NTH ]. r e p l a c e D a t a ( opt [ i ] , fit [ i ]);

// S y s t e m . out . p r i n t ( i +" - >"+(( i - n e i g h b o r ) % NTH )+" ");

} }

// S y s t e m . out . p r i n t l n ();

n e i g h b o r *= 2;

p a i r * = 2 ;

if ( n e i g h b o r >= NTH ) { n e i g h b o r = 1;

p a i r = 2;

} }

}

r e c o r d F i t n e s s ( g );

} }

s t a t i c v o i d h i e r a r c h i c a l N e t w o r k () {

M o n o c h r o m e P i c t u r e opt [] = new M o n o c h r o m e P i c t u r e [ NTH ];

d o u b l e fit [] = new d o u b l e [ NTH ];

int n e i g h b o r = 1 , p a i r = 2;

S y s t e m . out . p r i n t l n (" H i e r a r c h i c a l n e t w o r k ");

// fp . p r i n t l n (" H i e r a r c h i c a l n e t w o r k ");

// fp . p r i n t ("\ t ");

// for ( int i =0; i < NTH ; ++ i ) // fp . p r i n t ( i + "\ t ");

// fp . p r i n t l n ();

for ( int g =0; g < s g e n ; ++ g ) {

(19)

if (! i s F i n d O p t i m u m ) { // 最適値を発見するまで局所を計算するDE l o c a l D i f f e r e n t i a l E v o l u t i o n ( g );

opt = g e t O p t i m u m ();

fit = g e t F i t n e s s ();

int gv = 1;

if ( L G E N > GV ) gv = L G E N / GV ; if (( g % gv ) == ( gv - 1 ) ) {

n e i g h b o r = 1;

p a i r = 2;

w h i l e ( ( ( ( g + 1 ) / gv ) % p a i r ) == 0) { n e i g h b o r *= 2;

p a i r *= 2;

}

w h i l e ( p a i r > NTH ) {

n e i g h b o r = n e i g h b o r * 2/ NTH ; p a i r = p a i r * 2 / NTH ;

}

for ( int i =0; i < NTH ; ++ i ) {

if (( i % p a i r ) < n e i g h b o r ) {

de [( i + n e i g h b o r ) % NTH ]. r e p l a c e D a t a ( opt [ i ] , fit [ i ]);

// S y s t e m . out . p r i n t ( i +" - >"+(( i + n e i g h b o r ) % NTH )+" ");

} e l s e {

de [( i - n e i g h b o r ) % NTH ]. r e p l a c e D a t a ( opt [ i ] , fit [ i ]);

// S y s t e m . out . p r i n t ( i +" - >"+(( i - n e i g h b o r ) % NTH )+" ");

} }

// S y s t e m . out . p r i n t l n ();

} }

r e c o r d F i t n e s s ( g );

} }

/**

* ネットワーク無し

* 局所計算スレッド間の通信を一切しない

*/

s t a t i c v o i d n o N e t w o r k () {

S y s t e m . out . p r i n t l n (" No n e t w o r k ");

// fp . p r i n t l n (" No n e t w o r k ");

// fp . p r i n t ("\ t ");

// for ( int i =0; i < NTH ; ++ i ) // fp . p r i n t ( i + "\ t ");

// fp . p r i n t l n ();

for ( int g =0; g < s g e n ; ++ g ) {

if (! i s F i n d O p t i m u m ) { // 最適値を発見するまで局所を計算するDE l o c a l D i f f e r e n t i a l E v o l u t i o n ( g );

}

r e c o r d F i t n e s s ( g );

} }

(20)

/**

* 適合性表示

*/

s t a t i c v o i d p r i n t F i t n e s s () {

S y s t e m . out . p r i n t (" f i t n e s s : ");

for ( int i =0; i < NTH ; ++ i ) {

S y s t e m . out . p r i n t f ( " % 4 . 2 f " , de [ i ]. g e t F i t n e s s ( ) ) ; }

S y s t e m . out . p r i n t l n ();

}

/**

* 適合性表示

* スーパー世代ごとの適合性を表示する

* @ p a r a m sg スーパー世代数

*/

s t a t i c v o i d p r i n t F i t n e s s ( int sg ) {

S y s t e m . out . p r i n t f (" f i t n e s s : %2 d " , sg );

for ( int i =0; i < NTH ; ++ i ) {

S y s t e m . out . p r i n t f ( " % 4 . 2 f " , de [ i ]. g e t F i t n e s s ( ) ) ; }

S y s t e m . out . p r i n t l n ();

}

s t a t i c v o i d p r i n t O p t i m u m () { int i B e s t = 0;

d o u b l e f B e s t = de [ 0 ] . g e t F i t n e s s ();

for ( int i =1; i < NTH ; ++ i ) {

d o u b l e f = de [ i ]. g e t F i t n e s s ();

if ( f < f B e s t ) { i B e s t = i ; f B e s t = f ; }

}

S y s t e m . out . p r i n t l n (" T a r g e t ");

t a r g e t . s h o w P i c t u r e ();

S y s t e m . out . p r i n t l n (" O p t i m u m ");

de [ i B e s t ]. p r i n t O p t i m u m ();

// de [ i B e s t ]. o u t p u t O p t i m u m ( fp );

}

/**

* 適合性出力

* 適合性をファイルに出力する

*/

s t a t i c v o i d o u t p u t F i t n e s s () { fp . p r i n t (" f i t n e s s : ");

for ( int i =0; i < NTH ; ++ i ) {

fp . p r i n t f ( " % 4 . 2 f \ t " , de [ i ]. g e t F i t n e s s ( ) ) ; }

fp . p r i n t l n ();

}

(21)

/**

* 適合性出力

* スーパー世代ごとの適合性をファイルに出力する

* @ p a r a m g スーパー世代数

*/

s t a t i c v o i d o u t p u t F i t n e s s ( int sg ) { fp . p r i n t f (" f i t n e s s \ t %2 d \ t " , sg );

for ( int i =0; i < NTH ; ++ i ) {

fp . p r i n t f ( " % 4 . 2 f \ t " , de [ i ]. g e t F i t n e s s ( ) ) ; }

fp . p r i n t l n ();

}

/**

* 全てのの中で最も高い適合性を返すLDE

* @ r e t u r n d o u b l e : 適合性最高値

*/

s t a t i c d o u b l e g e t B e s t F i t n e s s () {

d o u b l e f B e s t = de [ 0 ] . g e t F i t n e s s ();

for ( int i =1; i < NTH ; ++ i ) {

d o u b l e f = de [ i ]. g e t F i t n e s s ();

if ( f < f B e s t ) f B e s t = f ; }

r e t u r n f B e s t ; }

/**

* 全てのの中で最も高い適合性をもつ画像返すLDE

* @ r e t u r n M o n o c h r o m e P i c t u r e : 適合性最高値の画像

*/

s t a t i c M o n o c h r o m e P i c t u r e g e t B e s t O p t i m u m (){

d o u b l e f B e s t = de [ 0 ] . g e t F i t n e s s ();

M o n o c h r o m e P i c t u r e o B e s t = de [ 0 ] . g e t O p t i m u m ();

for ( int i =1; i < NTH ; ++ i ) {

d o u b l e f = de [ i ]. g e t F i t n e s s ();

if ( f < f B e s t ) { f B e s t = f ;

o B e s t = de [ i ]. g e t O p t i m u m ();

} }

r e t u r n o B e s t ; }

/**

* F i t n e s s および O p t i m u m の記録

* @ p a r a m g スーパー世代数

*/

s t a t i c v o i d r e c o r d F i t n e s s ( int g ) {

d o u b l e b e s t F i t n e s s = g e t B e s t F i t n e s s ();

f i t n e s s R e c o r d [ r o o p I n d e x ][ g ] = b e s t F i t n e s s ; if (! i s F i n d O p t i m u m && b e s t F i t n e s s < E P S I L O N ) {

i s F i n d O p t i m u m = t r u e ;

(22)

f i n d O p t i m u m [ r o o p I n d e x ] = g * l g e n ; // g * L G E N ; }

o p t i m u m R e c o r d [ r o o p I n d e x ] = g e t B e s t O p t i m u m ();

}

/**

* @ r e t u r n データ記録用ファイル名

*/

s t a t i c S t r i n g r e c o r d F i l e N a m e () { S t r i n g f n a m e = " d a t a /";

if ( CT == -1) {

f n a m e += " mix -";

} e l s e if ( CT == 1) { f n a m e += " bin -";

} e l s e {

f n a m e += " exp -";

}

if ( IST == -1) {

f n a m e += " mix -";

} e l s e if ( IST == 1) { f n a m e += " rand -";

} e l s e {

f n a m e += " best -";

}

s w i t c h ( NWT ) { c a s e 1:

f n a m e += " r i n g ";

b r e a k ; c a s e 2:

f n a m e += " t o r u s ";

b r e a k ; c a s e 3:

f n a m e += " h y p e r c u b e ";

b r e a k ; c a s e 4:

f n a m e += " h i e r a r c h i c a l ";

b r e a k ; d e f a u l t :

f n a m e += " no ";

b r e a k ; }

if ( L G E N < 10) {

f n a m e += ( " 0 0 " + L G E N );

} e l s e if ( L G E N < 1 0 0 ) { f n a m e += ( " 0 " + L G E N );

} e l s e {

f n a m e += L G E N ; }

f n a m e += ". txt ";

r e t u r n f n a m e ; }

s t a t i c v o i d o u t p u t F i t n e s s R e c o r d () {

(23)

if ( CT == -1) {

rfp . p r i n t (" Mix \ t ");

} e l s e if ( CT == 1) {

rfp . p r i n t (" Bin \ t ");

} e l s e {

rfp . p r i n t (" Exp \ t ");

}

if ( IST == -1) {

rfp . p r i n t (" Mix \ t ");

} e l s e if ( IST == 1) {

rfp . p r i n t (" R a n d \ t ");

} e l s e {

rfp . p r i n t (" B e s t \ t ");

}

s w i t c h ( NWT ) { c a s e 1:

rfp . p r i n t (" R i n g n e t w o r k \ t ");

b r e a k ; c a s e 2:

rfp . p r i n t (" T o r u s n e t w o r k \ t ");

b r e a k ; c a s e 3:

rfp . p r i n t (" H y p e r c u b e n e t w o r k \ t ");

b r e a k ; c a s e 4:

rfp . p r i n t (" H i e r a r c h i c a l n e t w o r k \ t ");

b r e a k ; d e f a u l t :

rfp . p r i n t (" No n e t w o r k \ t ");

b r e a k ; }

rfp . p r i n t l n ( L G E N );

rfp . p r i n t ("\ t ");

int g m a x = s g e n * l g e n / GV ; if ( g m a x > 2 5 0 ) g m a x = 2 5 0 ; for ( int g =0; g < g m a x ; ++ g )

rfp . p r i n t f ( " % 2 d \ t " , g * GV );

rfp . p r i n t l n (" f i n d A t ");

int c o u n t = 0;

int sum = 0;

int s q s u m = 0;

int c o u n t T a b l e [] = new int [ 8 ] ;

for ( int i =0; i < c o u n t T a b l e . l e n g t h ; ++ i ) c o u n t T a b l e [ i ] = 0;

d o u b l e f i t n e s s S u m [] = new d o u b l e [ g m a x ];

for ( int i =0; i < f i t n e s s S u m . l e n g t h ; ++ i ) { f i t n e s s S u m [ i ] = 0;

}

int ct [] = new int [ L G E N * S G E N ];

for ( int i =0; i < ct . l e n g t h ; ++ i ) { ct [ i ] = 0;

}

(24)

for ( int r =0; r < R O O P N ; ++ r ) { rfp . p r i n t f ( " % 2 d \ t " , r );

if ( LGEN < GV ) {

for ( int g =0; g < g m a x ; ++ g ) {

rfp . p r i n t f ( " % 4 . 3 f \ t " , f i t n e s s R e c o r d [ r ][ g * GV / L G E N ]);

f i t n e s s S u m [ g ] += f i t n e s s R e c o r d [ r ][ g * GV / L G E N ];

} } e l s e {

for ( int g =0; g < g m a x ; ++ g ) {

rfp . p r i n t f ( " % 4 . 3 f \ t " , f i t n e s s R e c o r d [ r ][ g ]);

f i t n e s s S u m [ g ] += f i t n e s s R e c o r d [ r ][ g ];

} }

if ( f i n d O p t i m u m [ r ] < l g e n * s g e n ) { rfp . p r i n t l n ( f i n d O p t i m u m [ r ]);

c o u n t ++;

sum += f i n d O p t i m u m [ r ];

s q s u m += f i n d O p t i m u m [ r ] * f i n d O p t i m u m [ r ];

if ( f i n d O p t i m u m [ r ] < 16) { ++ c o u n t T a b l e [ 0 ] ;

} e l s e if ( f i n d O p t i m u m [ r ] < 32) { ++ c o u n t T a b l e [ 1 ] ;

} e l s e if ( f i n d O p t i m u m [ r ] < 64) { ++ c o u n t T a b l e [ 2 ] ;

} e l s e if ( f i n d O p t i m u m [ r ] < 1 2 8 ) { ++ c o u n t T a b l e [ 3 ] ;

} e l s e if ( f i n d O p t i m u m [ r ] < 2 5 6 ) { ++ c o u n t T a b l e [ 4 ] ;

} e l s e if ( f i n d O p t i m u m [ r ] < 5 1 2 ) { ++ c o u n t T a b l e [ 5 ] ;

} e l s e if ( f i n d O p t i m u m [ r ] < 1 0 2 4 ) { ++ c o u n t T a b l e [ 6 ] ;

} e l s e if ( f i n d O p t i m u m [ r ] < 2 0 4 8 ) { ++ c o u n t T a b l e [ 7 ] ;

}

++ ct [ f i n d O p t i m u m [ r ]];

} e l s e {

rfp . p r i n t l n (" not yet ");

} }

rfp . p r i n t (" av \ t ");

for ( int g =0; g < g m a x ; ++ g ) {

rfp . p r i n t f ( " % 4 . 3 f \ t " , ( f i t n e s s S u m [ g ] / R O O P N ));

}

rfp . p r i n t l n ();

for ( int i =1; i < c o u n t T a b l e . l e n g t h ; ++ i ) { c o u n t T a b l e [ i ] += c o u n t T a b l e [ i - 1 ] ; }

if ( c o u n t > 0) {

d o u b l e av = ( d o u b l e ) sum / c o u n t ; if ( c o u n t > 1) {

d o u b l e s t d e v = M a t h . s q r t (( d o u b l e ) ( s q s u m - av * av * c o u n t ) / ( count - 1 ) ) ; rfp . p r i n t ( c o u n t + "\ t " + av + "\ t " + s t d e v );

(25)

S y s t e m . out . p r i n t l n ( c o u n t + " av :" + av + " s t d e v :" + s t d e v );

} e l s e {

rfp . p r i n t ( c o u n t + "\ t " + av + "\ t n o n ");

S y s t e m . out . p r i n t l n ( c o u n t + " av :" + av + " s t d e v : non ");

} } e l s e {

rfp . p r i n t ( " 0 \ t n o n \ t n o n ");

S y s t e m . out . p r i n t l n ("0 av : non s t d e v : non ");

}

for ( int i =0; i < c o u n t T a b l e . l e n g t h ; ++ i ) { rfp . p r i n t ("\ t " + c o u n t T a b l e [ i ]);

}

rfp . p r i n t l n ();

for ( int r =0; r < R O O P N ; ++ r ) {

rfp . p r i n t l n (" L o o p : " + r );

rfp . p r i n t l n (" T a r g e t ");

t a r g e t s [ r ]. p r i n t P i c t u r e ( rfp );

rfp . p r i n t l n (" O p t i m u m ");

o p t i m u m R e c o r d [ r ]. p r i n t P i c t u r e ( rfp );

rfp . p r i n t f ( " % 4 . 3 f " , f i t n e s s R e c o r d [ r ][ SGEN - 1 ] ) ; rfp . p r i n t l n ();

}

for ( int i =1; i < ct . l e n g t h ; ++ i ) { ct [ i ] += ct [ i - 1 ] ;

}

for ( int i =0; i < 5 1 2 ; i + = 4 ) { rfp . p r i n t ( i + "\ t ");

}

rfp . p r i n t l n ();

for ( int i =0; i < 5 1 2 ; i + = 4 ) { rfp . p r i n t ( ct [ i ] + "\ t ");

}

rfp . p r i n t l n ();

} }

.1 LocalDifferentialEvolution

クラス

p a c k a g e de ;

i m p o r t j a v a . u t i l . R a n d o m ; i m p o r t j a v a . io .*;

/**

* 与えられたぼやけた値画像の元画像を進化計算により得る2

*/

p u b l i c c l a s s L o c a l D i f f e r e n t i a l E v o l u t i o n i m p l e m e n t s R u n n a b l e { M o n o c h r o m e P i c t u r e pop []; // 母集団( p o p u l a t i o n )

d o u b l e fit []; // 母集団の適合性( f i t n e s s of the p o p u l a t i o n ) int s i z e P o p ; // 母集団の大きさ( s i z e of p o p u l a t i o n )

d o u b l e d i f f C o n s ; // 差分定数( d i f f e r e n t i a l c o n s t a n t ) 現在は未使用拡張用(:) d o u b l e c r o s s C o n s ; // 交叉定数( c r o s s o v e r c o n s t a n t )

d o u b l e m u t a t i o n C o n s ; // 突然変異定数( m u t a t i o n c o n s t a n t ) int g e n e r a t i o n ; // 世代数( n u m b e r of g e n e r a t i o n s )

(26)

int i B e s t ; // 最適解のインデックス

R a n d o m rd ; // 乱数発生用クラスのインスタンス

M o n o c h r o m e P i c t u r e t a r g e t ; // 目標となる値画像2

int p i c t u r e S i z e ; // 画像のサイズ

int c r o s s T y p e ; // 交叉のタイプ

/**

* 1: bin

* oh : exp

*/

int i n d e x S e l e c t T y p e ; // インデックス選択のタイプ /**

* 1: r a n d

* ot : b e s t

*/

int t h N u m ; // スレッド番号

/**

* コンストラクタ

* @ p a r a m int s 母集団のサイズ

* @ p a r a m d o u b l e dc 差分定数

* @ p a r a m d o u b l e cc 交叉定数

* @ p a r a m d o u b l e mc 突然変異定数

* @ p a r a m int gen 世代数

* @ p a r a m int ct 交叉のタイプ

* @ p a r a m int ist : インデックスの選択タイプランダム (ベストor )

* @ p a r a m M o n o c h r o m e P i c t u r e mp : 目標画像

* @ r a m a m int tn スレッド番号

*/

L o c a l D i f f e r e n t i a l E v o l u t i o n ( int s , d o u b l e dc , d o u b l e cc , d o u b l e mc , int gen , int ct , int ist , M o n o c h r o m e P i c t u r e mp , int tn ) { s i z e P o p = s ;

d i f f C o n s = dc ; c r o s s C o n s = cc ; m u t a t i o n C o n s = mc ; g e n e r a t i o n = gen ; if ( ct == -1) {

if ( tn % 2 == 0) { c r o s s T y p e = 0;

} e l s e {

c r o s s T y p e = 1;

} } e l s e {

c r o s s T y p e = ct ; }

if ( ist == -1) {

if ( tn % 4 < 2) {

i n d e x S e l e c t T y p e = 0;

} e l s e {

i n d e x S e l e c t T y p e = 1;

} } e l s e {

i n d e x S e l e c t T y p e = ist ; }

(27)

rd = new R a n d o m ();

t a r g e t = mp ;

p i c t u r e S i z e = mp . s i z e ;

pop = m a k e P o p u l a t i o n (); // 解の母集団設定

fit = new d o u b l e [ s i z e P o p ];

s e t I n i t i a l F i t n e s s (); // 適合性の初期値設定

t h N u m = tn ; }

/**

* 解の母集団表示関数

*/

p u b l i c v o i d p r i n t P o p u l a t i o n () {

for ( int i =0; i < s i z e P o p ; ++ i ) { if ( i == i B e s t ) {

S y s t e m . out . p r i n t l n (" b e s t ");

} e l s e {

S y s t e m . out . p r i n t l n ();

}

pop [ i ]. s h o w P i c t u r e ();

} }

/**

* 最適解表示

*/

p u b l i c v o i d p r i n t O p t i m u m () { pop [ i B e s t ]. s h o w P i c t u r e ();

S y s t e m . out . p r i n t l n (" f i t n e s s : " + pop [ i B e s t ]. g e t V a l u e ( ) ) ; }

/**

* 最適解出力

* @ p a r a m p r i n t W r i t e r fp : 出力ファイルへのポインタ

*/

p u b l i c v o i d o u t p u t O p t i m u m ( P r i n t W r i t e r fp ) { pop [ i B e s t ]. p r i n t P i c t u r e ( fp );

fp . p r i n t l n (" f i t n e s s \ t " + pop [ i B e s t ]. g e t V a l u e ( ) ) ; }

/**

* 最適解出力

* @ r e t u r n M o n o c h r o m e P i c t u r e : 最適解

*/

p u b l i c M o n o c h r o m e P i c t u r e g e t O p t i m u m () { r e t u r n pop [ i B e s t ];

}

/**

* 適合性出力

* @ r e t u r n d o u l b e 適合性

図 1 リング型 図 2 トーラス型
表 1 各戦略の解発見平均世代数と解発見率 戦略 best rand best rand mix

参照

関連したドキュメント

Lu, “On the existence of periodic solutions for a kind of high-order neutral functional differential equation,” Journal of Mathematical Analysis and Applications, vol. Wang,

In the case of the former, simple liquidity ratios such as credit-to-deposit ratios nett stable funding ratios, liquidity coverage ratios and the assessment of the gap

The complexity of dynamic languages and dynamic optimization problems. Lipschitz continuous ordinary differential equations are

Yin, “Markowitz’s mean-variance portfolio selection with regime switching: a continuous-time model,” SIAM Journal on Control and Optimization, vol... Li,

Among all the useful tools for theoretical and numerical treatment to variational inequalities, nonlinear complementarity problems, and other related optimization problems, the

This paper is devoted to the investigation of the global asymptotic stability properties of switched systems subject to internal constant point delays, while the matrices defining

In order to demonstrate that the CAB algorithm provides a better performance, it has been compared to other optimization approaches such as metaheuristic algorithms Section 4.2

In order to achieve the minimum of the lowest eigenvalue under a total mass constraint, the Stieltjes extension of the problem is necessary.. Section 3 gives two discrete examples