非線形制約条件付きG​Aのcrossove​rintermedi​ateに関するエラー

非線形制約条件付きのGAを用いたシミュレーションを行っていたところ,以下のエラーが表示されます.
位置 1 のインデックスが無効です。配列インデックスは正の整数または logical 値でなければなりません。
エラー: crossoverintermediate (line 47)
parent1 = thisPopulation(parents(index),:);
エラーで一時停止したところ,配列parentsの中の要素がすべて0になっており,配列thisPopulationの要素を呼び出せなくなっていました.
配列parentsの中の要素がすべて0になるのを防ぐためにはどうすればいいのでしょうか.すべてのエラー文を以下に記します.
位置 1 のインデックスが無効です。配列インデックスは正の整数または logical 値でなければなりません。
エラー: crossoverintermediate (line 47)
parent1 = thisPopulation(parents(index),:);
エラー: stepGA (line 34)
xoverKids = feval(options.CrossoverFcn, parents(1:(2 *
nXoverKids)),options,GenomeLength,FitnessFcn,thisScore,thisPopulation,options.CrossoverFcnArgs{:});
エラー: galincon (line 62)
[score,population,state] =
stepGA(score,population,options,state,GenomeLength,FitnessFcn);
エラー: gacon (line 78)
[~,Iterate.f,innerExitFlag,innerOutput,innerPopulation,innerScore] = ...
エラー: ga (line 405)
[x,fval,exitFlag,output,population,scores] = gacon(FitnessFcn,nvars, ...
エラー: optim (line 7)
[x,fval,exitflag,output,population,scores] = ga(@fun,8,[1 0 0 0 0 0 0 0; 0 1 0 0 0 0 0 0; 0 0 1 0 0 0 0 0; 0 0 0 0 1 0 0 0; 0 0 0 0 0 1 0 0; 0 0 0 0 0 0 1
0],[0.3;0.3;0.1;0.3;0.3;0.1],[],[],[0 0 0 0 0 0 0 0],[],@nonlcon,options);

11 Commenti

Kazuya
Kazuya il 18 Dic 2018
おそらく、、実行している状況に特有のエラーなので回答が難しいかと思います。エラーが発生するコードを転記(添付)可能ですか?
tsuyo0000
tsuyo0000 il 19 Dic 2018
Modificato: tsuyo0000 il 19 Dic 2018
ga関数を宣言しているoptim.mのコードが以下になります.
rng default;
type nonlcon
x0=[0.3,0.05,0.01,0.5,0.3,0.3,0.01,0.85];
options = optimoptions('ga','PopulationSize',50,'Generations',1,'MaxGenerations',1,'PlotFcns',@gaplotscores,'FitnessScalingFcn',@fitscalingprop,'Display','iter','InitialPopulationMatrix',x0);
[x,fval,exitflag,output,population,scores] = ga(@fun,8,[1 0 0 0 0 0 0 0; 0 1 0 0 0 0 0 0; 0 0 1 0 0 0 0 0; 0 0 0 0 1 0 0 0; 0 0 0 0 0 1 0 0; 0 0 0 0 0 0 1 0],[0.3;0.3;0.1;0.3;0.3;0.1],[],[],[0 0 0 0 0 0 0 0],[],@nonlcon,options);
また非線形制約条件nonlcon.mは以下です.
function [c,c_eq] = nonlcon(x)
c = 0.04-x(5)*x(6);
c_eq = 0;
end
fun.mはフィットネス関数を含むmファイルで計算結果のみをga関数に返しています.
そのフィットネス関数での計算結果自体が正しいことは確認できており,配列thisPopulationにも50個体分8変数の値が含まれています.
Aoi Midori
Aoi Midori il 19 Dic 2018
tsuyo0000さん、
横から失礼いたします。頂いたコードで、確かにエラーが再現しました。そこで、エラーの原因を細かく探ると、optimoptions()で設定されている「'InitialPopulationMatrix',x0」の処理が原因のようでした。前後のソースがtsuyo0000さんとは異なるので、一概には言えませんが、私の環境では、InitialPopulationMatrixの値を変えると(例えばx0(6)を0に変更)エラーがなくなりました。
こうすることで、tsuyo0000さんの意図通りのコードではなくなってしまう点恐縮ですが、これによって配列parentsの中の要素も0ではなくなっていたので、一解決案として記載します。
tsuyo0000
tsuyo0000 il 19 Dic 2018
エラー解析の方,ありがとうございました.
「'InitialPopulationMatrix',x0」は収束を早めるために設定しており,変更を行うこと自体は問題ありません.
ただし'InitialPopulationMatrix'を設定しない場合もこのエラーが発生してしまいます.また世代数や個体数を増減させてもエラーの有無が変わってきます.
合わせて実験してみていただけると幸いです.
Aoi Midori
Aoi Midori il 19 Dic 2018
tsuyo0000さん、
実は、私の環境でも網羅的に実験していたのですが、'InitialPopulationMatrix'を設定しない時はエラーは発生せず、また、世代数や個体数を増減させてもエラーは起きなかったのです。。
ここにあるSyntaxの、optionsを追加する前の形では全て正常動作を確認できています。
tsuyo0000
tsuyo0000 il 19 Dic 2018
実験ありがとうございました.
一つの解決策として,'InitialPopulationMatrix'の設定を行わない(収束は遅くなるが…)ことは有効なようですね.
'InitialPopulationMatrix'を設定したときのエラー原因を突き詰めてみたいと思います.ありがとうございました.
Aoi Midoriさん
初期条件を設定せずに実行してみましたが,以下のコードで同様のエラーが発生しました.原因は初期個体の設定「'InitialPopulationMatrix',x0」ではないようです…
rng(1);
type nonlcon
options = optimoptions('ga','PopulationSize',10,'Generations',5,'MaxGenerations',5,'PlotFcns',@gaplotscores,'FitnessScalingFcn',@fitscalingprop,'Display','iter');
[x,fval,exitflag,output,population,scores] = ga(@fun,8,[1 0 0 0 0 0 0 0; 0 1 0 0 0 0 0 0; 0 0 1 0 0 0 0 0; 0 0 0 0 1 0 0 0; 0 0 0 0 0 1 0 0; 0 0 0 0 0 0 1 0],[0.3;0.3;0.1;0.3;0.3;0.1],[],[],[0 0 0 0 0 0 0 0],[],@nonlcon,options);
乱数発生器はエラー発生時に再現させるために固定しています.
Aoi Midori
Aoi Midori il 21 Dic 2018
tsuyo0000
私も色々見てたのですが、いまいち原因がよくわかっていません。特に自分の場合、上記でもエラーにならないので...。
もしもう少し大きい範囲でソースを添付頂けたら、何かわかることがあるかもしれません。
Kazuya
Kazuya il 21 Dic 2018
目的関数の fun.m があれば同じ条件下でいろいろ試せるので原因を見つけるのに効率的かと思いますが、、どうでしょう。
mathWorksに問い合わせたところ,以下の回答を頂いたので共有させていただきます.optionsのスケーリング関数と初期値の設定に問題があるようです.以下の設定で解決できそうです.親身に質問にお答えいただき,ありがとうございました.
___________________________________________________________
options.FitnessScalingFcn = @fitscalingprop;
であることが原因です。
 まず、ドキュメンテーションに次のように記載しています。
Do not use 'gacreationuniform' when you have linear constraints. Otherwise, your population might not satisfy the linear constraints.
したがって、CreationFcnは、デフォルトのgacreationuniformではなく、gacreationlinearfeasibleを設定しなければなりません。
次に、与えられている初期値からは良いスコアが生成されないようです。 fitscalingpropの説明には次のように記載しています。
This strategy has weaknesses when raw scores are not in a "good range". 動作中にfitscalingprop.mのraw scoreを見ていくと、NaNが含まれており、最終出力は全てNaNになります。
options.FitnessScalingFcn = @fitscalingrank;
であればscoreにNaNが含まれていたとしても、最終出力の全てがNaNになることはありません。 どうしてもfitscalinpropで計算したいということであれば、収束するか否かについては保証の限りではありませんが、初期値設定を止めるか、他の初期値を与えることをご検討ください。 もしくは、fitscalinpropにNaNの処理を書き加え、カスタム関数として導入する方法もよいかと思われます。
Aoi Midori
Aoi Midori il 21 Dic 2018
MathWorksさんからご回答貰えたようでよかったです。ご解決おめでとうございます!また、回答の共有もありがとうございます。今後参考にさせていただきます。

Accedi per commentare.

Risposte (0)

Prodotti

Release

R2018b

Richiesto:

il 18 Dic 2018

Commentato:

il 21 Dic 2018

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!