dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

python での遺伝的アルゴリズムによるパラメータの最適化

2022-03-19 12:35:37 | python
python で geneticalgorithm2 を用いて遺伝的アルゴリズム(GA: Genetic Algorithm)で
パラメータの最適化を試してみました。

インストール方法は以下の通りです。
numpy を利用していますので、numpy がインストールされていなければ、numpy もインストールします。
pip install numpy
pip install geneticalgorithm2


今回は、z = (x-2)(x-4)+(y-6)(y-8) を最小とする (x, y) を GA で求めてみました。
この関数の形状は以下の GeoGebra のサイトで確認することができます。
https://www.geogebra.org/3d?lang=ja
(3, 7) で最小値となります。

■プログラム
import numpy as np
from geneticalgorithm2 import geneticalgorithm2 as ga

# 最小化する関数
def f(p):
    x = p[0]
    y = p[1]
    z = (x - 2) * (x - 4) + (y - 6) * (y - 8)
    return z

# x, y のそれぞれの探索範囲
varbound = np.array([[0, 10], [0, 10]])

# パラメータ(指定しなければデフォルト)
params = {
    'max_num_iteration': 100,
    'population_size': 100,
}

model = ga(function=f,
           dimension=2,
           variable_type='real',
           variable_boundaries=varbound,
           algorithm_parameters=params
)

model.run()
convergence = model.report
solution = model.output_dict
print(solution['variable']) # x, y の最適値
print(solution['function']) # x, y の最適値での関数の値

■実行結果
 Average time of function evaluating (secs): 0.00015092323999997824
                                                                                                                                                                   
 The best found solution:
 [2.99003011 6.99942143]

 Objective function:
 -1.999900266599648

 Used generations: 101
 Used time: 0 seconds
[2.99003011 6.99942143]
-1.999900266599648

ほぼ (3, 7) が得られています。

.bash_profile での pyenv の設定内容

2022-03-19 12:16:24 | python
pyenv に関する設定は .bash_profile に以下の内容を記述します。
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"

eval "$(pyenv init --path)" を記述していなくて python が起動できませんでしたが、
これを記述したことで起動できるようになりました。

pip での No module named '_ctypes' への対処方法

2022-03-19 12:03:17 | python
pip でパッケージをインストールする際に以下のエラーが出力される場合の対処方法のメモ。
ModuleNotFoundError: No module named '_ctypes'


libffi-devel をインストールして python をインストールし直すと、このエラーは解消されます。
以下は、python-3.9.7 の場合です。
pyenv uninstall 3.9.7
sudo yum install libffi-devel
pyenv install 3.9.7