差分進化アルゴリズムの SciPy実装には変数の最大数がありますか? 私のコードは 8 つの変数を持つ問題のおもちゃバージョンで動作しますが、4000 の変数を持つ実際の問題を最適化しようとすると、目的関数に対して一貫して無限大の値が返されます。
コード (入力ファイルについては GitHubリポジトリを参照してください)
import numpy as np
from scipy.optimize import differential_evolution as de
from scipy.optimize import NonlinearConstraint as nlc
def kf(x, w, freq):
kc = x>0
kw = ~np.any(w[~kc,:], axis=0)
return -freq[kw].sum()
def cons_fun(x):
return np.sum(x>0)
def optimize(w, freq):
cons = nlc(cons_fun, -np.inf, 1000)
bnds = [np.array([-1,1]),]*w.shape[0]
res = de(kf, args=(w, freq), maxiter=1000, bounds=bnds, popsize=2, polish=False,
constraints=cons, disp=True, workers=-1, updating='deferred')
output = res.x>0
np.save('output.npy', output)
if __name__ == '__main__':
# try optimizing toy version of problem
small_w = np.load('small_w.npy')
small_freq = np.load('small_freq.npy')
optimize(small_w, small_freq)
# try optimizing actual problem
w = np.load('w.npy')
freq = np.load('freq.npy')
optimize(w, freq)
実際の問題のプログラム出力
differential_evolution step 1: f(x)= inf
differential_evolution step 2: f(x)= inf
differential_evolution step 3: f(x)= inf
...など、何百歩も
最適化問題に関する詳細情報
一般的な単語を書く能力を最大化する 1000 の漢字のセットを決定しようとしています. この配列w
は、形状が 4000 (可能な文字の数) x 30000 (単語の数) のスパース ブール マトリックスです。の要素はw
、その行に対応する文字がその列に対応する単語に含まれる場合に true です。配列freq
は、単語の頻度値を含む長さ 30000 のベクトルです。
目的関数kf
は、4000 要素の配列x
を引数として取ります。配列x
には、-1 から 1 までの値が含まれます。文字の試行セットは、 の正の要素によって決定されx
ます。非線形制約により、正の要素の数がx
1000 に制限されます。