PYTHONによる多目的最適化プログラム例
2022-04-17


禺画像]
PYTHONはいろいろなところで使われているが、なかなか概念が理解できない。関数、オブジェクト、クラスなど抽象的な対象物がプログラム言語化されるので、用語の相対関係、引用、参照関係がプログラムリストから読み取れないのである。しかし、データ処理機能のパッケージ化が世界中で行われているので、それを利用すれば簡単に高度なデータ処理ができる。
 下記は、多目的最適化の例(目的関数2個,制約関数1個,設計変数3個)を3次元グラフ表示できるようにしたものである。
 ただし、下記コードでは、アサブロの改行ルールの影響を受け、PYTHON文の各行の頭のブランクが削除される。このため、本コードをPYTHONで流す前に、Def行およびFor行に続く行(#行又はブランク行が現れる範囲)の頭に半角ブランクを4桁入力する必要がある。(2022.5.6改良版アップ)
(なお、PYTHON及びJUPYTER NOTEBOOKのインストールはネット情報を用いている。)

#0506-一般化PYTHONN14-27ケースサーベイエクセル回帰3D棒グラフColorZ.txt
#[URL]
#日本語グラフ表示フォント利用版
from platypus import NSGAII, Problem, Real, nondominated
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
#行数無制限指定forNotebook
from IPython.core.display import display, HTML

display(HTML("<style>div.output_scroll { height: unset; }</style>"))
np.random.seed(0)

#%matplotlib inline
#3次元グラフパレート解+回転可能
#%matplotlib tk
%matplotlib notebook

# 目的関数 by 0409ケースサーベイエクセル回帰
#x1:設計変数1
#x2:設計変数2
#x3:設計変数3
def objective(vars):
x1 = vars[0]
x2 = vars[1]
x3 = vars[2]
f1 = 0.001284257*x1 -0.004223327*x2 +9.943736814*x3 -9.502343321 #設計変数1
f2 = 0.073949761*x1 -0.006730252*x2 +5.427614607*x3 -7.110353214 #設計変数2
v1 =0.000652886*x1 +0.000100475*x2 +0.340144444*x3 +0.618259667 #制約関数
return [f1, f2], [v1]

# 最適化計算を実行する関数
def optimization(n_var, n_obj, n_con, vars, n_run):
# 設計変数と目的関数の数を設定
problem = Problem(n_var, n_obj, n_con)
# 最適化計算の条件
problem.directions[0] = Problem.MINIMIZE
problem.directions[1] = Problem.MINIMIZE
problem.constraints[:] = ">=1.002"
# 設計変数と目的関数を設定
problem.types[:] = vars
problem.function = objective
# 最適化アルゴリズムを設定して計算を実行する
algorithm = NSGAII(problem)
algorithm.run(n_run)

return algorithm

# 変数を設定する
var1 = Real(0., 30.)
var2 = Real(0., 60.)
var3 = Real(1.00, 1.20)
vars = [var1, var2, var3]

# 最適化計算を実行する
algorithm = optimization(n_var=3, n_obj=2, n_con=1, vars=vars, n_run=3000)

# ここからグラフ描画
# フォントの種類とサイズを設定する。日本語用にMS Gothicを設定した。
plt.rcParams['font.size'] = 14
plt.rcParams['font.family'] = 'MS Gothic'

# グラフの入れ物を用意する。
fig1 = plt.figure(figsize=(2,2))
ax1 = fig1.add_subplot(222,projection='3d')
ax2 = fig1.add_subplot(223,projection='3d')
ax3 = fig1.add_subplot(224,projection='3d')
ax4 = fig1.add_subplot(221)
# 軸のラベルを設定する。
ax1.set_xlabel('目的関数1')
ax1.set_ylabel('目的関数2')
ax1.set_zlabel('設計変数1)
ax2.set_xlabel('目的関数1')
ax2.set_ylabel('目的関数2')
ax2.set_zlabel('設計変数2')
ax3.set_xlabel('目的関数1')
ax3.set_ylabel('目的関数2')
ax3.set_zlabel('制約関数1')
ax4.set_ylabel('目的関数1')
ax4.set_xlabel('目的関数2')

# 軸の最大値・最小値の設定
ax1.set_xlim(1.5, 0.5)
ax1.set_ylim(-1.5, 0.5)
ax1.set_zlim(0.0, 30.0)
ax2.set_xlim(1.5, 0.5)
ax2.set_ylim(-1.5, 0.5)
ax2.set_zlim(0.0, 60.0)
ax3.set_xlim(1.5, 0.5)
ax3.set_ylim(-1.5, 0.5)
ax3.set_zlim(1.0, 1.1)

続きを読む

[IT]
[私家版物理]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット