0

差分進化アルゴリズムの 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ます。非線形制約により、正の要素の数がx1000 に制限されます。

4

1 に答える 1