最適化の前に３次元のグラフの書き方

##DEAPにある最適化アルゴリズムのグラフの書き方です。

最適化の前に３次元のグラフの書き方です。

まず、どんな３次元のグラフが描きたいかと言うと、DEAPという遺伝的アルゴリズムのライブラリーにある評価関数です。
多目的最適化を検討したいので、どうしても３次元のグラフ描いた方がわかりやすそうなので、まずは３次元のグラフの書き方です。

最適化の評価関数はこの辺を参照してください。
[DEAP 1.3.1ドキュメント](https://deap.readthedocs.io/en/master/api/benchmarks.html?highlight=test%20functions)
[だれでも分かる多目的最適化問題超入門](https://qiita.com/sp4ghet/items/f3dfbfe24b0a9c4997ee)

三次元のグラフを描くためには、まず、X1、x2の２つの軸で、メッシュ状に点をつくる。
その点に、ｚ軸の値を計算する。
x1、x2、Zの値をAxes3Dで３次元のグラフを描きます。

###1)メッシュ状の点を作る。
1:`numpy` の`arange`関数で、等間隔の数値を作る。
  `np.arange(-30,30,1)`　a-30から30まで、１ずつ間を空けた数値ができます。
2:`meshgrid(a,b)`で一次元配列のa,bの交点に格子点が得られ、それをX1,X2に入れます。


```python
#メッシュの作り方
import numpy as np
a = np.arange(-30,30,1)
b = np.arange(-30,30,1)
print(a)
#[-30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13
# -12 -11 -10  -9  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5
#   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23
#  24  25  26  27  28  29]

print(b)
#[-30 -29 -28 -27 -26 -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13
# -12 -11 -10  -9  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5
#   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23
#  24  25  26  27  28  29]

X1, x2 = np.meshgrid(a, b)

print(X1)
#[[-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]
# ...
# [-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]]

print(X2)
#[[-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]
# ...
# [-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]
# [-30 -29 -28 ...  27  28  29]]

import matplotlib.pyplot as plt
plt.scatter(X1,X2,s=1)
plt.show()
```
確認のために、X1,X2の２次元の散布図を描いてみると、次のようになりました。
![scatter_Figure 2020-08-30 161126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/1eee0224-e49e-ea2d-3ec6-89c3fda2cfa0.png)

ちゃんとメッシュになっています。
次にＺ軸の値を計算して、３次元のグラフを作ります。
3:Zは、Ackley関数なるものを計算しました。
数式

```math
{f(x_{1}, x_{2})=20-20\exp \biggl( -0.2\sqrt{\frac{1}{n}\sum_{i=1}^{n}x_{i}^2} \biggr) +e-\exp \biggl(\frac{1}{n}\sum_{i=1}^{n}\cos(2\pi x_{i}) \biggr)
}
```
とりあず、X1,Zでプロットすると、次のようなグラフになります。
![x1_z_Figure 2020-08-30 162742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/03e55fba-f4c2-be19-bb71-27c5d3d96690.png)


###２）3次元のグラフを作る

4:3次元のグラフを描きます。
`from mpl_toolkits.mplot3d import Axes3D`で３次元のグラフを描くライブラリーをインポートします。
`ax.plot_wireframe(X1, X2, Z)`で、３次元のグラフになります。

`plot_surface`:面で表示されます。
![surfaceFigure 2020-08-30 163457.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/0d19b2f5-4d61-846e-8850-e966f570b6f9.png)


`plot_wireframe`:ワイヤーフレームで表示されます。
![wireflameFigure 2020-08-30 163108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/fa96b89b-4be1-c27c-708a-c04081e5cd2e.png)

```python
Z =20 - 20 * np.exp(-0.2 * np.sqrt((X1 ** 2 + X2 ** 2) / 2)) + np.exp(1) - np.exp((np.cos(2 * np.pi * X1) + np.cos(2 * np.pi * X2)) / 2)

plt.scatter(X1,Z,s=1)
plt.show()


from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

#ワイヤーフレームで表示
ax.plot_wireframe(X1, X2, Z)
#面で表示
#ax.plot_surface(X1, X2, Z, rstride=1, cstride=1, cmap='hsv')

plt.show()
```