0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【メタヒューリスティクス図鑑】Golden Jackal Optimization(GJO)─つがいのジャッカルで挟む⑩

0
Posted at

この記事について

メタファー系の5つめ、 Golden Jackal Optimization(GJO:キンイロジャッカル最適化) です。2022年提案と比較的新しく、キンイロジャッカルの つがい(オス・メス)による協調狩り を模しています。

GWO(⑥)が3頭のボスに従ったのに対し、GJO は 2頭(オス・メス)で獲物を挟み込む のが特徴です。…もうお気づきかもしれませんが、「リーダーの頭数を変えただけ」感が漂ってきます笑。その辺も含めて見ていきます。

メタヒューリスティクス図鑑シリーズの記事一覧はこちら。

記事 内容
⓪〜⑤ 入門・地図/PSO・ACO・CMA-ES・GA・Cuckoo
⑥〜⑨ GWO/HHO/MFO/GOA
⑩(本記事) Golden Jackal Optimization(GJO)
⑪ Manta Ray Foraging(MRFO)
⑫ まとめ:メタファー系の正体と使い分け

GJOとは

2022年に Chopra と Ansari が提案しました。

N. Chopra and M. M. Ansari, "Golden jackal optimization: A novel nature-inspired optimizer for engineering applications,"
Expert Systems with Applications, vol. 198, 116924, 2022.

キンイロジャッカルは つがい で狩りをします。オスのジャッカルが先導し、メスが付き従って獲物を追い込む、というストーリーを最適化に持ち込んでいます。集団の最良個体を オス 、2番目を メス として、各エージェントはこの2頭の中間へ動きます。

核心:2頭のリーダーで挟む + エネルギー

先に登場する記号を整理しておきます。$t$ は現在の反復回数、$T$ は最大反復回数です。

記号 意味 実装(後述)での対応
$X_i$ 更新するエージェント $i$ の現在位置 X[i]
$X_M$ オス :これまでの最良個体 male
$X_{FM}$ メス :2番目に良い個体 female
$E_1$ エネルギーの 上限 。$E_1 = 1.5(1 - t/T)$ で $1.5 \to 0$ へ直線的に減る E1
$E_0$ $[-1, 1]$ の一様乱数。エージェントごと・反復ごとに引き直す 2 * rng.random() - 1
$E = E_1 E_0$ 獲物の 回避エネルギー 。$-E_1 \le E \le E_1$ の範囲でランダムに決まるスカラー E
$R_L$ ⑤の Lévyフライト で作った、次元ごとに値が違うランダムベクトル($0.05$ 倍に縮小) RL
$Y_1, Y_2$ オス・メスそれぞれを基準にした 行き先の候補 Y1, Y2

更新は次の3ステップです。

① エネルギー $E$ を決める

E = \underbrace{1.5\left(1 - \frac{t}{T}\right)}_{E_1\text{:上限(減衰)}} \cdot \underbrace{E_0}_{[-1,\,1]\text{ の乱数}}

② $\vert E\vert$ の大きさで式を切り替えて、行き先候補 $Y_1, Y_2$ を求める

\begin{aligned}
|E| > 1\ \text{(探索)}:&\quad
Y_1 = X_M - E\,|X_M - R_L\cdot X_i|,\quad
Y_2 = X_{FM} - E\,|X_{FM} - R_L\cdot X_i| \\
|E| \le 1\ \text{(活用)}:&\quad
Y_1 = X_M - E\,|R_L\cdot X_M - X_i|,\quad
Y_2 = X_{FM} - E\,|R_L\cdot X_{FM} - X_i|
\end{aligned}

$R_L\cdot X_i$ の積と $|\cdot|$ の絶対値は、どちらも 次元ごと(要素ごと) に計算します。$|X_M - R_L\cdot X_i|$ は「オスと自分のおおよその距離」で、それに $E$ を掛けた分だけ オスの位置からずらした点 が $Y_1$ です。$E$ は正にも負にもなるので、オスの手前にも向こう側にも候補ができます($Y_2$ はメスについて同じことをしたもの)。

③ 2つの候補の中点へ移動する

X_i^{\text{new}} = \frac{Y_1 + Y_2}{2}

オス基準の候補とメス基準の候補を 平均 するので、結果として2頭に挟まれた位置へ寄っていくわけです。

エネルギー $E$ が探索→活用のつまみで、HHO(⑦)の $E$ とほぼ同じ発想です。 「リーダーへ係数つきで詰める」骨格そのもの で、頭数が2頭になっただけ、と言えます。

図で見る

20260801_gjo_pair.png

  • ①(左)1ステップの幾何 :オス $X_M$(最良)とメス $X_{FM}$(次点)それぞれへの行き先 $Y_1, Y_2$ を求め、 そのちょうど中点 へ動きます。⑥のGWOの図と見比べると、 星が3つから2つに減っただけ なのがよくわかるかと思います
  • ②(中)回避エネルギーの推移 :$\vert E\vert$ の上限が $1.5(1-t/T)$ で減衰し、$\vert E\vert>1$ なら探索、$\vert E\vert \le 1$ なら活用に切り替わります。⑦のHHOの図とほとんど同じ形です
  • ③(右)$\vert E\vert$ と着地点の関係 :$\vert E\vert$ を $0$ から $1.5$ まで変えたときに $X^{new}$ がどこに来るかを色で示しました。 青($\vert E\vert$ 小)は2頭の中間(×印)付近、赤($\vert E\vert$ 大)は遠方 へ飛びます

③で着地点が 線状に並ぶ のは、$E$ がスカラー係数として距離全体に掛かるからです(ランダム係数 $R_L$ の揺らぎは $0.05$ 倍と小さい)。 「向きは2頭が決め、距離だけをエネルギーが決める」 という構造がそのまま見えている、と読むとわかりやすいかと思います。

Python実装

import numpy as np
# levy() は ⑤で定義したもの

def gjo(func, dim, lb, ub, n_agents=30, n_iter=500, seed=0):
    rng = np.random.default_rng(seed)
    X = rng.uniform(lb, ub, (n_agents, dim))
    fit = np.array([func(x) for x in X])
    order = np.argsort(fit)
    male, female = X[order[0]].copy(), X[order[1]].copy()  # オス・メス
    fmale = fit[order[0]]
    history = []
    for t in range(n_iter):
        E1 = 1.5 * (1 - t / n_iter)
        for i in range(n_agents):
            E = E1 * (2 * rng.random() - 1)            # 回避エネルギー
            RL = 0.05 * levy(dim, rng)
            if abs(E) > 1:                             # 探索
                Y1 = male - E * np.abs(male - RL * X[i])
                Y2 = female - E * np.abs(female - RL * X[i])
            else:                                      # 活用
                Y1 = male - E * np.abs(RL * male - X[i])
                Y2 = female - E * np.abs(RL * female - X[i])
            X[i] = np.clip((Y1 + Y2) / 2, lb, ub)      # 2頭の中間へ
        fit = np.array([func(x) for x in X])
        order = np.argsort(fit)
        if fit[order[0]] < fmale:
            fmale, male = fit[order[0]], X[order[0]].copy()
            female = X[order[1]].copy()
        history.append(fmale)
    return male, fmale, history

Rastrigin(2次元)で実行します。

_, best_f, history = gjo(rastrigin, dim=2, lb=-5.12, ub=5.12, seed=0)
print(f'GJO 最良値 f = {best_f:.6e}  (初期 {history[0]:.3f} → 最終 {history[-1]:.3e})')
GJO 最良値 f = 0.000000e+00  (初期 1.897 → 最終 0.000e+00)

大域最適に到達しました。しかも収束がとても速いです。

20260801_gjo_convergence.png

10次元・10シード平均では Rastrigin で $1.5\times10^{-11}$、Ackley で $2.9\times10^{-2}$。⑫の収束比較図でも、 GJO は全手法で最速で底に到達 しています。数値だけ見れば文句なしの強さです。

しかし、最も激しい原点バイアス

ところが GJO は、 今回のメタファー系の中で最も原点バイアスが強い ことが分かりました。⑫で最適解を原点から $+2$ ずらすと、成績は次のように激変します。

最適解が原点 最適解を+2にずらす
GJO $1.5\times10^{-11}$ $33.7$

$10^{-11}$ から $33.7$ へ、 12桁以上の悪化 です。Rastrigin の原点では「全手法最速・最強クラス」だったのに、最適解をたった2ずらしただけで 最下位クラスまで転落 します。

これは GJO の更新式が、Lévy係数 $R_L$ をかけて「$X - E\cdot|\dots|$」と縮める構造を持ち、 原点(ゼロベクトル)方向へ強く吸い寄せられる ためです。「原点に最適解があるベンチマークでだけ無双する」という、メタファー系の評価で最も警戒すべきパターンの典型例になっています。

まとめ

  • GJO はキンイロジャッカルの つがい狩り を模し、オス(最良)・メス(次点)2頭の中間へエージェントを動かす
  • エネルギー $E$ で探索→活用を切り替える ── HHO(⑦)とほぼ同じ発想で、頭数が2頭になっただけ
  • 原点最適のベンチマークでは 全手法最速で大域最適に到達 するほど強い
  • しかし 原点バイアスが最も激しく 、最適解をずらすと $10^{-11}\to33.7$ と壊滅する
  • 「ベンチマーク次第で評価が真逆になる」生きた実例(⑫で詳述)

次回はシリーズ最後の手法、 Manta Ray Foraging Optimization(MRFO) です。

参考にした記事や本、論文等

  • N. Chopra and M. M. Ansari, "Golden jackal optimization: A novel nature-inspired optimizer for engineering applications," Expert Systems with Applications, vol. 198, 116924, 2022.
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?