私は、勾配ベースの突然変異アルゴリズムを使用した E-Constrained Differential Evolution (高浜、2006) を実装しています。突然変異の部分では、試行ベクトルの各制約関数の勾配を計算して、ヤコビ行列を定義する必要があります。私は有限差分によってそれをやっています。行列はmxnである必要があることを理解しています.m =制約の数とn =次元数(試行ベクトルの長さ)です。試行ベクトルの摂動は になりますpseudo-inverse_of_Jacobian x delta_C
。何が問題なのかわかりませんが、オペランドを形状 (4,5) (5,1) と一緒にブロードキャストできませんでしたというメッセージが表示されます。助けていただけますか?この乗算は 4x1 配列を生成するべきではありませんか? ありがとう。
trial = np.zeros(4)
inv_Jc = np.linalg.pinv(Jacobian(trial))
delta_C = np.array(calculate_C(trial))
delta_C = delta_C.reshape(len(delta_C),1)
trial = trial-inv_Jc*delta_C
以下に、私が解決しようとしている問題の例に関連する定義を示します。
import numpy as np
def fobj(x):
return 3*x[0]+0.000001*x[0]**3+2*x[1]+(0.000002/3)*x[1]**3
def constraints(x):
g = [-x[3]+x[2]-0.55,
-x[2]+x[3]-0.55]
h = [1000*np.sin(-x[2]-0.25)+1000*np.sin(-x[3]-0.25)+894.8-x[0],
1000*np.sin(x[2]-0.25)+1000*np.sin(x[2]-x[3]-0.25)+894.8-x[1],
1000*np.sin(x[3]-0.25)+1000*np.sin(x[3]-x[2]-0.25)+1294.8]
return np.array([max(0,g[i]) for i in range(len(g))]), np.array(h)
def calculate_C(v):
g, h = constraints(v)
return np.array([*g,*h])
def Jacobian(v,delta=0.01):
C = calculate_C(v)
Jc = np.zeros(shape=(len(C),len(v)))
for i in range(len(delta_C)):
for j in range(len(v)):
aux = np.copy(v)
aux[j] = v[j]+delta
C_plus = calculate_C(aux)[i]
aux[j] = v[j]-delta
C_minus = calculate_C(aux)[i]
Jc[i,j] = ((C_plus-C_minus)/(2*delta))
return Jc
記事のテキスト: