前の記事の
ちょっと最適化問題が解けるplatypusを動かしてみた
で、ドキュメントのDTLZ2 問題問題を動かしてみた。
でも、このドキュメントが細かく書いてないので、よくわかりません。
ちょっと簡単な問題で、どう計算されるか、動かしてみて、理解しようと思います。
minimize (x,-x)\qquad for\quad x\in[-10,10]
plotypusの例題にある問題を少し変えてます。
この問題の意味は、$x$が$-10$から$10$を取った時に、二つの関数
y=f(x)\qquad y=-f(x)
を最小にする答えは何か?という問題です。
まずimport
です。この3つでよさそうです。
from platypus import NSGAII, Problem, Real
次に多目的解の元となる関数を作ります。
def schaffer(x):return [x[0], (x[0]*(-1))]
problem = Problem(1, 2)
で、説明変数の数と目的変数の数を設定します。つまり、説明変数の$x$が一つで、目的変数が2つと言っているのだと思います。
次に
problem.types[:] = Real(-10, 10)
で、xに与える数値の型と範囲を設定します。Real
は,たぶん実数であるという宣言だと思います。
problem.function = schaffer
で、計算する関数を宣言します。schaffer
関数を問題として解くと宣言します。
algorithm = NSGAII(problem)
で、NSGAIIでproblem
で宣言してきた関数の問題を解くというインスタンスを作ります。
algorithm.run(10000)
で、10000回繰り返して計算すると設定して、計算を行います。
これが基本で、設定を変えていけば、なんとか動きそうです。
from platypus import NSGAII, Problem, Real
def schaffer(x):
return [x[0], (x[0]*(-1))]
problem = Problem(1, 2)
problem.types[:] = Real(-10, 10)
problem.function = schaffer
algorithm = NSGAII(problem)
algorithm.run(10000)
答えが出て、勝手にresult
に入っているようなので、それを取り出して、グラフを描きます。
import matplotlib.pyplot as plt
plt.scatter([s.objectives[0] for s in algorithm.result],
[s.objectives[1] for s in algorithm.result])
plt.xlim([-10, 10])
plt.ylim([-10, 10])
plt.xlabel("$f_1(x)$")
plt.ylabel("$f_2(x)$")
plt.show()
結果です。
まぁ、予想通りの答えです。