2

Octaveの遺伝的アルゴリズムソルバーに上限と下限を尊重させるためのトリックはありますか?例えば、

options = gaoptimset('Generations', 10);
nvars = 6;
LB = ones(1,nvars);
UB = LB*10;
[soln, fval, exitflag] = ga(@fitnessfcn, nvars, [], [], [], [], LB, UB, [], options)

ソルバーは、境界が決定されていない解を返します。例えば、

soln = 0.551420   1.369775  -0.313379  -0.038621   0.274696   1.359802

更新:Octaveパッケージのスクリプトを確認しました。ga関数は上限と下限の引数を使用しないと確信しています。gaoptimセットからいくつかの上限/下限情報を読み取るようです。時間があれば遊んでみます。

4

2 に答える 2

0

バージョン0.10によると、パラメータとして渡された境界はgaほとんど無視されているようです。今のところ、境界を指定する唯一の方法は、のパラメーターPopInitRangeを使用することですgaoptimset。これには、最初の行にLBを、2番目の行にUBを含む2xNマトリックスが必要です。2x1ベクトルが提供されている場合。

LBパラメーターとUBパラメーターは、元のMatlabのga関数を模倣することになっていますが、実装は独自の方法を取っているようです。

于 2013-05-16T08:27:14.937 に答える
0

問題

ga()オクターブgaパケットの実装でパラメータ境界が使用されていないことを確認できます。

回避策

ParaOutOfRangePenaltyスコア関数内の境界をチェックし、境界に違反した場合に一定で高いペナルティスコアを与えることで、この制限を回避しました。fitnessfcn()あなたはこれをあなたの:に同様に実装することができます

% Your problem specific score calculation goes here:
score = myfitnessfcn(data,parameters);

% Add score for each parameter outside limits to create a "soft" punishment
score = score + sum(parameters(:) < lowerBound))*ParaOutOfRangePenalty;
score = score + sum(parameters(:) > upperBound))*ParaOutOfRangePenalty;

結果

ga()この方法を使用すると、オクターブアルゴリズムが境界を明確に尊重していることがわかりました。

于 2018-04-27T11:52:24.497 に答える