LoginSignup
2
3

More than 3 years have passed since last update.

ちょっと最適化問題が解けるplatypusを動かしてみた-その2

Posted at

前の記事の
ちょっと最適化問題が解ける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()

結果です。

platypus_2.png

まぁ、予想通りの答えです。

2
3
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
2
3