mesaによるマルチエージェントシミュレーション

Pythonで実装された、マルチエージェントシミュレーション用ライブラリの一つが「mesa」である。 普段お世話になっているこのライブラリの布教を目的に、鳥の行動モデルをmatplotlibで可視化した。

まとめ:可視化結果

https://github.com/estshorter/boid-model-visualization-matplotlib/raw/master/movie.gif

赤丸が鳥(エージェント)の位置を、破線が鳥同士の通信可能範囲を表している。 この範囲に入っている他の鳥の情報(位置・速度)と、自分の情報のみを考慮して、鳥は移動している。 簡単のため、領域の端と端が繋がっている設定にしている。 正直あまり鳥に見えないが、ご容赦いただきたい。

マルチエージェントシミュレーション

マルチエージェントシミュレーション(Multi Agent Simulation: MAS)の詳細な説明は以下のページなどに譲るが、 一言でいうと「意思決定をおこなうもの(エージェント)が複数存在する系のシミュレーション」である。 交通渋滞のシミュレーションなどが適用例として挙げられる。この場合、エージェントは車(の運転手)である。

MASコミュニティ - マルチエージェント・シミュレーション(MAS)とは

qiita.com

mesa

MASのためのPythonライブラリの一つがmesaである。 オープンソースな上、簡単に使えるのでオススメ。 ソースコードの分量が少ないので、ライブラリ中でなにをやってるかすぐにわかるのもよい。

mesaのインストールは

pip install mesa

で可能。パッケージ管理にcondaを使っている場合には、mesa用の環境を作った後、

pip install mesa --no-deps

としてmesa単体のみをインストールし、依存パッケージはcondaで入れるとよい。

鳥の行動モデルの可視化

以下、mesaを使って鳥の行動モデルを可視化してみる。

鳥の行動モデル

鳥の行動モデルはボイドモデルとも呼ばれており、 エージェントが以下の3つのルールに従って移動するものである。

①衝突回避(Collision Avoidance):衝突しそうな他の鳥や物体がいたら衝突しないように離れるようにします。

②整列(Velocity Matching):近くにいる他の鳥と移動する速さと方向を合わせて動きを同じにします。

③接近(Flock Centering):群れからはぐれてしまわないように、鳥が多くいるほうに近づくようにします。

f:id:estshorter:20190706220750p:plain
鳥の行動モデルにおける3つのルール

以上の説明と画像は、下記より引用した。

MASコミュニティ - ボイドモデル

鳥の行動モデルの実装はmesaのexampleで公開されており、 今回はこれを使用した。

可視化

可視化のためのソースコードを以下のリポジトリに置いた。 mesa、numpy、matplotlibがインストールされていれば動作するはず。

github.com

run.pyを実行すると、シミュレーション結果がmatplotlibによりリアルタイムに可視化される。可視化結果は最初に載せたとおりであり、generate_movie.pyはそのgif動画を作るためのファイルである。

なお、上述の通り、鳥の行動モデルの実装自体は流用した。 自分が書いたのは、可視化部分(model.pyの一部関数)、run.py、およびgenerate_movie.py である。 また、可視化を高速に行うため、グラフを差分更新している。 この詳細については以下の記事を参照されたい。 waregawa-log.hatenablog.com

参考

可視化結果の動画化については以下のページを参考にした。

FuncAnimationについての記事 qiita.com

Gifで保存するときの設定法についての記事 cartman0.hatenablog.com

mesaの使い方自体については、以下の公式チュートリアルがよくまとまっている。

Introductory Tutorial — Mesa .1 documentation

PowerShell上におけるlatexdiffの出力結果の文字化けへの対処

latexdiffは、2つのTeXファイルの差分を、PDFにコンパイル可能な形で出力するプログラムであり文書校正に有用である。 この記事では、ネット情報を基にlatexdiffをPowerShell上で実行した際、出力結果が文字化けしたことへの対処をメモする。

まとめ

  • PowerShell上でlatexdiffをlatexdiff -e utf-8 -t CFONT input1.tex input2.tex > output.texと実行すると文字化けする。
  • PowerShell 5.x(2019/6時点でWindows10のデフォルト)なら、[Console]::OutputEncoding = [Text.Encoding]::UTF8と入力してlatexdiffの出力文字コードUTF-8」をPowerShell上で指定した後に
latexdiff -e utf-8 -t CFONT input1.tex input2.tex | Out-String | % { [Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Path "output.tex" -Encoding Byte

とすると文字化けしていない「BOMなしUTF-8」なoutput.texを出力できる。

  • PowerShell Core 6.xなら以下のコマンドでよい。
[Console]::OutputEncoding = [Text.Encoding]::UTF8
latexdiff -e utf-8 -t CFONT input1.tex input2.tex > output.tex
  • コマンドプロンプトなら最初に挙げたコマンドlatexdiff -e utf-8 -t CFONT input1.tex input2.tex > output.tex を使えばよい。

文字化けの再現

以下、日本語を含むTeXファイルtemplate.tex*1に対して、 それ自身との差分をlatexdiffで取りoutput.texを出力してみる。 これに対応する、ネットでよく紹介されているコマンドは以下の通り。

latexdiff -e utf-8 -t CFONT template.tex template.tex > output.tex

このコマンドをPowerShell 5.x 上で実行したとき、output.texは以下のように文字化けする。 加えて、その文字コードは「BOMありUTF-16 LE」になってしまう。

%\documentclass[a4paper,uplatex,dvipdfmx,ja=standard,11pt,draft]{bxjsarticle}
%DIF LATEXDIFF DIFFERENCE FILE
%DIF DEL template.tex   Wed Jun 19 17:40:52 2019
%DIF ADD template.tex   Wed Jun 19 17:40:52 2019
\documentclass[a4paper,uplatex,dvipdfmx,ja=standard,11pt,draft]{bxjsarticle}

\setpagelayout{ignorehead}
\usepackage[dynamics]{PrettyLatexReport} % for dynamics seminar
%\usepackage{PrettyLatexReport} % for research seminar

\title{2016/12/02 繧シ繝毳
\author{Wernher Magnus Maximilian Freiherr von Braun}
\date{\today}
% 霈ェ隰幢シ亥鴨蟄ヲ繧シ繝滂シ画球蠖鍋ッ・峇
\contents{100}{110} % required only for dynamics seminar

% 遶逡ェ蜿キ・悟シ冗分蜿キ縺ェ縺ゥ縺ョ螟画峩
%\setcounter{section}{3}
%\setcounter{subsection}{13}
%\setcounter{subsubsection}{4} 
%\setcounter{equation}{141}  
%DIF PREAMBLE EXTENSION ADDED BY LATEXDIFF
%DIF CFONT PREAMBLE %DIF PREAMBLE
\RequirePackage{color}\definecolor{RED}{rgb}{1,0,0}\definecolor{BLUE}{rgb}{0,0,1} %DIF PREAMBLE
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} %DIF PREAMBLE
\providecommand{\DIFadd}[1]{{\protect\color{blue} \sf #1}} %DIF PREAMBLE
\providecommand{\DIFdel}[1]{{\protect\color{red} \scriptsize #1}} %DIF PREAMBLE
%DIF SAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddbegin}{} %DIF PREAMBLE
\providecommand{\DIFaddend}{} %DIF PREAMBLE
\providecommand{\DIFdelbegin}{} %DIF PREAMBLE
\providecommand{\DIFdelend}{} %DIF PREAMBLE
\providecommand{\DIFmodbegin}{} %DIF PREAMBLE
\providecommand{\DIFmodend}{} %DIF PREAMBLE
%DIF FLOATSAFE PREAMBLE %DIF PREAMBLE
\providecommand{\DIFaddFL}[1]{\DIFadd{#1}} %DIF PREAMBLE
\providecommand{\DIFdelFL}[1]{\DIFdel{#1}} %DIF PREAMBLE
\providecommand{\DIFaddbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFaddendFL}{} %DIF PREAMBLE
\providecommand{\DIFdelbeginFL}{} %DIF PREAMBLE
\providecommand{\DIFdelendFL}{} %DIF PREAMBLE
%DIF LISTINGS PREAMBLE %DIF PREAMBLE
\RequirePackage{listings} %DIF PREAMBLE
\RequirePackage{color} %DIF PREAMBLE
\lstdefinelanguage{DIFcode}{ %DIF PREAMBLE
%DIF DIFCODE_CFONT %DIF PREAMBLE
  moredelim=[il][\color{red}\scriptsize]{\%DIF\ <\ }, %DIF PREAMBLE
  moredelim=[il][\color{blue}\sffamily]{\%DIF\ >\ } %DIF PREAMBLE
} %DIF PREAMBLE
\lstdefinestyle{DIFverbatimstyle}{ %DIF PREAMBLE
    language=DIFcode, %DIF PREAMBLE
    basicstyle=\ttfamily, %DIF PREAMBLE
    columns=fullflexible, %DIF PREAMBLE
    keepspaces=true %DIF PREAMBLE
} %DIF PREAMBLE
\lstnewenvironment{DIFverbatim}{\lstset{style=DIFverbatimstyle}}{} %DIF PREAMBLE
\lstnewenvironment{DIFverbatim*}{\lstset{style=DIFverbatimstyle,showspaces=true}}{} %DIF PREAMBLE
%DIF END PREAMBLE EXTENSION ADDED BY LATEXDIFF

\begin{document}
    \maketitle

    \section{蠎剰ォ凡
    We choose to go to the moon. We choose to go to the moon in this decade and do the other things, not because they are easy, but because they are hard, because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one which we intend to win, and the others, too.

    
    縺・m縺ッ縺ォ縺サ縺ク縺ィ縺。繧翫〓繧九r
    繧上°繧医◆繧後◎縺、縺ュ縺ェ繧峨・
    縺・p縺ョ縺翫¥繧・∪縺代・縺薙∴縺ヲ
    縺ゅ&縺阪f繧√∩縺励q縺イ繧ゅ○縺・
    濶イ縺ッ蛹ゅ∈縺ゥ 謨」繧翫〓繧九r
    謌代′荳冶ェー縺・蟶ク縺ェ繧峨・
    譛臥ぜ縺ョ螂・螻ア 縺代・雜翫∴縺ヲ
    豬・″螟「隕九§ 驟斐・繧ゅ○縺・
    \paragraph{蟆剰ヲ句・縺抑\leavevmode\\
    \indent
    蟆剰ヲ句・縺励r蜈・繧後◆縺・エ蜷医・蜃ヲ逅・    \begin{align}
       \hat{J} \cdot \dot{\vec{\omega}} + \vec{\omega}\times \vec{h}  = \vec{T} \label{eq:euler}
   \end{align}
    蠑十eqref{eq:euler}

    \section{蠑慕畑}
    蠑慕畑縺ョ繝・せ繝・cite{Stevenson2012,Tsukahara2016},\cite{konoue2005,Wie2008,Isabelle,book,inbook,inproceeding,URL}
\begin{figure}[h]
    \begin{subfigure}{0.5\linewidth}
        \centering\includegraphics[width=5cm]{fig/fig1.eps}
        \caption{$\vec{f},\vec{g},\vec{h},\vec{u}$縺ョ髢「菫・\label{fig:fig1}    % 繧ュ繝」繝励す繝ァ繝ウ縺悟峙縺ョ荳矩Κ縺ォ蜈・繧・ \end{subfigure}
    \begin{subfigure}{0.5\linewidth}
        \centering\includegraphics[width=5cm]{fig/fig2.eps}
        \caption{$\vec{g},\vec{h},\vec{u}$縺ョ髢「菫・\label{fig:fig2}    % 繧ュ繝」繝励す繝ァ繝ウ縺悟峙縺ョ荳矩Κ縺ォ蜈・繧・   \end{subfigure}
    \caption{蜷・・繧ッ繝医Ν縺ョ蟷セ菴慕噪髢「菫・\label{fig:case4} 
\end{figure}

\bibliography{references}

\end{document} 

上記コマンドの問題点は以下2点である。

  1. latexdiffの出力文字コードは「UTF-8*2であるが、PowerShellのデフォルト値「Shift_JIS」として誤認される。
  2. output.tex文字コードが、PowerShell 5.x系のデフォルト値「BOMありUTF-16 LE」になってしまう。

対処法

問題1への対処

PowerShellのパイプ|はオブジェクトを渡す。 そのため、文字コードPowerShellのデフォルト値「Shift-JIS」でない文字を扱う場合には、正しい文字コードPowerShell上で指定する必要がある。 今回は、latexdiffの出力文字コードである「UTF-8」を以下のように指定する必要がある。

[Console]::OutputEncoding = [Text.Encoding]::UTF8

参考: ladybug.hatenadiary.org

問題2への対処

PowerShell 5.xで「BOMなしUTF-8」を出力するには、次のコマンドを実行する。

latexdiff -e utf-8 -t CFONT input1.tex input2.tex | Out-String | % { [Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Path "output.tex" -Encoding Byte

PowerShell Core 6.x系ではデフォルト文字コードが「BOMなしUTF-8」に変更されているため、以下のコマンドで良い。

latexdiff -e utf-8 -t CFONT input1.tex input2.tex > "output.tex" 

参考: blog.shibata.tech

blog.shibata.tech

結論

PowerShell 5.x (2019/6時点でWindows10のデフォルト)を使う場合

文字化けしていない「BOMなしUTF-8」なoutput.texは以下のコマンドで出力できる。

[Console]::OutputEncoding = [Text.Encoding]::UTF8
latexdiff -e utf-8 -t CFONT input1.tex input2.tex | Out-String | % { [Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Path "output.tex" -Encoding Byte

PowerShell Core 6.xを使う場合

[Console]::OutputEncoding = [Text.Encoding]::UTF8
latexdiff -e utf-8 -t CFONT input1.tex input2.tex > output.tex

未確認だが、デフォルト文字コードの変更がなければ PowerShell 7でも使えると思われる。

コマンドプロンプトを使う場合

説明はしなかったが、コマンドプロンプトであれば以下のコマンドでよい。

latexdiff -e utf-8 -t CFONT input1.tex input2.tex > output.tex

コマンドプロンプトではlatexdiffの出力をバイナリのままファイルに書き込んでいると思われるため、追加コマンドが不要であると考えている。

*1:文字コードは「BOMなしUTF-8」。

*2:BOMの有無は調べていない。

TeXstudioからSumatra PDFを呼ぶときにフォーカスを移さない方法(forward searchなし)

まとめ

TeXstudioの外部PDFビューアに以下のコマンドを設定すればよい。

\dde:///"C:\Program Files\SumatraPDF\SumatraPDF.exe":SUMATRA/control/[Open("?am.pdf", 0,0,1)]

詳細説明

私はTeXエディタとしてTeXstudioを使っており、その外部PDFビューワとしてSumatra PDFを使用している。 Forward searchは個人的に好みでないので、もともとは次のコマンドでSumatra PDFを開いていた。

"C:/Program Files/SumatraPDF/SumatraPDF.exe\" -reuse-instance %.pdf

参考にしたのは以下のページ。 ossyaritoori.hatenablog.com

だが、これだとコンパイルのたびにSumatra PDF側にフォーカスが移ってしまう。 そこで、Sumatra PDFのドキュメントを参考にして以下の設定に変更したところ、フォーカスが移らないようにできた。

\dde:///"C:\Program Files\SumatraPDF\SumatraPDF.exe":SUMATRA/control/[Open("?am.pdf", 0,0,1)]

www.sumatrapdfreader.org

余談

latexのコマンドでplatex.exe -synctex=-1 -interaction=nonstopmode %.tex" のように-synctex=-1とすると、SyncTeX形式のファイルが圧縮されなくなるらしい。ソースは以下。

texwiki.texjp.org

圧縮しなくなる分コンパイルの速度は上がりそうだが、定量的にどの程度早くなるかは不明。

最適制御問題の求解アルゴリズムの実装を公開しました

以下のページで、最適制御問題の数値解法の一つであるSCGRA (Sequential Conjugate Gradient-Restoration Algorithm)のMATLAB実装を公開しました。

github.com

最適制御問題の数値解法には非線形計画法に帰着させる直接法と、変分法に基づく間接法があり、これは後者に該当します。 さらに詳しく言えば、1次の勾配法です。

このプログラムは私が学生の頃に書いたものであり、もうメンテはしていませんが、もしかしたら需要があるかもと思って公開しました。 アルゴリズムの詳細は以下のPDFにまとめてあります。

scgra/doc.pdf at master · estshorter/scgra · GitHub

以下のスクリプトがExampleです。

scgra/RunCar.m at master · estshorter/scgra · GitHub

このスクリプトでは、以下の状態方程式および拘束条件に従う車の最短時間制御問題を解いています。 途中まではアクセル全開で、その後は急ブレーキをかけて減速する解(bang-bang解)が得られるはずです。


\begin{aligned}
\ddot{x} = u \\
|u| \leq u_{\max}
\end{aligned}

補遺

変分法を基礎としている以上仕方ないのですが、関数を変分した時の値をプログラムに入力せねばならず、正直手間です。。 直接法だとそれをしなくてよいので楽ですね。

PMA-60の電源不具合

Denonのプリメインアンプ「PMA-60」を購入したが、電源まわりに不具合があったためメモ。 Denonに問い合わせた結果、初期不良とのことで交換となった。交換後は正常に動作している。

まとめ

  • シャットダウン→再起動を繰り返す不具合がPMA-60に発生
  • 他機器(ドライヤーなど)に起因する電圧変動が原因の可能性有り
  • Denonに問い合わせたところ、初期不良とのことで交換となった。交換後は正常に動作中。

不具合内容

数時間に1回程度は急にPMA-60の電源が落ち、すぐに再起動がかかる。 その後、シャットダウン→再起動を数分の間に繰り返し、最後には電源OFFのままとなる。 こうなると電源ボタンを押しても電源が入らず、体感で20分程度放置しないと起動できなくなる。 電源ケーブルを抜き差ししても効果はなく、放置する必要あり。

補足

  • PMA-60にはスピーカーを接続しており、ヘッドホンは使用していない
  • シャットダウン・再起動時、保護回路動作表示用の赤LEDは点滅しない
  • オートスタンバイをOFFにしていても発生する
  • 音声を鳴らしている/いないにかかわらず発生する
  • USB、Optical、Bluetoothいずれからの入力でも発生する
  • 電源ケーブル以外を外した状態でも発生する
  • ドライヤーおよびPMA-60の電源ケーブルフェライトコアを入れたが体感できる効果なし

不具合の一部再現

ヘアドライヤー(パナソニック イオニティ EH-NE58、1200W)をONにすると上記の不具合が一部再現できたため、関係あるかは不明だが、詳細を以下に記す。

ヘアドライヤー(PMA-60とは別の壁コンセントにさしている)の出力を最大にしている間PMA-60がシャットダウンし、ドライヤーを消すとPMA-60が再起動する。 PMA-60と同じ電源タップに差しているPC、ディスプレイなどには影響がないため、電源容量の問題ではない。 なお、ドライヤー使用による再現性は100%ではなく、かつ、不具合内容で述べたものとは違って再起動は一度きりである。

もしこれが上記不具合と関係ある場合、PMA-60の電圧変動(電圧降下 or ノイズ)への耐性の弱さが不具合原因と考えられる。 もちろん、単なる電源回路の不具合(初期不良)の可能性もあるが。→初期不良だった。電源関連が死んでたのかも。

類似事例

差分更新によるmatplotlibのアニメーションの高速化

業務で、シミュレーション結果をmatplotlibによりリアルタイム描画する必要に迫られた。 最初はグラフ全体を毎ステップ再描画していたが、差分更新に変えたら動作がめっちゃ速くなって感動したのでメモ。

まとめ

グラフの軸などを再利用し、データだけ更新するには以下のメソッドを呼べばよい。

  • plot -> set_data
  • scatter -> set_offsets
  • patches.Circle -> center (正確にはこれだけインスタンス変数だが)
  • pcolorfast -> set_data

qiita.com stackoverflow.com qiita.com

なお、プロットを消す場合にはremoveすればよいらしい。 keisanbutsuriya.hateblo.jp

プログラム例

以下はブラウン運動を100ステップだけシミュレーションするコード。 実行時間を測定したところ、毎回全て再描画:10.27秒、差分だけ再描画:3.66秒と約2.81倍の差がついた。

f:id:estshorter:20190210095522p:plain
シミュレーション結果

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import time

def step(x, sigma):
    cov = np.diag(sigma)
    dt = 0.1
    x = x + dt * np.random.multivariate_normal([0, 0], cov, 20)
    return x

def draw(t):
    plt.clf()
    plt.suptitle(f"t={t}")
    ax = plt.gca()
    ax.scatter(x[:10,0], x[:10,1], c="black", s = 10)
    ax.plot(x[10:20,0], x[10:20,1], "r^")
    for i in range(10):
        c = patches.Circle(xy=x[i], radius=0.05, fc='grey', alpha=0.1)
        ax.add_patch(c)
        c = patches.Circle(xy=x[i+10], radius=0.05, fc='pink', alpha=0.2)
        ax.add_patch(c)

    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    ax.set_aspect('equal')
    plt.pause(0.01)

def draw_initial(fig, ax, t):
    text = fig.suptitle(f"t={t}")
    scat = ax.scatter(x[:10,0], x[:10,1], c="black", s = 10)
    line, = ax.plot(x[10:20,0], x[10:20,1], "r^")
    cs = []
    for i in range(10):
        c = patches.Circle(xy=x[i], radius=0.05, fc='grey', alpha=0.1)
        ax.add_patch(c)
        cs.append(c)
    for i in range(10):
        c = patches.Circle(xy=x[i+10], radius=0.05, fc='pink', alpha=0.2)
        ax.add_patch(c)
        cs.append(c)

    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    ax.set_aspect('equal')

    return text, scat, line, cs
 
def draw_succesive(text, scat, line, cs, t):
    text.set_text(f"t={t}")
    scat.set_offsets(x[:10,:])
    line.set_data(x[10:20,0], x[10:20,1])
    for i in range(20):
        cs[i].center = x[i]
    plt.pause(0.01)


if __name__ == '__main__':
    n_iter = 100
    sigma = np.full(2, 0.1 / 3)

    x = np.zeros((20,2))
    fig, ax = plt.subplots()
    
    start = time.time()
    for t in range(n_iter):
        x = step(x,sigma)
        draw(t) 
    elapsed_time1 = time.time() - start
    plt.close()

    fig, ax = plt.subplots()
    x = np.zeros((20,2))
    text, scat, line, cs = draw_initial(fig, ax, t)    
    start2 = time.time()
    for t in range(n_iter):
        x = step(x,sigma)
        draw_succesive(text, scat, line, cs, t)
    elapsed_time2 = time.time() - start2
    print(f"rewrite_all: {elapsed_time1}, rewrite_diff: {elapsed_time2}")

その他参考にしたサイト

qiita.com qiita.com

分布推定アルゴリズムあるいは確率モデル遺伝的アルゴリズム

分布推定アルゴリズム(estimation of distribution algorithm: EDA)、あるいは確率モデル遺伝的アルゴリズム(probabilistic model-building genetic algorithm: PMBGA)と呼ばれる、ヒューリスティックな最適化アルゴリズムについて調べる機会があったのでメモ。

遺伝的アルゴリズムは、個体同士を交叉・突然変異させることで最適解をヒューリスティックに探索する最適化アルゴリズムであり、個体の生成モデルは陽に示されない。 一方でEDAは、個体が生成される確率モデルを陽に定義し、それを逐次修正していくものである。 英語版Wikipediaの図を見るとわかりやすい(ブログの背景が黒いせいで見づらくなっているが)。 探索中に得られた最小値(注:真の最小値とは限らない)の近傍で確率が高くなるように確率密度関数を修正していく。 確率が低い裾野の部分が、遺伝的アルゴリズムでいうところの「突然変異」に相当するのだろうと理解している。

Eda mono-variant gauss iterations.svg
By Johann Dréo (User:Nojhan) - Own work, CC BY-SA 3.0, Link

上記図は、以下ページより引用。 en.wikipedia.org

同様のアイデア(モデルの更新方法は違うっぽいが)でより広く知られているのは、 CMA-ES (covariance matrix adaptation evolution strategy)だろう。 個体の生成モデルは多変量正規分布であり、良い個体に対する尤度が最大になるよう平均と分散が更新される(英語版Wikipedia斜め読みしただけなので違うかも)。

Concept of directional optimization in CMA-ES algorithm.png
By Sentewolf (talk) (Uploads) - Transferred from en.wikipedia to Commons., Public Domain, Link

上記図は、以下ページより引用。 en.wikipedia.org